2013-05-31 60 views
-1

我的mysql_real_escape_string PHP文档页面上阅读此评论:逃逸cookie值以防止SQL注入

也不要忘记查询数据库之前转义$ _COOKIE数组。在Firefox中,您可以编辑Cookie并插入并注入有害的SQL查询。

<?php 
    foreach ($_COOKIE as $key => $value) { 
    if(get_magic_quotes_gpc()) $_COOKIE[$key]=stripslashes($value); 
    $_COOKIE[$key] = mysql_real_escape_string($value); 
    } 
?> 

我是正确的思维我只有这样做,如果我在查询中使用这些cookie值?因此,如果没有sql语句使用这些cookie的值,那么不需要像上面那样转义cookie?

我使用的mysql_query不准备语句(该公司所有室内代码我与用途的mysql_query工作)

+0

这将是一个毫无意义的操作。 strip_slashes和mysql_real_escape_string是** NOT **彼此反转,并且此代码可能会双/三/.../ N次转义数据,每次运行。您只能在查询中立即使用/引用要立即使用的数据,而不是“可能稍后”,然后您不会用引用的版本覆盖原始数据。 –

回答

2

你只需要一次记住这个概念:当您连接一个字符串转换成一个特殊的文本格式,需要根据在级联的时刻,格式逃脱它。价值从何而来并不重要。在连接它们之前或之后,您不会将值转义,但当您做时。你不会仅仅因为掩盖逃脱你的cookie值。当你将它放入SQL查询的时候,你就想逃避一个值。饼干没有特殊情况;提醒需要在那里已经够难过了。

您的代码始终是:

$sql = sprintf("SELECT ... WHERE foo = '%s'", mysql_real_escape_string($var)); 

这不是:

$var = mysql_real_escape_string($var); 

// 100 lines of irrelevant code 

$sql = "SELECT ... WHERE foo = '$var'"; 

The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

0

难道我就在思考我只有当我在使用这些cookie的 值做到这一点查询?因此,如果没有sql语句使用来自这些 cookie的值,那么不需要像上面那样转义cookie?

是的,当然;)

我使用的mysql_query不准备语句(所有 点播服务公司代码,我与用途的mysql_query工作)

尝试进行迁移准备语句与PDO或mysqli

如果您无法迁移:请注意,您必须建立mysql连接之前你叫mysql_real_escape_string()!这是因为该函数使用当前的连接编码来正确地转义字符串。如果您之后连接,则转义可能是错误的。

2

我是否正确思考我只需要这样做,如果我在查询中使用这些cookie值?

是...... ish。

你不应该用只适合填充MySQL查询的数据覆盖超全局变量。在最后一刻和本地变量中进行转义。

无论如何还有better ways to defend against SQL injection然后变量转义。

我使用的mysql_query不准备语句(所有公司室内代码我与用途的mysql_query工作)

我建议首先迁移过程。如果您想要升级到未包含已废弃库的未来版本的PHP,则必须一次性完成所有操作,这样做会更轻松。

1
  1. 是的,你是正确的,这只是在数据库查询中使用它们时才需要的。
  2. 不,你绝对不应该在全球做全部饼干。
  3. 不,你不应该在SQL查询中连接cookie值,使用预准备语句。
  4. mysql_real_escape_string已弃用其整个家庭的mysql_功能自PHP 5.5以来。改为使用PDO或MySQLi。并使用它们的准备语句来删除有关SQL注入的所有疑虑。
  5. 您可以编辑的Cookie,每浏览器,而不仅仅是Firefox。
0

这个提醒是告诉你,即使你自己设置它们,你也不能相信你从cookies获得的值,因为任何人都可以改变它们。所以,是的。

当然,你不应该使用mysql_函数和所有这些,但我认为你知道(也必须在较旧的应用程序中使用它们)。