可能重复:
什么是最好的PHP输入清理功能?
是使用htmlspecialchars()进行输入/输出HTML清理,对于MySQL数据库糟糕的设计?
你是否应该只是不允许这些"危险"标志,因为它仍会显示b标签,i-tag和其他?怎么这样?
我问,因为它在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();
Run Code Online (Sandbox Code Playgroud)
cdh*_*wie 17
htmlspecialchars()
足以逃避浏览器的文本.这将保护其他站点用户免受XSS攻击.
但是,我只在显示数据时运行此功能.在数据库中存储转义内容对我来说似乎很糟糕.数据库应存储实际内容,而不是存储内容.在每一层都尽可能地逃避事情,并且不久之后.
为了说明为什么这是一个坏主意,请考虑一个致力于实现JSON驱动的API的网站.如果他们将HTML编码数据存储在他们的数据库中,他们有两种选择:(a)在他们的JSON响应中有HTML编码数据(这没有意义),或者(b)在JSON之前将HTML解码回原始形式 - 编码.两种选择都是次优的.
数据在数据库中,JSON字符串在JSON文档中,HTML编码的数据在HTML文档中.不要混合它们!
Gre*_*ack -1
如果您使用 PDO(并正确使用准备好的语句),则不必清理您的输入。但为了确保您不会受到 XSS 攻击,我会在将 htmlspecialchars 放入数据库之前使用它。