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"


PHP Безопасность просмотров: 81