好吧,所以我在SO和其他地方一直在阅读关于降价的信息,用户输入和数据库之间的步骤通常给出为
将markdown转换为html
清理HTML(带白名单)
插入数据库
但对我来说,做以下事情更有意义:
清理markdown(删除所有标签 - 没有例外)
转换为HTML
插入数据库
我错过了什么吗?在我看来,这几乎是xss证明
请看这个链接:
http://michelf.com/weblog/2010/markdown-and-xss/
> hello href="javascript:alert('xss')">*you*
变
hello you
∴ 转换为HTML 后必须清理.
你提出的建议有两个问题:
我没有看到您的用户能够格式化帖子的方法.例如,您利用Markdown提供了很好的编号列表.在提议的无标签 - 无异常的世界中,我没有看到最终用户将如何做这样的事情.
更重要的是:当使用Markdown作为"原生"格式化语言,并将其他可用标签列入白名单时,您不仅限制了世界的输入端,还限制了输出.换句话说,如果您的显示引擎需要Markdown并且只允许白名单内容,即使(上帝禁止)有人进入数据库并将一些讨厌的恶意软件代码注入到一堆帖子中,实际站点及其用户也会受到保护因为你在展出时也要对它进行消毒.
网上有一些关于输出消毒的好资源:
消除用户数据:在何处以及如何执行此操作
输出消毒(我的一个客户,他将保持无名,其受影响的系统不是我开发的,受到这种确切的蠕虫攻击.当然,我们已经获得了这些系统.)
BizTech:最佳实践:从未听说过XSS?