PHP автоматически экранирует кавычки в строке, которая передается GET или POST? - PullRequest
1 голос
/ 27 апреля 2011

Рассмотрим a.php:

<?php
 echo $_GET['a'];
?>

a.php?a=abcd' отпечатки abcd\'.

Я думаю, что PHP автоматически экранирует кавычки, но я не смог найти документ об этом.

Это правда? Потому что я хочу убедиться - я довольно ленив, поэтому я не запретил SQLI в моих исходных кодах PHP ..

Ответы [ 5 ]

3 голосов
/ 27 апреля 2011

Зависит от того, magic_quotes_gpc в On или нет от вашего php.ini файла конфигурации.

Эта директива конфигурации была введена, чтобы помочь разработчикам обезопасить себя от SQL-инъекций атак. Если вы не знаете, что это такое, я советую вам внимательно прочитать статью в Википедии.

Дело в том, что полагаться только на magic_quotes небезопасно и непредсказуемо , и эта функция также будет удалена в будущих версиях PHP, лучший способ обезопасить себя от SQL-инъекций - использовать подготовленные операторы. (с PDO или MySQLi ) или используйте специальную функцию экранирования для вашей базы данных:

Однако, если magic_quotes включен, и вы пытаетесь избежать ваших входных данных, есть вероятность, что вы получите двойную экранированную строку (что не очень хорошо), для противодействия этому мы обычно обнаруживаем, если magic_quotes равен On и, если это так, удалите добавленные косые черты с помощью stripslashes().

Некоторые делают это до вызова экранирующей функции / метода базы данных, но лично я предпочитаю делать это при загрузке страницы, так как это сделает данные намного более согласованными и менее подверженными ошибкам, если вы используете PHP 5.3+, то ниже фрагмент должен отключить magic_quotes:

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
}

Если вы используете более старую версию PHP, Руководство по 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);
}
3 голосов
/ 27 апреля 2011

PHP делает это, если magic_quotes_gpc активно в конфигурации. Эта функциональность устарела и исчезнет в будущем. Нехорошо (на самом деле, это совершенно глупо) полагаться на устаревшую функциональность при написании нового кода.

Обратите внимание, что магических кавычек недостаточно для защиты от SQL-инъекций , поскольку он не обрабатывает все наборы символов правильно. Я рекомендую вам инвертировать магическое цитирование и использовать вместо него mysql_real_escape_string (или аналогичный в других расширениях базы данных).

1 голос
/ 27 апреля 2011

Вам необходимо , чтобы обновить ваш код для правильного экранирования ввода SQL. Или, что еще лучше, используйте PDO, чтобы можно было передавать аргументы запроса отдельно от запроса.

Хотя PHP имеет magic_quotes_gpc, он по умолчанию отключен и будет удален в PHP6. Кроме того, это ужасный беспорядок, приводящий к потенциально небезопасному или неисправному коду, и поэтому лучше удалить автоматически добавленные кавычки, если get_magic_quotes_gpc() равно true.

0 голосов
/ 27 апреля 2011

mysqli_real_escape_string () - хорошее начало

0 голосов
/ 27 апреля 2011

Может быть, а может и нет. Magic Quotes - это опция конфигурации.Он должен быть отключен.

Я довольно ленив, поэтому я не запретил SQLI в моих исходных кодах PHP ..

Магических кавычек недостаточноправильно защитить от внедрения SQL.Перестаньте лениться, начните использовать связанные параметры.

...