Filter 黑名单与白名单的形式';输入过滤和验证

Filter 黑名单与白名单的形式';输入过滤和验证,filter,validation,whitelist,blacklist,Filter,Validation,Whitelist,Blacklist,对来自用户的输入进行消毒的首选方法是什么 谢谢大家! 就我个人而言,我衡量了允许或不允许的字符数,并从那里开始。如果允许的字符多于不允许的字符,则将其列入黑名单。还有白名单。我不相信有任何“标准”说你应该这样或那样做 顺便说一句,这个答案假设您想限制对表单字段(如电话号码或姓名)的输入:)@posterBelow最好的方法是使用存储过程或参数化查询。白名单是一种额外的技术,可以在注入到达服务器之前防止注入,但不应用作主要防御。黑名单通常是个坏主意,因为通常不可能过滤掉所有恶意输入 顺便说一句,这

对来自用户的输入进行消毒的首选方法是什么


谢谢大家!

就我个人而言,我衡量了允许或不允许的字符数,并从那里开始。如果允许的字符多于不允许的字符,则将其列入黑名单。还有白名单。我不相信有任何“标准”说你应该这样或那样做


顺便说一句,这个答案假设您想限制对表单字段(如电话号码或姓名)的输入:)@posterBelow

最好的方法是使用存储过程或参数化查询。白名单是一种额外的技术,可以在注入到达服务器之前防止注入,但不应用作主要防御。黑名单通常是个坏主意,因为通常不可能过滤掉所有恶意输入


顺便说一句,这个答案是考虑到你的意思是在防止sql注入时进行消毒。

答案通常是,这要视情况而定

对于具有明确定义的参数的输入(比如相当于下拉菜单),我会将选项列为白名单,忽略不属于这些选项的任何内容

对于自由文本输入,这要困难得多。我赞同这一学派的观点,即你应该尽可能地过滤它,使它尽可能安全(转义HTML等)。其他一些建议是明确禁止任何无效输入——然而,虽然这可能会防止攻击,但也可能会影响真正用户的可用性


我想这只是一个找到适合你的混合物的例子。我想不出任何一种解决方案能满足所有的可能性。主要取决于您的用户群。

只要可行,WL是针对BL的最佳实践


原因很简单:列举不允许的内容是不安全的,攻击者总能找到你没有想到的方法。如果你可以,说什么是允许的肯定,这是更简单,更安全

让我用几个问题和答案来解释你的问题

  • 黑名单与白名单限制

    一,。黑名单XSS和SQL注入处理根据负输入列表验证所需输入。基本上,人们会编制一份所有负面或负面条件的列表,并验证收到的输入不是负面或负面条件之一

    二,。白名单XSS和SQL注入处理根据可能的正确输入列表验证所需的输入。要做到这一点,需要编制一份所有良好/正输入值/条件的列表,并验证接收到的输入是否为正确条件之一

  • 哪一个更好

    一,。攻击者将使用任何可能的方法访问您的应用程序。这包括尝试所有类型的负面或不良条件、各种编码方法,以及将恶意输入数据附加到有效数据中。你认为你能想到每一个可能发生的错误排列吗

    二,。白名单是验证输入的最佳方式。你会准确地知道你想要什么,并且不会有任何坏的类型被接受。通常,创建白名单的最佳方法是使用正则表达式。使用正则表达式是一种提取白名单的好方法,而不是手动列出所有可能的正确值

    构建一个好的正则表达式。使用正则表达式并不意味着不接受错误的输入。确保您测试了正则表达式,并且正则表达式不能接受无效输入


  • 一般来说,最好使用白名单验证,因为只接受你知道应该输入的字符比较容易,例如,如果你有一个用户输入他/她的电话号码的字段,你可以只做一个正则表达式,检查接收到的值是否只是数字,删除所有其他内容,只存储数字。请注意,您还应该继续验证生成的数字。黑名单验证较弱,因为熟练的攻击者可以从OWASP“使用黑名单进行清理”中规避您的验证函数或发送您的函数未预期的值:

    消除或翻译字符(如HTML实体或删除引号),以确保输入“安全”。与黑名单一样,这种方法需要维护,而且通常是不完整的。由于大多数字段都有特定的语法,因此简单地验证一个正确的阳性测试比尝试为所有当前和将来的攻击包含复杂且缓慢的清理例程更简单、更快、更安全

    请认识到,此验证只是针对攻击的第一道防线。对于XSS,您应该始终“转义”您的输出,以便您可以打印所需的任何字符,但它们被转义,这意味着它们被更改为HTML实体,因此浏览器知道它是数据,而不是解析器应该解释的数据,从而有效地关闭所有XSS攻击。对于SQL注入,请在存储数据之前转义所有数据,尽量不要使用动态查询,因为它们是最容易利用的查询类型。尝试使用参数化存储过程。还要记住使用与连接必须执行的操作相关的连接。如果连接只需要读取数据,请创建一个仅具有“读取”权限的db帐户。这主要取决于用户的角色。有关更多信息,请查看从中提取此信息的链接:


    我认为白名单是理想的方法,但是我从未遇到过真正的白名单HTML表单验证。例如,下面是一个symfony 1.x表单,其验证来自:

    您无法看到的是,它在没有验证设置的情况下接受新输入,并且不检查是否存在未在表单中注册的输入。所以这是一个
    class ContactForm extends sfForm  
    {  
      protected static $subjects = array('Subject A', 'Subject B', 'Subject C');  
    
      public function configure()  
      {  
        $this->setWidgets(array(  
          'name'    => new sfWidgetFormInput(),  
          'email'   => new sfWidgetFormInput(),  
          'subject' => new sfWidgetFormSelect(array('choices' => self::$subjects)),  
          'message' => new sfWidgetFormTextarea(),  
        ));  
        $this->widgetSchema->setNameFormat('contact[%s]');  
    
        $this->setValidators(array(  
          'name'    => new sfValidatorString(array('required' => false)),  
          'email'   => new sfValidatorEmail(),  
          'subject' => new sfValidatorChoice(array('choices' => array_keys(self::$subjects))),  
          'message' => new sfValidatorString(array('min_length' => 4)),  
        ));  
      }  
    } 
    
    class ContactController {
        /**
        * @input("name", type = "string", singleLine = true, required = false)
        * @input("email", type = "email")
        * @input("subject", type = "string", alternatives = ['Subject A', 'Subject B', 'Subject C'])
        * @input("message", type = "string", range = [4,])
        */
        public function post(Inputs $inputs){
            //automatically validates inputs
            //throws error when an input is not on the list
            //throws error when an input has invalid value
        }
    }
    
    /**
    * @controller(ContactController)
    * @method(post)
    */
    class ContactForm extends sfFormX {
    
      public function configure(InputsMeta $inputs)  
      {
        //automatically binds the form to the input list of the @controller.@method
        //throws error when the @controller.@method.@input is not defined for a widget
        $this->addWidgets(
          new sfWidgetFormInput($inputs->name),  
          new sfWidgetFormInput($inputs->email),  
          new sfWidgetFormSelect($inputs->subject),  
          new sfWidgetFormTextarea($inputs->message)
        );
        $this->widgetSchema->setNameFormat('contact[%s]');  
      }  
    }