将可能包含撇号的用户输入插入数据库的行业标准是什么?这样的输入将在网页上显示给用户。例如,用户将某个字段更新为“我很酷”。我使用此函数将其插入到我的数据库中:
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
)
);
}
我担心的是,对我要在网页上显示的所有内容进行stripslashes和htmlentities将非常耗费处理器。 StackOverflow的一般共识是在插入数据库之前不要htmlentities
,以便数据尽可能原始。这将允许它稍后显示在任何媒体中,而不仅仅是网站。所以我们在展示时被迫htmlentities
。 stripslashes
也是如此吗?或者是否可以在更新数据库之前删除撇号之前的所有斜杠而不引入SQL注入攻击?
答案 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))
的事情。