使用数据库中的撇号存储值

时间:2011-07-07 01:17:23

标签: php mysql security

将可能包含撇号的用户输入插入数据库的行业标准是什么?这样的输入将在网页上显示给用户。例如,用户将某个字段更新为“我很酷”。我使用此函数将其插入到我的数据库中:

public function updateDatabase($value) {
   $value = mysql_real_escape_string($value);
   Database::instance()->query(
      'UPDATE myTable
       SET myColumn = ' . $value . '
       WHERE foo = "bar"'
   );
}

数据库现在将存储“我很酷”。要正确安全地将此值显示回任何用户,我必须使用此功能清除它:

public function toSafeDisplay($userGeneratedValue) {
   return stripslashes(
      htmlentities(
         $userGeneratedValue
      )   
   );
}

我担心的是,对我要在网页上显示的所有内容进行stripslasheshtmlentities将非常耗费处理器。 StackOverflow的一般共识是在插入数据库之前不要htmlentities,以便数据尽可能原始。这将允许它稍后显示在任何媒体中,而不仅仅是网站。所以我们在展示时被迫htmlentitiesstripslashes也是如此吗?或者是否可以在更新数据库之前删除撇号之前的所有斜杠而不引入SQL注入攻击?

3 个答案:

答案 0 :(得分:1)

这根本不是它的工作方式。如果你在将它读回到php时逃避插入/更新的叛逆,它将不会被转义。如果您希望从数据库中获取HTML安全数据,请在将其放入之前使其安全。

答案 1 :(得分:1)

请注意正确使用mysql_real_escape_string的开发人员:

如果启用了magic_quotes_gpc,请先将stripslashes()应用于数据。对已经转义的数据使用此函数将两次转义数据。

如果你发现magic_quotes_gpc设置为On,请在php.ini中将其关闭!

同时检查:http://gr.php.net/manual/en/function.mysql-real-escape-string.php

答案 2 :(得分:0)

数据库不应将其存储为I\'m cool,而应存储为I'm cool。转义是允许将撇号作为myColumn中更新的数据的一部分包含在内。我见过网站向用户显示I\'m cool的情况,但这可能是双重转义的情况。

修改

mysql_real_escape_string不会在数据库中存储斜杠。它会转义SQL语句中的值。在数据库中获得额外斜杠的唯一方法是,如果你做了类似mysql_real_escape_string(mysql_real_escape_string($value))的事情。