Почему _GET в PHP неправильно декодирует косую черту? - PullRequest
2 голосов
/ 15 марта 2010

Сегодня я сталкиваюсь с некоторыми странностями с 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

Ответы [ 3 ]

6 голосов
/ 15 марта 2010

Это происходит потому, что в php.ini у вас включен переключатель «магические кавычки». Из руководства:

Когда включено, все '(одинарные кавычки), " (двойная кавычка), \ (обратная косая черта) и NULL символы экранированы с обратная косая черта автоматически. Это идентично тому, что делает addlashes ().

Подробнее об этом здесь: 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.
0 голосов
/ 15 марта 2010

открыть файл .htaccess и поставить что-то вроде этого

php_flag magic_quotes_gpc off
php_flag magic_quotes_runtime off 
0 голосов
/ 15 марта 2010

Вы можете легко исправить это, используя функцию strip_slashes (). Вы должны избегать магических кавычек; по соображениям безопасности они устарели.

...