【问题标题】:Validating your site验证您的网站
【发布时间】:2011-12-06 08:37:49
【问题描述】:

除了我下面的内容之外,还有什么需要验证的?这是我的问题。

对网站的任何输入都经过适当验证很重要:

  • 文本框等 - 使用 .NET 验证器(如果验证器不合适,则使用自定义代码)

  • 查询字符串或表单值 - 使用手动验证(强制转换为特定类型、边界检查等)

这与 XSS 可以揭示的问题有关。

基本上,您必须验证有人可能篡改的任何输入:

  • 表单回发(主要是 .NET 控件 - 这些可以使用 .NET 验证控件进行验证。此外,如果您在所有页面上都打开了请求验证,则可以降低风险)

  • 查询字符串值

  • Cookie 值

  • HTTP 标头

  • Viewstate(只要您启用了 ViewState MAC,就会自动为您完成)

  • Javascript(所有 JS 都可以查看和更改,因此需要确保没有关键功能由 JavaScript 处理 - 即始终启用服务器端验证)

【问题讨论】:

  • 必须阻止已同意的恶意用户
  • 看来你已经掌握了一切,我会关闭浏览器中的 javascript,并确保所有功能仍然可以运行,并且可以在服务器端代码中处理任何恶意输入
  • 所有可能来自恶意来源的内容 - 实际上是发送到服务器的所有内容,包括 URL。
  • @ atornblad 是的,恶意部分将是您正确的网址中的查询字符串。
  • 好吧,在处理请求时...有时我使用if(Request.IsLocal)

标签: c# asp.net security validation


【解决方案1】:

Web 应用程序可能会出现很多问题。您的列表非常全面,尽管它是重复的。 http 规范仅声明 GET、POST、Cookie 和 Header。 POST 有很多不同的类型,但它们都在请求的同一部分。

对于您的列表,我还将添加与文件上传有关的所有内容,这是一种 POST。例如,文件名、mime 类型和文件的内容。我会启动一个像 Wireshark 这样的网络监控应用程序,请求中的所有内容都应该被认为是潜在有害的。

永远不会有一种万能的验证功能。如果您正在合并 sql 注入和 xss 卫生功能,那么您可能会遇到麻烦。我建议使用自动化测试您的网站。 Sitewatch 之类的免费服务或skipfish 之类的开源工具将检测您错过的攻击方法。

另外,顺便说一句。使用 MAC 和/或加密传递视图状态是对密码学的严重滥用。密码学是在没有其他解决方案时使用的工具。通过使用 MAC 或加密,您为攻击者打开了暴力破解此值的大门,或使用诸如 oracle 填充攻击之类的东西来利用您。视图状态应由服务器跟踪,故事结束。

【讨论】:

  • 感谢关于视图状态和 mac 的提示,我会进一步研究。
  • 强烈建议您始终启用 MAC 验证。它可以很好地防止欺骗攻击,即当攻击者提供您通常不允许的值时。来源:aspnetresources.com/articles/ViewState
  • @Anicho 我并不是说要在视图状态下禁用 mac,而是说它是一种根本不安全的解决问题的方法。提出这种视图状态想法的人并不了解安全性。
  • 感谢帮助伙伴,帮助了一堆:)。还要再等 3 个小时,叹息。
【解决方案2】:

我会建议一种不同的方式来看待与你在这里遇到的问题正交的问题(因此不是不兼容的,没有理由你不能同时检查它,以防你发现你错过了什么另一个)。

在任何验证中重要的两件事是:

  1. 您需要注意的事项。
  2. 您传递到另一层的东西保持不变。

现在,到目前为止,您提到的大部分内容都属于第一类。您忽略的 Cookie 适合第二个,如果您使用 Server.Execute 或类似方法传递给另一个处理程序,则会查询和发布信息。

第二类是最有争议的。

一方面,如果给定的处理程序(.aspx 页面、IHttpHandler 等)忽略了将来某个时间可能被另一个处理程序使用的 cookie,则主要由另一个处理程序来验证它。

另一方面,假设其他层存在安全漏洞并且您不应该相信它们是正确的,即使是您自己编写的(尤其是如果您自己编写的!),这种方法总是好的。

一个中间立场是,如果可能有 5 种不同的状态,一些持久数据可能有效地处于,但只有 3 种在特定代码被命中时才有意义,它可能会验证它处于其中一个状态3 州,即使这不会对该特定代码构成风险。

完成后,我们将专注于第一类。

查询字符串、表单数据、回发、标题和 cookie 都属于来自用户的同一类内容(无论他们是否知道)。事实上,它们有时是看待同一事物的不同方式。

其中,有一个子集我们会以任何方式实际处理。

其中每个此类项目都有一系列合法值。

其中,作为一个整体,存在一系列合法的值组合。

因此验证变成:

  1. 确定我们将根据哪些输入采取行动。
  2. 确保该输入的每个组件本身都是有效的。
  3. 确保组合有效(例如,不发送信用卡号可能有效,但不发送但将付款类型设置为“信用卡”则无效)。

现在,当我们谈到这一点时,通常最好不要尝试捕获某些攻击。例如,在将传递给 SQL 的值中避免使用 ' 并不是很好。相反,我们有三种可能性:

  1. 在值中包含 ' 是无效的,因为它不属于那里(例如,一个只能是“真”或“假”的值,或者来自一组值的列表,其中没有它们包含')。在这里,我们发现它不在合法值集中,并忽略了攻击的确切性质(因此也受到保护,免受我们甚至不知道的其他攻击!)。

  2. 它作为人工输入是有效的,但不是我们将使用的。这里的一个例子是一个很大的数字(在某些文化中' 用于分隔数千)。在这里,我们将 "123,456,789" 和 "123'456'789" 都规范化为 123456789 并且不关心之前的情况,只要我们可以有意义地这样做(输入不是“鱼”或超出了本案的法律价值范围)。

  3. 这是有效的输入。如果您的应用程序阻止名称字段中的撇号以试图阻止 SQL 注入,那么它就是错误的,因为那里有带撇号的真实姓名。在这种情况下,我们认为“d'Eath”和“O'Grady”是有效的输入,并通过正确转义处理'在SQL中的重要性(理想情况下,通过使用API​​进行数据访问)我们。

关于 ASP.NET 的第三点的一个经典示例是使用 <> 阻止“可疑”输入的代码 - 这使得大量 ASP.NET 页面出现错误。诚然,不恰当地阻止它比不恰当地接受它更好,但默认值适用于那些没有考虑过验证并试图阻止他们严重伤害自己的人。由于您正在考虑验证,因此您应该考虑是否适合关闭自动验证,然后以适合您给定用途的方式处理 <>

还请注意,我还没有提到任何关于 javascript 的内容。我不验证 javascript(除非我实际上是接收它),我忽略它。我假装它不存在,然后我不会错过它的验证可能被篡改的情况。假装你的在这一层也不存在。最终,客户端验证是为了节省好人犯诚实错误的时间,而不是阻挠坏人。

出于类似原因,最好不要通过浏览器进行测试。使用 Fiddler 构建达到您要检查的验证点的请求。这样一来,所有客户端验证都被绕过了,并且您以与攻击者相同的方式查看服务器。

最后,请记住,100% 完美验证的页面不一定安全。例如。如果您的验证是完美的,但您的身份验证很差,那么有人可以向它发送“有效”代码,这将只是 - 也许更 - 像 XSS 代码的更经典的 SQL 注入一样令人讨厌。这涉及到其他问题的其他主题,除了这里讨论的验证只是难题的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2012-03-24
    • 2016-07-31
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多