3

继我在构建自定义 cms 时询问有关转义内容的问题之后,我想了解不从数据库中转义内容有多危险 - 假设数据在插入数据库之前已被过滤/验证。

我知道转义输出是一种最佳做法,但我只是不确定某人将值“注入”到要显示的页面内容中是否容易甚至可能。

例如,假设使用简单的 echo 语句显示带有 HTML 标记的内容:

<p>hello</p>

诚然,就内容写作而言,它不会赢得任何奖项;)

我的问题是有人可以为了邪恶的目的而改变它,假设在插入数据库之前进行过滤/验证吗?

4

4 回答 4

2

总是逃避适当的上下文;它是 JSON 或 XML/HTML 或 CSV 或 SQL 都没有关系(尽管您应该使用 SQL 的占位符和 JSON 的库)等。

为什么?因为它是一致的。保持一致也是一种懒惰:你不需要考虑数据是否“对 HTML 安全”,因为这无关紧要。懒惰(以一种好的方式)是一种有价值的编程特征。(在这种情况下,它也懒得避免由于未来的变化而不得不修复“错误”。)

不要忽略转义“因为它永远不会包含需要转义的数据” ..因为有一天,在许多情况下,这种假设是错误的。

于 2012-07-20T00:10:36.097 回答
1

例如,它也可能是与其他一些漏洞相关的问题,例如 sql 注入。然后有人可以在添加到数据库之前省略过滤/验证并显示他可以显示的任何内容。

于 2012-07-19T23:48:50.040 回答
1

如果您不转义 HTML 输出,则可以简单地将脚本插入页面的 HTML 代码 - 在访问您页面的每个客户端的浏览器中运行。它被称为跨站点脚本(XSS)

例如:

<p>hello</p><script>alert('I could run any other Javascript code here!');</script>

代替alert(),您基本上可以使用任何东西:访问 cookie、操作 DOM、与其他服务器通信等等。

好吧,这是一种非常简单的插入脚本的方法,并且strip_tags可以防止这种情况发生。但是有数百个更复杂的技巧,strip_tags根本无法防御。

如果您真的想存储和输出 HTML,HTMLPurifier可能是您的解决方案:

黑客拥有大量隐藏在 HTML 规范深处的 XSS 向量库。HTML Purifier 是有效的,因为它将整个文档分解为标记并删除非白名单元素,检查标签的格式和嵌套,并根据它们的 RFC 验证所有属性。HTML Purifier 的综合算法辅以广博的知识,确保格式丰富的文档不被剥离。

于 2012-07-19T23:52:42.833 回答
0

如果您从数据库中提取单词 hello 并显示它,则不会发生任何事情。如果内容包含<script>标签,那么它是危险的,因为用户 cookie 可能会被窃取并用于劫持他们的会话。

于 2012-07-19T23:44:18.133 回答