Удаление нулевого байта в переполнении стека

Я хотел бы знать, почему, если я вставлю в свой сценарий $text = str_replace("\0", "", $text); ничего не происходит, когда я вызываю URL следующим образом:

http://www.example.com/download.php?text=\ 0

в то время как если я положу $text = str_replace('\0', '', $text); \ 0 будет удалено … пожалуйста, объясните мне два различия … Я хорошо знаю, что с php 5.3.4 эта дыра в безопасности была исправлена, но, возможно, что-то может быть передано злоумышленником на другие серверы, на которых работает php 5.3 или минус.

Мой вопрос связан с тем, что я хочу сопоставить нулевой байт с str_replace и удалить его из моей строки var … по соображениям безопасности.

С помощью $text = str_replace("\0", "", $text); Я предотвращаю нулевую атаку байтов? Благодарю.

PS: я запускаю php 5.6.17 на CentOS … с Apache 2.4

2

Решение

Это не имеет ничего общего с безопасностью, но с тем, как строки обрабатываются в php:

  • строки в двойных кавычках оцениваются
  • строки в одинарных кавычках не оцениваются

\ является escape-символом, поэтому следующий символ экранирован.

Чтобы сопоставить его в строке, заключенной в двойные кавычки, необходимо добавить дополнительный обратный слеш: \\0

Редактировать:

Вы говорите «Удаление нулевого байта в php», а затем «в то время как я помещаю $ text = str_replace (‘\ 0’, », $ text); \ 0 будет удален ».

Это означает, что в вашей строке нет нулевого байта, но обратная косая черта с последующим нулем (≈ rapresentation нулевого байта).

Примеры:

echo strlen( 'http://www.example.com/download.php?text=' );     // output: 41
echo strlen( "http://www.example.com/download.php?text=\0" );   // output: 42 (Null)
echo strlen( 'http://www.example.com/download.php?text=\0' );   // output: 43

echo strlen( '\0' );                                            // output: 2
echo strlen( "\0" );                                            // output: 1  (Null)

А также:

echo strlen(trim( "http://www.example.com/download.php?text=\0" ));

будет выводить, 41, так как trim удаляет нулевой байт

echo strlen(trim( 'http://www.example.com/download.php?text=\0' ));

будет выводить, 43, так как trim не удаляет \0

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector