Тема: Task #8
Показать сообщение отдельно

  #15  
Старый 28.09.2019, 19:47
crlf
Постоянный
Регистрация: 18.03.2016
Сообщений: 663
С нами: 5344886

Репутация: 441


По умолчанию

Представилась возможность более плотно поковырять эту фичу, поэтому могу тоже немного поделиться своими ислледованиями.

PHP_SESSION_UPLOAD_PROGRESS как и задумано, исправно мониторит прогресс загрузки файла от клиента на сервер, скидывая данные в файл сессии для дальнейшей (возможной) обработки. Поэтому, как верно заметил @dooble, если файл большой, то время жизни "полезного" файла будет увеличиваться и тогда есть 100% шансы выйграть эту гонку за пару запросов.

Но нам так же ничего не мешает, растянуть передачу маленького файла на большой промежуток времени. Поэтому, осмелюсь предположить, что вот эти странные явления:

Цитата:
Сообщение от dooble  

файл сессии не очищался еще продолжительное время после окончания работы скрипта загрузки
Цитата:
Сообщение от Gorbachev  

Т.е. данным кодом, который я посылал с одного сервера на сервер своей VPS, я видел гарантированное срабатывание, создание, и подхватывание сессии. А вот попробовав откуда-то ещё послать такой же запрос на свою VPS - уже не срабатывает.
Цитата:
Сообщение от Gorbachev  

полагаю, тут имеют место быть "тайминги", т.е. по микросекундам с двух серверов было идеальное совпадение
ничто иное как подвисший или медленный коннект.

Вполне нормальный, жизненный кейс, когда у клиента замедлился интернет, ведь по сути для этого и нужен отображаемый прогресс загрузки, чтоб было веселей ждать

В общем, немного пошаманив, пришёл к такому варианту, где не досылается последний байт:

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"]= ([/COLOR][COLOR="#0000BB"]$ssl[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#DD0000"]'
ssl://'[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"\r\n"[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$payload[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Disposition: form-data; name="file"; filename="tricky_file.is"'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Type: text/plain'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]str_repeat[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'A'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]1024[/COLOR][COLOR="#007700"]*[/COLOR][COLOR="#0000BB"]1000[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx--'[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'POST '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$path[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]' HTTP/1.1'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Type: multipart/form-data; boundary=---------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:56.0) Gecko/20160101 Firefox/56.0'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Host: '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$host[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Cookie: PHPSESSID='[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$session_name[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Length: '[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"])).[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Connection: close'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]$fp[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]stream_socket_client[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]$host[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#DD0000"]':'[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]443[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]80[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]$errno[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$errstr[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]30[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]fwrite[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$fp[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"]) -[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]));
print[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'Session file name is: sess_'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$session_name[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'Hurry up :)'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]sleep[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]1000[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]?>
[/COLOR][/COLOR] 
Никаких гонок при этом нет, файл лежит очень долго. По моим наблюдениям, до обрыва соединения, т.к. ждать больше получаса не хотелось По хорошему, этот "плохой" коннект должен обрываться по таймауту и возможно тут присутствует задел на развитие/усиление DOS, но это не в кассу.

Вариант получился сильно похожий на решение от @nix_secutiry, но уже в более универсальном варианте. Который будет удерживать файл, столько, сколько потребует ваш вектор.
 
Ответить с цитированием