-1

mysql_real_escape_string我在php 文档页面上阅读了此评论:

也不要忘记在查询数据库之前转义 $_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)

4

5 回答 5

2

如果我在查询中使用这些 cookie 值,我是否认为我只需要这样做?

是的……嗯。

您不应该使用仅适合填充 MySQL 查询的数据覆盖超全局变量。在最后一分钟转义到局部变量。

无论如何,有更好的方法来防御 SQL 注入然后变量转义。

我正在使用 mysql_query 未准备好的语句(我正在使用的所有内部公司代码都使用 mysql_query)

我建议开始迁移过程。当您想升级到没有弃用库的未来版本的 PHP 时,一次性完成所有操作将不会那么痛苦。

于 2013-05-31T14:09:01.830 回答
2

您只需要记住这个概念一次:每当您将一个字符串连接成一种特殊的文本格式时,您需要在连接时根据该格式对其进行转义。这个价值从何而来并不重要。您不会在连接它们之前或之后转义值,而是您这样做的时候转义。您不会仅仅因为逃避您的 cookie 值。当您将要放入 SQL 查询的值时,您将其转义。Cookie 不是特殊情况;很遗憾,提醒需要在那里。

您的代码始终是:

$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'";

阅读伟大的逃避现实(或:使用文本中的文本需要知道的内容)

于 2013-05-31T14:09:29.213 回答
1
  1. 是的,您正确地假设仅在数据库查询中使用它们时才需要这样做。
  2. 不,您绝对不应该对所有cookie 全局执行此操作。
  3. 不,无论如何你都不应该在 SQL 查询中连接 cookie 值,使用准备好的语句。
  4. mysql_real_escape_stringmysql_自 PHP 5.5 以来,它的整个函数家族都已弃用。改用 PDO 或 MySQLi。并使用他们对准备好的语句的便利,以消除对 SQL 注入的所有担忧。
  5. 您可以在每个浏览器中编辑 cookie ,而不仅仅是 Firefox。
于 2013-05-31T14:09:01.943 回答
0

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

是的当然 ;)

我正在使用 mysql_query 未准备好的语句(我正在使用的所有内部公司代码都使用 mysql_query)

尝试使用 PDO 或 mysqli 迁移到准备好的语句

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

于 2013-05-31T14:08:49.800 回答
0

此提醒旨在告诉您,即使您自己设置它们,您也不能信任从 cookie 中获得的值,因为任何人都可以更改它们。所以,是的。

当然,您不应该使用mysql_函数之类的东西,但我认为您知道这一点(也必须在较旧的应用程序中使用它们)。

于 2013-05-31T14:10:39.450 回答