Intereting Posts

Почему _GET в PHP неправильно декодирует косую черту?

Сегодня я столкнулся с некоторой странностью с 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