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

use*_*304 9 html php database

可能重复:
什么是最好的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文档中.不要混合它们!

  • @ user1938304存储它时,你不对数据做任何事情(除了SQL转义它,如果你没有使用准备好的查询 - 你应该**真的**使用准备好的查询).数据库中的数据应该*精确*用户输入的内容.当您将该数据呈现为HTML文档时,**就是当您使用`htmlspecialchars()`时.当您将该数据呈现为JSON文档时,*该*是您对其进行JSON编码的时候. (2认同)
  • @user1938304从数据库获取数据后使用“htmlspecialchars()”。同样的事情我已经告诉过你*至少*三次了。 (2认同)

Gre*_*ack -1

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

  • 不是在将其放入数据库之前,而是在将其显示在页面上时:) (3认同)