可能重复:
什么是最好的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。