Я хотел бы знать, почему, если я вставлю в свой сценарий $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
Это не имеет ничего общего с безопасностью, но с тем, как строки обрабатываются в 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
Других решений пока нет …