C# 验证您的站点

C# 验证您的站点,c#,asp.net,security,validation,C#,Asp.net,Security,Validation,除了下面的内容,还有什么需要验证的?这是我的问题 对站点的任何输入进行适当验证非常重要: 文本框等–使用.NET验证程序(如果验证程序不合适,则使用自定义代码) 查询字符串或表单值–使用手动验证(转换为特定类型、边界检查等) 这与XSS可能揭示的问题有关 基本上,您必须验证有人可能篡改的任何输入: 表单回发(主要是.NET控件–可以使用.NET验证控件对其进行验证。此外,如果在所有页面上都打开了请求验证,则可以降低风险) 查询字符串值 Cookie值 HTTP头 Viewstate(只要启

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

对站点的任何输入进行适当验证非常重要:

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

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

这与XSS可能揭示的问题有关

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

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

  • 查询字符串值

  • Cookie值

  • HTTP头

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

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


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

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

      永远不会有一刀切的验证功能。如果您正在合并sql注入和xss函数,那么您可能会遇到麻烦。我建议使用自动化测试您的站点。像这样的免费服务或者像这样的开源工具将检测到您错过的攻击方法


      另外,在旁注上。使用MAC和/或加密设备传递视图状态是对加密技术的严重滥用。加密是在没有其他解决方案时使用的工具。通过使用MAC或加密,您为攻击者打开了一扇门,使其可以强行使用此值或使用类似oracle填充攻击的方法来利用您。服务器应跟踪视图状态,即故事结束时

      我建议用一种不同的方式来看待这个问题,它与你在这里遇到的问题是正交的(因此也不是不相容的,没有理由你不能从两个方面来研究它,以防你抓住了一个,而错过了另一个)

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

    • 你关注的事情
    • 你传递到另一层的东西没有碰过
    • 现在,到目前为止,您提到的大部分内容都符合第一个分类。您忽略的cookie会被放入第二个cookie中,如果您使用Server.Execute或类似工具传递给另一个处理程序,则会查询和发布信息

      第二类是最有争议的

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

      另一方面,采用一种假设其他层存在安全漏洞的方法总是好的,即使是您自己编写的(尤其是您自己编写的!)

      中间立场是,如果可能存在5种不同的状态,一些持久性数据可能有效地处于其中,但当某个特定代码段被命中时,只有3种状态是有意义的,那么它可能会验证它是否处于这3种状态之一,即使这不会对该特定代码造成风险

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

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

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

      其中每一项都有一系列的法律价值

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

      因此,验证成为一个问题:

    • 确定我们将采取行动的投入
    • 确保输入的每个组件本身都是有效的
    • 确保组合有效(例如,不发送信用卡号可能有效,但不发送信用卡号但将付款类型设置为“信用卡”可能无效)
    • 现在,当我们谈到这一点时,通常最好不要试图抓住某些攻击。例如,在将要传递给SQL的值中避免使用
      ,这样做并不好。相反,我们有三种可能性:

    • 在值中包含
      ”是无效的,因为它不属于该值(例如,只能是“true”或“false”的值,或者来自一组值,其中没有一个包含
      )。在这里,我们抓住了一个事实,即它不在法律价值观的范围内,而忽略了攻击的确切性质(因此也受到了保护,免受我们甚至不知道的其他攻击!)

    • 它作为人工输入是有效的,但不是我们将使用的。这里的一个例子是一个很大的数字(在某些文化中,
      用于分隔数千个)。在这里,我们将“123456789”和“123'456'789”规范化为123456789,并且不在乎之前是什么样子,只要我们能够有意义地这样做(输入不是“fish”或超出本案法律值范围的数字)

    • 这是有效的输入。如果您的应用程序在名称字段中阻止撇号以试图阻止SQL注入,那么这就是一个错误,因为存在带有撇号的实名。在这里