假设我有一个简单的 ASP.NET MVC 博客应用程序,我希望允许读者向博客文章添加评论。如果我想防止任何类型的 XSS 恶作剧,我可以对所有评论进行 HTML 编码,以便它们在呈现时变得无害。但是,如果我想要一些基本功能,如超链接、粗体、斜体等,该怎么办?
我知道 StackOverflow 使用WMD Markdown Editor ,如果不是因为它同时支持HTML 和 Markdown 这使其容易受到 XSS 攻击,这对于我想要完成的工作来说似乎是一个不错的选择。
假设我有一个简单的 ASP.NET MVC 博客应用程序,我希望允许读者向博客文章添加评论。如果我想防止任何类型的 XSS 恶作剧,我可以对所有评论进行 HTML 编码,以便它们在呈现时变得无害。但是,如果我想要一些基本功能,如超链接、粗体、斜体等,该怎么办?
我知道 StackOverflow 使用WMD Markdown Editor ,如果不是因为它同时支持HTML 和 Markdown 这使其容易受到 XSS 攻击,这对于我想要完成的工作来说似乎是一个不错的选择。
如果您不想使用编辑器,您可以考虑OWASP 的 AntiSamy。
你可以在这里运行一个例子: http ://www.antisamy.net/
你要支持多少 HTML?只是粗体/斜体/基本的东西?在这种情况下,您可以将它们转换为 markdown 语法,然后剥离 HTML 的其余部分。
剥离需要在服务器端完成,然后再存储。在检查 SQL 漏洞和其他不需要的东西时,您还需要验证服务器上的输入。
如果您需要在浏览器中执行此操作:http ://code.google.com/p/google-caja/wiki/JsHtmlSanitizer
我建议你只提交降价语法。在前端,客户端可以键入 markdown 并进行 HTML 预览(与 SO 相同),但只能在服务器端提交 markdown 语法。然后您可以验证它、生成 HTML、转义并存储它。
我相信这是我们大多数人的做法。无论哪种情况,markdown 都可以减轻任何人编写结构化 HTML 代码的负担,并为那些甚至不知道如何编写的人提供权力。
如果您想对 HTML 做一些特定的事情,那么您可以使用一些 CSS 继承来调整它 '.comment a { color: #F0F; }',前端 JS 或者只是在存储之前遍历从解析 markdown 生成的 HTML。
为什么不使用 Jeff 的代码?http://refactormycode.com/codes/333-sanitize-html
我会投票给FCKEditor ,但你也必须对返回的输出做一些额外的步骤。