输出某些内容而不先逃避它有多危险

时间:2012-07-19 23:36:57

标签: php html content-management-system xss

在我提出有关在构建自定义cms时转义内容的问题之后,我想知道从数据库中转出的内容有多危险 - 假设数据在插入数据库之前已被过滤/验证。< / p>

我知道这是逃避输出的最佳做法,但我不确定是否有人能够轻松甚至可能地注入&#39;要显示的页面内容的值。

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

<p>hello</p>

不可否认,就内容写作而言,它不会赢得任何奖项;)

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

4 个答案:

答案 0 :(得分:2)

总是为适当的上下文转义; 无论是JSON还是XML / HTML,还是CSV或SQL都没关系(尽管你应该使用SQL的占位符和JSON的库)等等

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

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

答案 1 :(得分:1)

例如,也可能存在与其他一些漏洞相关的问题,例如: sql注入。然后,有人可以在添加到db之前省略过滤/验证并显示他可以做的任何事情。

答案 2 :(得分:1)

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

例如:

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

alert()的位置,你基本上可以使用任何东西:访问cookie,操纵DOM,与其他服务器通信等等。

嗯,这是一种非常简单的插入脚本的方法,strip_tags可以防止这种情况。但是有数百种更复杂的技巧,strip_tags根本无法防范。

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

  

黑客拥有隐藏在深处的巨大的XSS载体库   HTML规范。 HTML Purifier因为它有效   将整个文档分解为令牌并删除非白名单   元素,检查标签的良构和嵌套,以及   根据其RFC来验证所有属性。 HTML净化器   综合算法辅以广泛的知识,   确保格式丰富的文档通过未提取的文件。

答案 3 :(得分:0)

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