关于Javascript注入的问题

关于Javascript注入的问题,javascript,asp.net-mvc,javascript-injection,Javascript,Asp.net Mvc,Javascript Injection,我一直在asp.NETMVC学习网站上阅读有关JavaScript注入的内容,这让我大开眼界 我甚至从未意识到/想过有人使用JavaScript进行一些奇怪的屁股注射攻击 然而,这给我留下了一些未回答的问题 首先 什么时候使用html.encode?比如,您是否仅在要显示该用户或其他用户提交的信息时才使用它 或者我什么都用它。比如说我有一个用户提交的表单,这个信息永远不会显示给任何一个用户,我应该仍然使用html.encode吗 我不知道如何将say和Html.TextBox()放入Html.e

我一直在asp.NETMVC学习网站上阅读有关JavaScript注入的内容,这让我大开眼界

我甚至从未意识到/想过有人使用JavaScript进行一些奇怪的屁股注射攻击

然而,这给我留下了一些未回答的问题

首先

什么时候使用html.encode?比如,您是否仅在要显示该用户或其他用户提交的信息时才使用它

或者我什么都用它。比如说我有一个用户提交的表单,这个信息永远不会显示给任何一个用户,我应该仍然使用html.encode吗

我不知道如何将say和Html.TextBox()放入Html.encode标记中

第二

如果说我的网站上有一个丰富的html编辑器。用户可以使用它,并使事情大胆,无论什么。现在我想通过标签向用户显示信息。我不能使用Html。从那时起,所有的粗体和内容都不会被渲染

但我不能让它保持原样,因为什么能阻止用户添加一些Javascript攻击

那我该怎么办?使用正则表达式过滤掉所有标记

第三

还有另一个标签你可以使用,叫做“AntiforgeryToken”,你什么时候会使用这个

谢谢

编辑


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

对用户提交的任何显示数据使用HTML编码。在提交到数据库时,您不需要使用它,否则会得到一些奇怪的数据,如:Simon'&'Sons。实际上,我不认为在动态写入页面的任何内容上使用它有什么害处

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

第三个是为了防止攻击。您可以使用此功能来阻止人们使用用户提供的“被盗”cookie发布帖子。因此,在接受帖子之前,您可能需要一个经过身份验证的cookie,但恶意用户可能会在用户访问其站点时使用该cookie,然后向您的站点提交一份声明为他们的表单

请参见此处了解更多信息:

如何使用它:
始终根据白名单验证收到的输入。如果你使用黑名单,你可能也可能会遇到编码问题。验证输入时始终使用白名单

不要依赖客户端验证来验证用户输入。客户端验证对于帮助用户输入正确的数据非常有用。但是恶意用户不会使用此功能,并且可能会绕过客户端验证。客户端验证不应被视为安全修复。不应使用javascript验证输入。正如您所看到的,javascript非常容易在任何html页面上更改和修改。也可以在浏览器中禁用javascript。因此,在代码隐藏文件中进行额外检查


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

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

我将遵循以下基本规则:

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

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

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

  • 编辑:@Phoenix在这个上下文中谈到了验证,所以我想我应该添加这个。我以前说过,我重申:我不反对基于脚本的验证。我只是提醒人们不要明确地依赖它。一种常见的设计模式是使用基于脚本的验证来验证基本标准,并在提交数据时在服务器端应用严格的验证。

    好问题

    对于第一个答案,我会考虑以前的问题。正如答案所讨论的,使用HTML编码不会完全保护您免受所有XSS攻击。为了帮助这一点,你应该考虑使用(特别是微软)。

  • 如前所述,使用一个允许的标签列表是最好的做法,而其他标签则需要去掉

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


  • 你可以使用一个标签白名单而不是黑名单(就像这个网站一样)。因此,它和它的兄弟姐妹使用白名单:但你应该在所有形式中使用它。它会导致更多的服务器负载。我不喜欢为了使用而使用东西。