2011-04-27 70 views
1

考虑a.php只会:PHP会自动转义GET或POST传递的字符串中的引号吗?

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

a.php?a=abcd'打印abcd\'

我认为PHP自动转义引号,但是我找不到关于此的文档。

这是真的吗?因为我想确保 - 我很懒,所以我没有阻止我的PHP源代码中的SQLI ..

+1

magic_quotes的目的不是为安全功能,而仅仅是为了使SQL工作开箱。 [(1)](http://www.php.net/manual/phpfi2.php#msql_support)由于意外,它在PHP2/PHP3周围是安全的,因为大多数使用的数据库不适用于多字节字符集。但除非你确保你的应用程序/数据库连接只接收ASCII,否则你将不得不适应这种情况。 – mario 2011-04-27 09:37:27

回答

3

取决于是否在Onmagic_quotes_gpc或不上你的php.ini配置文件。

这个配置指令被引入来帮助开发者保护自己免受攻击,如果你不知道他们是什么,我建议你非常仔细地阅读维基百科条目。

的事情是,relying only on magic_quotes is insecure and unpredictable,而这一功能也将在未来的PHP版本删除,以确保针对SQL注入的最佳方式是要么使用准备好的语句(与PDOMySQLi),或使用特定避开功能为您数据库:

然而,我f magic_quotes已打开,并且您尝试逃离输入数据的机会是您将得到一个双转义字符串(这不好),为了对抗此行为,我们通常会检测magic_quotesOn,如果是,则删除添加的斜杠通过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,the PHP Manual has a fairly good snippet too

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); 
} 
+0

我认为你的第一个编码块不必要的慢,也是无法解释的。 JSON编码和解码加正则表达式并不是特别快。从手册来看,第二种解决方案更加简洁(恕我直言),并且不会混淆奇怪的黑客。 – 2011-04-27 10:37:12

+0

@Emil:我不认为它是无法解释的......带有JSON_HEX_APOS和JSON_HEX_QUOT标志的'json_encode()'确保单引号和双引号都被转义,因为控制字符也被转义了,所以我们使用正则表达式来添加一个额外的斜杠,然后通过'stripslashes()'移除多余的,然后'json_decode()'应该将超级全局键和值解码回数组。至于速度,我还没有测试过,但现在JSON函数非常快,如果有什么重大区别,我会很惊讶。 – 2011-04-27 10:53:21

0

也许,也许不是。 Magic Quotes是一个配置选项。它应该被关闭。

我很懒惰,所以我并没有阻止SQLI在我的PHP源代码..

魔术引号是不够的,适当防止SQL注入。停止懒惰,开始使用绑定参数。

3

如果magic_quotes_gpc在配置中处于活动状态,PHP会执行此操作。此功能已被弃用,并将在未来消失。在编写新代码时依赖于不推荐使用的功能并不好(实际上,这完全是愚蠢的)。

请注意,魔术引号不足以防止SQL注入,因为它不能正确处理所有字符集。我建议您使用invert the magic quoting,并使用mysql_real_escape_string(或其他数据库扩展中的类似代码)。

+2

+1您也可以尝试在您的.htaccess文件中添加'php_flag magic_quotes_gpc Off'来关闭此功能(对于.htaccess所在的特定目录)。你也可以在php.ini或httpd.conf中关闭它,如果你有权访问那些(在这种情况下,它将在整个服务器上关闭)。 – kapa 2011-04-27 09:42:30

1

需要更新您的代码,以便正确转义您的SQL输入。或者甚至更好,使用PDO,以便可以将查询参数与查询分开传递。

虽然PHP有magic_quotes_gpc默认情况下它被禁用,并且将在PHP6中删除。除此之外,这是一个可怕的混乱,导致潜在的不安全或错误的代码,因此,如果get_magic_quotes_gpc()true删除自动添加报价更好。

相关问题