9

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

是否使用 htmlspecialchars() 进行输入/输出 HTML 清理,用于 MySQL 数据库的不良设计?

相反,您是否应该不允许这些“危险”标志,因为它仍然会显示 b-tags、i-tags 和其他?以及如何做到这一点?

我问是因为它在 wiki http://en.wikipedia.org/wiki/HTML_sanitization上说

“HTML 清理可用于通过清理用户提交的任何 HTML 代码来防止跨站点脚本和 SQL 注入攻击。”

因此,除了使用 PDO 准备好的语句之外,为了防止 SQL 注入,我想将此 htmlspecialchars 用于所有输入和输出。但也许我应该使用别的东西?

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

$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();
4

2 回答 2

17

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

但是,我只会在显示数据时运行此函数。将转义内容存储在数据库中对我来说似乎是糟糕的设计。数据库应该存储实际内容,而不是经过处理的内容。在每一层都根据需要逃避事情,不要很快。


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

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

于 2013-01-03T23:25:33.273 回答
-2

如果您使用 PDO(使用正确使用的准备好的语句),则不必清理您的输入。但是为了确保您不会受到 XSS 攻击,我会在将其放入数据库之前使用 htmlspecialchars。

于 2013-01-03T23:24:30.670 回答