моя переменная GET экранируется? - PullRequest
4 голосов
/ 19 августа 2010

Я действительно запутался здесь, кто-нибудь может мне это объяснить?

Запрос: http://example.com/test.php?var=String's

$a = $_GET["var"];
$b = "String's";

echo $a . "<br/>";
echo $b . "<br/>";

$output = mysql_real_escape_string($a);
$output = mysql_real_escape_string($b);
echo "<hr/>";
echo $a . "<br/>";
echo $b . "<br/>";

результат:

String\'s
String's
----------------
String\'s
String's

Может ли кто-нибудь объяснить мне не только, почему моя переменная GET преобразуется таким образом, но как я могу удалить это поведение так, чтобы мой ввод был в точности таким, как он был отправлен? У меня возникла проблема, когда моя оболочка SQL проходит это через mysql_real_escape_string () и в итоге получается String\\\'s: (

Ответы [ 3 ]

6 голосов
/ 19 августа 2010

Это называется "магические цитаты" .

2 голосов
/ 19 августа 2010

Вы можете и должны отключить магические кавычки.


предпочтительный режим
установите их в php.ini


.htaccess режим
добавить это в файл htaccess

php_flag magic_quotes_gpc off


Режим работы PHP5

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_gpc(&$value)
    {
        $value = stripslashes($value);
    }
    array_walk_recursive($_GET, 'stripslashes_gpc');
    array_walk_recursive($_POST, 'stripslashes_gpc');
    array_walk_recursive($_COOKIE, 'stripslashes_gpc');
    array_walk_recursive($_REQUEST, 'stripslashes_gpc');
}
?>


Режим работы PHP4

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>


Добро пожаловать в клуб ненавистников magic_quotes! :)

0 голосов
/ 19 августа 2010

Возможно, у вас включены магические кавычки. Это автоматически экранирует данные GET, POST и COOKIE. Магические кавычки - это плохо, и на них нельзя полагаться для правильного экранирования данных.

Если у вас есть доступ к php.ini, вы можете отключить магические кавычки .

Если вы этого не сделаете, вы можете запустить stripslashes на данных, чтобы удалить косую черту. Чтобы сделать ваш код переносимым, вы должны сначала проверить get_magic_quotes_gpc(), чтобы увидеть, включен ли он, и только потом запускать полоски. Таким образом, если вы переместите свой код на сервер, у которого отключены магические кавычки, ваш код все равно будет работать.

if(get_magic_quotes_gpc()) {
    $a = stripslashes($_GET["var"]);
}
else $a = $_GET["var"];
...