Зависит от того, 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);
}