使用 AntiXSS 库从帖子中过滤不良 HTML 内容的最佳方法是什么?
What is the best way to filter bad HTML Content from Posts using AntiXSS Library?
我想创建一个 Asp.net 网站并且我想防止跨站点脚本。我有一个带有 Summernote(所见即所得 HTML 编辑器)的页面,当提交时,它通过表单或 Ajax Post 将 HTML 代码发布到 MVC ActionResult。
此方法将此代码作为消息的 content/body 保存在我的数据库中。在另一个站点上,您可以显示内容,显示格式化内容,例如列表等。
出于安全原因,我想过滤从客户端收到的内容。我正在使用 Microsoft 的 AntiXSS 库。
我的 MVC 代码的一部分:
[ValidateInput(false), HttpPost, ValidateAntiForgeryToken]
public ActionResult CreateMessage(string subject, string body)
{
var cleanBody = Sanitizer.GetSafeHtmlFragment(body);
//do the Database thing here
}
主要问题是,它杀死了我的带有标签的 HTML 元素,因为它删除了 src=""
应该是:
<p><img src="data:image/png;base64,some/ultra/long/picture/code/here" data-filename="grafik.png"></p>
剩余:
<p><img src="" alt=""><img src=""></p>
我能做些什么来防止这种情况发生?
有没有办法添加例外规则?
还有其他更好的方法吗?
它是如何工作的?
感谢帮助!
再也没有 "AntiXSS Library" 这样的东西了。它曾经是一个单独的库,但微软将它移到了 .Net 中,所以它现在在 System.Web.Security.AntiXss.
下
这很重要的原因是您需要 消毒剂。您当前使用 AntiXss 的方式将获取 html 标记列表和这些标记的属性列表,并将从您的 html 代码中删除所有其他内容。这对您来说不是很好,因为您只想删除 javascript,而不考虑标签或属性。让我们以 <a>
及其 href
属性为例。您很可能希望允许您的用户插入链接,但您不希望他们能够通过 <a href="javascript: ...">
插入 javascript。所以你不能为<a>
过滤掉href
,但是如果你留下它,你的页面将容易受到XSS攻击。
所以您想要一种只能去除 javascript 的消毒剂。在原始的 AntiXSS 库中 是 消毒剂,但当 Microsoft 将其移至 .Net 时,消毒剂被排除在外。
简而言之,AntiXss 不会帮助您处理当前的用例。
您可以找到合适的 html 消毒剂,例如 Google Caja(客户端消毒剂 here)或许多其他消毒剂。关键是,即使这个消毒剂在 javascript(在客户端)中,如果您在消毒之前小心地不将数据插入页面 DOM,一切都会好起来的。
简而言之,您可以直接将 HTML 编辑器中的任何数据保存到您的数据库中,无需任何转换(当然要注意 sql 注入,但当前的数据访问技术应该具有覆盖),然后当显示此类数据时,将其发送给客户端而不将其添加到页面 dom(例如 json 数据,但正确编码为 json 然后当然!),然后 运行 你的消毒剂将删除任何 javascript,然后将其添加到页面。
之所以如此好,是因为您的所见即所得 html 编辑器可能会有预览屏幕。不要忘记也为预览添加清理,否则预览将容易受到 XSS 攻击。如果在服务器上进行清理,您将不得不将编辑器内容发送到服务器,对其进行清理并将其发送回您的用户以供预览 - 不是很用户友好。
另请注意,许多所见即所得的编辑器支持挂接到其渲染中并添加此类消毒剂。如果编辑器不支持这个并且没有自己的消毒剂,那么就 XSS 而言就不能保证安全。
我想创建一个 Asp.net 网站并且我想防止跨站点脚本。我有一个带有 Summernote(所见即所得 HTML 编辑器)的页面,当提交时,它通过表单或 Ajax Post 将 HTML 代码发布到 MVC ActionResult。 此方法将此代码作为消息的 content/body 保存在我的数据库中。在另一个站点上,您可以显示内容,显示格式化内容,例如列表等。
出于安全原因,我想过滤从客户端收到的内容。我正在使用 Microsoft 的 AntiXSS 库。
我的 MVC 代码的一部分:
[ValidateInput(false), HttpPost, ValidateAntiForgeryToken]
public ActionResult CreateMessage(string subject, string body)
{
var cleanBody = Sanitizer.GetSafeHtmlFragment(body);
//do the Database thing here
}
主要问题是,它杀死了我的带有标签的 HTML 元素,因为它删除了 src=""
应该是:
<p><img src="data:image/png;base64,some/ultra/long/picture/code/here" data-filename="grafik.png"></p>
剩余:
<p><img src="" alt=""><img src=""></p>
我能做些什么来防止这种情况发生? 有没有办法添加例外规则? 还有其他更好的方法吗? 它是如何工作的?
感谢帮助!
再也没有 "AntiXSS Library" 这样的东西了。它曾经是一个单独的库,但微软将它移到了 .Net 中,所以它现在在 System.Web.Security.AntiXss.
下这很重要的原因是您需要 消毒剂。您当前使用 AntiXss 的方式将获取 html 标记列表和这些标记的属性列表,并将从您的 html 代码中删除所有其他内容。这对您来说不是很好,因为您只想删除 javascript,而不考虑标签或属性。让我们以 <a>
及其 href
属性为例。您很可能希望允许您的用户插入链接,但您不希望他们能够通过 <a href="javascript: ...">
插入 javascript。所以你不能为<a>
过滤掉href
,但是如果你留下它,你的页面将容易受到XSS攻击。
所以您想要一种只能去除 javascript 的消毒剂。在原始的 AntiXSS 库中 是 消毒剂,但当 Microsoft 将其移至 .Net 时,消毒剂被排除在外。
简而言之,AntiXss 不会帮助您处理当前的用例。
您可以找到合适的 html 消毒剂,例如 Google Caja(客户端消毒剂 here)或许多其他消毒剂。关键是,即使这个消毒剂在 javascript(在客户端)中,如果您在消毒之前小心地不将数据插入页面 DOM,一切都会好起来的。
简而言之,您可以直接将 HTML 编辑器中的任何数据保存到您的数据库中,无需任何转换(当然要注意 sql 注入,但当前的数据访问技术应该具有覆盖),然后当显示此类数据时,将其发送给客户端而不将其添加到页面 dom(例如 json 数据,但正确编码为 json 然后当然!),然后 运行 你的消毒剂将删除任何 javascript,然后将其添加到页面。
之所以如此好,是因为您的所见即所得 html 编辑器可能会有预览屏幕。不要忘记也为预览添加清理,否则预览将容易受到 XSS 攻击。如果在服务器上进行清理,您将不得不将编辑器内容发送到服务器,对其进行清理并将其发送回您的用户以供预览 - 不是很用户友好。
另请注意,许多所见即所得的编辑器支持挂接到其渲染中并添加此类消毒剂。如果编辑器不支持这个并且没有自己的消毒剂,那么就 XSS 而言就不能保证安全。