我一直在阅读关于JavaScript注入的asp.net mvc学习网站,这让人大开眼界。
我从来没有意识到/想过有人使用JavaScript来做一些奇怪的屁股注射攻击。
然而,它给我留下了一些悬而未决的问题。第一
你什么时候使用html.encode?就像你只是在显示那个用户或其他用户提交的信息时一样使用它?
或者我将它用于一切。比如说我有用户提交的表单,如果我仍在使用html.encode,这些信息将永远不会显示给任何用户?
我怎么能这样做,就像我不知道如何把内部说和Html.TextBox()放在html.encode标签上。
第二
怎么说我在我的网站上有一个丰富的html编辑器。允许用户使用它并使事情变得大胆。现在我想通过标签向用户显示信息。我不能Html.Encode它从那以后所有的粗体和东西都不会被渲染。
然而,我不能放弃它,因为什么会阻止用户添加一些Javascript攻击?
那我该怎么办?使用Regex过滤掉所有标签?
第三
您还可以使用另一个名为“AntiforgeryToken”的标签,何时使用此标签?
由于
修改
几乎每个人都说使用“白名单”和“黑名单”如何编写此列表并将其与传入值进行比较(C#中的示例会很好)?
答案 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
答案 1 :(得分:2)
好问题!
对于第一个答案,我会考虑在前一个问题上查看here。正如答案所讨论的,使用HTML Encode不会完全保护您免受所有XSS攻击。为此,您应该考虑使用Microsoft提供的Microsoft Web Protection Library(特别是AntiXSS)。
正如已经提到的那样,使用允许的标签列表是最好的办法,让其他人被剥离。
AntiforgeryToken令牌用于防止请求伪造(CSRF),因为它为用户提供了一个cookie,该cookie在发布页面时根据呈现的表单字段进行验证。没有理由我知道这意味着你不能在所有表格中使用它。
答案 2 :(得分:1)
始终验证针对白名单收到的输入。如果您使用黑名单,您可能会遇到编码问题。验证输入时始终使用白名单。
不要依赖客户端验证来验证用户输入。客户端验证非常适合帮助用户输入正确的数据。但恶意用户不会使用此功能,可能会绕过客户端验证。永远不应将客户端验证视为安全修复。不应使用javascript来验证输入。正如您所看到的,javascript在任何html页面上都很容易更改和修改。也可以在浏览器中禁用javascript。因此,请在文件后面的代码中进一步检查。
此外,每次都验证输入,而不仅仅是最初接受数据时。例如,如果您设置了cookie,请确保cookie是相同的值,并且每个请求都是正确的。恶意用户可以在会话期间随时修改和更改值。
答案 3 :(得分:1)
根据应用程序的设计考虑,可以实现各种级别的安全性。
我会遵循以下基本规则:
清理所有输入,删除已知的恶意部分(例如,富HTML编辑器中的<script>
标记)。基于正则表达式的模式匹配通常用于此类清理。
删除不在允许值的白名单中的所有输入。
在存储到数据库之前对任何HTML进行编码,并在检索显示时对其进行解码。
编辑:@ Phoenix在这个背景下讨论验证,所以我想我会添加它。我之前已经说过了,我重申:我不反对基于脚本的验证。我只是提醒人们不要明确地依赖它。常见的设计模式是使用基于脚本的验证来验证基本标准,并在提交数据时在服务器端应用严格的验证。