Если у меня включен magic_quotes
и я использую mysql_real_escape_string
, будет ли строка двойным с экранированием? Это вызовет проблемы?
Я предполагаю, что это основано на функции get_magic_quotes()
но просто ищет подтверждение.
(PS Легче задавать этот вопрос, чем тестировать его в моем офисе со всей имеющейся у нас защитой – мне нужно 10-15, чтобы настроить все, чтобы получить полезную среду)
Если вы выберете значение, полученное из ввода get / post / cookie, у него уже будет применено приложение addslashes()
, поэтому передача его через mysql_real_escape_string()
будет фактически двойной котировкой.
Чтобы раздеть их:
if (get_magic_quotes_gpc()) { $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true); $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true); $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); ini_set('magic_quotes_gpc', 0); }
У этого вопроса есть некоторые другие варианты удаления цитат / работы с ужасной функцией magic_quotes_gpc
PHP.
Прочтите документацию mysql_real_escape_string
(надеюсь, это тоже не сложно):
Примечание. Если
magic_quotes_gpc
включен, сначала применитеstripslashes()
к данным. Использование этой функции для данных, которые уже были экранированы, приведет к двойному удалению данных.
Конечно, самый простой способ – отключить magic_quotes.
с обычной конфигурацией PHP / Apache, эта строка
php_flag magic_quotes_gpc 0
в файле .htaccess
будет делать что-то.
но для цели совместимости функция также может использоваться в некоторых конфигурационных файлах.
if ( get_magic_quotes_gpc( ) ) { $_GET = array_map_recursive('stripslashes', $_GET) ; $_POST = array_map_recursive('stripslashes', $_POST) ; $_COOKIE = array_map_recursive('stripslashes', $_COOKIE) ; $_REQUEST = array_map_recursive('stripslashes', $_REQUEST) ; if (isset($_SERVER['PHP_AUTH_USER'])) stripslashes($_SERVER['PHP_AUTH_USER']); if (isset($_SERVER['PHP_AUTH_PW'])) stripslashes($_SERVER['PHP_AUTH_PW']); }
один из самых простых
Если у меня включен magic_quotes, и я использую mysql_real_escape_string, будет ли двойное экранирование траншей?
Да, это будет, но вы могли бы сделать что-то вроде этого, хотя:
if (get_magic_quotes_gpc()) { $escaped = stripslashes($your_vars); }
Примечание. Вы можете отключить магические кавычки из PHP.ini или использовать следующую функцию, чтобы переопределить ее:
// no more magic quotes function get_magic_quotes_gpc() { return false; }