【发布时间】:2012-12-21 08:58:07
【问题描述】:
将可能包含撇号的用户输入插入数据库的行业标准是什么?这样的输入将在网页上显示给用户。例如,用户将某个字段更新为“我很酷”。我用这个函数将它插入到我的数据库中:
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 注入攻击的情况下在更新数据库之前删除撇号前的所有斜杠?
【问题讨论】:
-
说到行业标准,请在SQL中使用绑定变量。
-
我不知道“绑定变量”是什么意思。谷歌结果将绑定称为将变量绑定到某个范围,而不是文体问题。能举个例子吗?
-
指的是这样的东西:docs.php.net/pdo.prepared-statements