PHP: Защита от CRLF внедрения через пользовательский ввод
Обработка пользовательских данных для предотвращения изменения HTTP-сообщения с помощью спецсимволов возврата каретки и подачи строки - перевода строки (carriage return line feed или crlf). В качестве примера передаём GET параметр value, который содержит %0D
(\n) и %0A
(\r), а также тестовую полезную нагрузку newHeaders.
test.php?value=%0d%0anewHeaders
Данные без обработки переводят полезную нагрузку на новую строку
echo '<pre>', var_dump( $_GET['value'] ) ,'</pre>'; # > string(12) " # > newHeaders"
Очистить данные можно заменой по регулярному выражению или по прямому вхождению:
echo '<pre>', var_dump( preg_replace( "/[^\\S ]/", '', $_GET['value'] ) ) ,'</pre>'; # > string(10) "newHeaders" echo '<pre>', var_dump( str_replace( [ "\r\n", "\n", "\r" ], '', $_GET['value'] ) ) ,'</pre>'; # > string(10) "newHeaders"
Можно использовать функцию trim. Если второй параметр не передан, trim() удаляет следующие символы:
- " " (ASCII 32 (0x20)), обычный пробел
- "\t" (ASCII 9 (0x09)), символ табуляции
- "\n" (ASCII 10 (0x0A)), символ перевода строки
- "\r" (ASCII 13 (0x0D)), символ возврата каретки
- "\0" (ASCII 0 (0x00)), NUL-байт
- "\v" (ASCII 11 (0x0B)), вертикальная табуляция
echo '<pre>', var_dump( trim( $_GET['value'] ) ) ,'</pre>'; # > string(10) "newHeaders"
Комментарии