正在使用htmlspecialchar()进行输入/输出HTML清理,因为MySQL数据库设计不好


Is using htmlspecialchars() for input/output HTML sanitization, for MySQL database bad design?

可能重复:
什么是最好的PHP输入清理函数?

对于MySQL数据库,使用htmlspecialchar((进行输入/输出HTML清理是不是设计不好?

你应该不允许这些"危险"的标志,因为它仍然会显示b标签、i标签和其他标签吗?如何做到这一点?

我这么问是因为维基上写着http://en.wikipedia.org/wiki/HTML_sanitization

"HTML净化可以通过净化用户提交的任何HTML代码来防止跨站点脚本和SQL注入攻击。">

因此,除了使用PDO准备的语句,为了防止SQL注入,我还想对所有输入和输出使用这个htmlspecialchar。但也许我应该用别的东西?

例如,这是执行插入语句的好方法吗?:

$type= htmlspecialchars($_POST['animaltype']);
$name= htmlspecialchars($_POST['animalname']);
$age= htmlspecialchars($_POST['animalage']);        
$descr= htmlspecialchars($_POST['animaldescription']);
$foto= htmlspecialchars($_POST['animalfotourl']);
$date=htmlspecialchars($_POST['animalhomelessdate']);

$sqlquery  = "INSERT INTO animals_tbl(animaltype, animalname, animalage, animaldescription, animalfotourl, animalhomelesssince) VALUES (':type',':name',':age',':descr', ':foto', ':date')";

$stmt = $conn->prepare($sqlquery);
$stmt->bindParam(':type',$type, PDO::PARAM_STR);
$stmt->bindParam(':name',$name, PDO::PARAM_STR);
$stmt->bindParam(':age',$age, PDO::PARAM_INT);
$stmt->bindParam(':descr',$descr, PDO::PARAM_STR);
$stmt->bindParam(':foto',$foto, PDO::PARAM_STR);
$stmt->bindParam(':date',$date, PDO::PARAM_STR);
$stmt->execute();

htmlspecialchars()足以为浏览器转义文本。这将保护其他网站用户免受XSS攻击。

但是,只有当显示数据时,我才会运行此函数。在我看来,将转义内容存储在数据库中似乎是一个糟糕的设计。数据库应该存储实际内容,而不是伪造的内容。根据需要在每一层逃生,不要太快。


为了说明为什么这是一个坏主意,请考虑一个正在实现JSON-驱动的API的网站。如果他们将HTML编码的数据存储在数据库中,他们有两种选择:(a(在JSON响应中包含HTML编码数据(这毫无意义(,或者(b(在JSON编码之前将HTML解码回其原始形式。这两种选择都是次优的。

数据进入数据库,JSON字符串进入JSON文档,HTML编码的数据进入HTML文档。不要把它们混在一起!

如果您使用PDO(带有正确使用的已准备好的语句(,则不必净化您的输入。但为了确保你不会受到XSS攻击,我会在你把它放进数据库之前使用htmlspecialchar。