1

如果我magic_quotes打开并使用mysql_real_escape_string,字符串会被双重转义吗?会不会造成问题?

我假设是基于get_magic_quotes()功能但只是寻求确认。

(PS 提出这个问题比在我的办公室用我们所拥有的所有安全措施测试它更容易——我需要 10 到 15 分钟来配置所有东西以获得可用的环境)

4

4 回答 4

4

阅读文档mysql_real_escape_string(我希望这也不难):

注意:如果magic_quotes_gpc启用,首先应用stripslashes()到数据。对已经转义的数据使用此函数将两次转义数据。

于 2010-04-22T06:04:48.160 回答
3

如果您对从 get/post/cookie 输入中获得的值进行转义,它将已经addslashes()应用到它,因此传递它mysql_real_escape_string()实际上是双引号。

剥离 em:

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_gpcPHP '功能'。

于 2010-04-22T06:04:16.023 回答
1

当然,最简单的方法是关闭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']);
}

最简单的之一

于 2010-04-22T06:29:15.533 回答
0

如果我打开了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;
}
于 2010-04-22T06:09:03.410 回答