在我提出有关在构建自定义cms时转义内容的问题之后,我想知道从数据库中转出的内容有多危险 - 假设数据在插入数据库之前已被过滤/验证。< / p>
我知道这是逃避输出的最佳做法,但我不确定是否有人能够轻松甚至可能地注入&#39;要显示的页面内容的值。
例如,让我们假设使用简单的echo语句显示带有HTML标记的内容:
<p>hello</p>
不可否认,就内容写作而言,它不会赢得任何奖项;)
我的问题是,有人可以为了恶意目的改变这一点,假设在数据库插入之前进行过滤/验证吗?
答案 0 :(得分:2)
总是为适当的上下文转义; 无论是JSON还是XML / HTML,还是CSV或SQL都没关系(尽管你应该使用SQL的占位符和JSON的库)等等
为什么呢? 因为它是一致的。并且保持一致也是一种懒惰的形式:你不需要思考数据是否“对HTML安全”,因为它应该无关紧要。懒惰(以一种好的方式)是一种有价值的编程特征。 (在这种情况下,由于未来的变化,它也很难避免修复“错误”。)
不要忽略转义“因为它永远不会包含需要转义的数据”...因为,有一天,在许多情况下,假设将是错的。
答案 1 :(得分:1)
答案 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可能会被盗,然后用于劫持他们的会话。