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

标签 php html database

<分区>

Possible Duplicate:
What are the best PHP input sanitizing functions?

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

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

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

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

因此,除了使用 PDO 准备语句之外,为了防止 SQL 注入(inject),我想将此 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();

最佳答案

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

但是,我只会在显示 数据时运行此函数。将转义内容存储在数据库中对我来说似乎是糟糕的设计。数据库应该存储实际内容,而不是修改后的内容。在每一层都根据需要转义,而且不要太早。


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

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

关于php - 是否使用 htmlspecialchars() 进行输入/输出 HTML 清理,用于 MySQL 数据库糟糕的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14148937/

相关文章:

php - 使用 Ajax 显示另一个 Ajax 请求调用的 PHP 脚本的进度

php - 在单个产品页面上添加一个复选框,这会在 Woocommerce 中增加额外费用

javascript - 让 Chrome 不要求输入 'http://'

javascript - 在 js 插槽应用程序中设置最小值和最大值

database - 有没有比visio更漂亮的数据库绘图软件?

mysql - MySQL GROUP BY 语句中 List 聚合函数的替代方法

php - 我可以创建用于在 Learndash 类(class)中自动注册 WP 角色的功能吗?

php - Php Elasticsearch 按地理距离排序

html - 编程扫描我的网站并查找链接到外部网站的所有页面

database - 业务规则应该同时在应用层和数据库层执行,还是只在两者之一执行?