关于Javascript注入的问题

时间:2009-07-21 07:43:26

标签: javascript asp.net-mvc javascript-injection

我一直在阅读关于JavaScript注入的asp.net mvc学习网站,这让人大开眼界。

我从来没有意识到/想过有人使用JavaScript来做一些奇怪的屁股注射攻击。

然而,它给我留下了一些悬而未决的问题。

第一

你什么时候使用html.encode?就像你只是在显示那个用户或其他用户提交的信息时一样使用它?

或者我将它用于一切。比如说我有用户提交的表单,如果我仍在使用html.encode,这些信息将永远不会显示给任何用户?

我怎么能这样做,就像我不知道如何把内部说和Html.TextBox()放在html.encode标签上。

第二

怎么说我在我的网站上有一个丰富的html编辑器。允许用户使用它并使事情变得大胆。现在我想通过标签向用户显示信息。我不能Html.Encode它从那以后所有的粗体和东西都不会被渲染。

然而,我不能放弃它,因为什么会阻止用户添加一些Javascript攻击?

那我该怎么办?使用Regex过滤掉所有标签?

第三

您还可以使用另一个名为“AntiforgeryToken”的标签,何时使用此标签?

由于

修改

几乎每个人都说使用“白名单”和“黑名单”如何编写此列表并将其与传入值进行比较(C#中的示例会很好)?

4 个答案:

答案 0 :(得分:2)

对用户提交的任何数据使用HTML Encode。提交到数据库时,您不需要使用它,否则您将得到奇怪的数据,如:Simon'&'儿子。真的,我没有看到在动态写入页面的任何内容上使用它的危害。

使用允许的标签列表并丢弃HTML编辑器的所有其他内容。正如人们所说,使用白名单。

第三个是为了防止 Cross-site request forgery 攻击。您可以使用它来阻止人们使用来自用户的“被盗”cookie进行POST。因此,在接受帖子之前,您可能需要经过身份验证的Cookie,但恶意用户可以在用户访问其网站时将该Cookie提交给您声称自己的网站。

请点击此处了解更多信息: http://haacked.com/archive/2009/04/02/anatomy-of-csrf-attack.aspx

如何使用它: http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

答案 1 :(得分:2)

好问题!

  1. 对于第一个答案,我会考虑在前一个问题上查看here。正如答案所讨论的,使用HTML Encode不会完全保护您免受所有XSS攻击。为此,您应该考虑使用Microsoft提供的Microsoft Web Protection Library(特别是AntiXSS)。

  2. 正如已经提到的那样,使用允许的标签列表是最好的办法,让其他人被剥离。

  3. AntiforgeryToken令牌用于防止请求伪造(CSRF),因为它为用户提供了一个cookie,该cookie在发布页面时根据呈现的表单字段进行验证。没有理由我知道这意味着你不能在所有表格中使用它。

答案 2 :(得分:1)

始终验证针对白名单收到的输入。如果您使用黑名单,您可能会遇到编码问题。验证输入时始终使用白名单。

不要依赖客户端验证来验证用户输入。客户端验证非常适合帮助用户输入正确的数据。但恶意用户不会使用此功能,可能会绕过客户端验证。永远不应将客户端验证视为安全修复。不应使用javascript来验证输入。正如您所看到的,javascript在任何html页面上都很容易更改和修改。也可以在浏览器中禁用javascript。因此,请在文件后面的代码中进一步检查。

此外,每次都验证输入,而不仅仅是最初接受数据时。例如,如果您设置了cookie,请确保cookie是相同的值,并且每个请求都是正确的。恶意用户可以在会话期间随时修改和更改值。

答案 3 :(得分:1)

根据应用程序的设计考虑,可以实现各种级别的安全性。

我会遵循以下基本规则:

  1. 清理所有输入,删除已知的恶意部分(例如,富HTML编辑器中的<script>标记)。基于正则表达式的模式匹配通常用于此类清理。

  2. 删除不在允许值的白名单中的所有输入。

  3. 在存储到数据库之前对任何HTML进行编码,并在检索显示时对其进行解码。

  4. 编辑:@ Phoenix在这个背景下讨论验证,所以我想我会添加它。我之前已经说过了,我重申:我不反对基于脚本的验证。我只是提醒人们不要明确地依赖它。常见的设计模式是使用基于脚本的验证来验证基本标准,并在提交数据时在服务器端应用严格的验证。