Сегодня я столкнулся с некоторой странностью с PHP, и я не нашел правильного объяснения в документации. Рассмотрим следующий код:
<?php echo $_GET['t']. PHP_EOL; ?>
Код прост – он принимает один параметр t на url и выводит его обратно. Поэтому, если вы вызываете его с помощью test.php? T =% 5Ca (% 5c является «\»), я ожидал увидеть:
\a
Однако это то, что я получил:
$ curl http://localhost/~boaz/test.php?t=%5Ca \\a
Обратите внимание на двойную косую черту. Может ли кто-нибудь объяснить, что происходит, и дать рецепт для извлечения строк, как он был указан по URL-адресу?
Спасибо, Боаз
PS. Я использую PHP 5.2.11
Это происходит, потому что вы включили переключатель «magic quotes» в php.ini. Из руководства:
Когда включено, все «(одинарная кавычка)», «двойная кавычка», \ (обратная косая черта) и символы NULL автоматически сбрасываются с обратным слэшем. Это идентично тому, что делает функция addslashes ().
Подробнее об этом читайте здесь: http://php.net/manual/en/security.magicquotes.php
Чтобы ваш скрипт знал о любом значении параметра «magic_quotes_gpc» в php.ini, вы можете написать свой скрипт следующим образом:
$d = $_GET["d"]; if (get_magic_quotes_gpc()) $d = stripslashes($d); echo $d; //but now you are kind of vulnerable to SQL injections //if you don't properly escape this value in SQL queries.
Вы можете легко исправить это, используя функцию strip_slashes (). Вам следует избегать магических цитат; они были устаревшими по соображениям безопасности.
открыть файл .htaccess и поместить что-то вроде этого
php_flag magic_quotes_gpc off php_flag magic_quotes_runtime off