【问题标题】:PHP: what could cause FILTER_UNSAFE_RAW to return FALSE?PHP:什么可能导致 FILTER_UNSAFE_RAW 返回 FALSE?
【发布时间】:2018-06-03 17:52:09
【问题描述】:

在久违的回到剧本后,我陷入了一次突然失败的清理工作。
我在过滤器意外返回false 中发现了问题。

这是一个复制我的意外结果的示例:

$test = [ 'apple', 'bananna', 'orange', 'lime', 'grape', ];
var_export( filter_var( $test, FILTER_UNSAFE_RAW ));  // false

我认为FILTER_UNSAFE_RAW 应该只返回输入(在本例中为数组)不变。
我的理解/方法错了吗?

注意:
我的代码必须严格自力更生并尽可能轻量级,因此我只是在需要的地方编写简单的辅助函数,而不是加载第 3 方库/类。

示例:

$filters = [
    'sanitize' => [ 
        'foo' => FILTER_SANITIZE_EMAIL,
        'bar' => FILTER_UNSAFE_RAW,
    ],
    'validate' => [
        'foo' => FILTER_VALIDATE_EMAIL,
        'bar' => [
            'filter' => FILTER_VALIDATE_REGEXP,
            'flags' => FILTER_REQUIRE_ARRAY,
            'options' => [ 'regexp' => '/(apple|grape)/' ],
        ],
    ],
];

$test = [
    'malicious' => 'something bad',
    'foo' => 'test@ema.il',
    'bar' => [ 'apple', 'grape', 'orange', ],
];

// validate
$checked = sanitizeInput( $filters, $test );

// sanitizer
function sanitizeInput( $f, $input )
{
    // sanitize
    $sanitized  = filter_var_array( $input, $f['sanitize'] )

    // validate
    $validated  = filter_var_array( $sanitized, $f['validate'] );

    // if anything appears to have failed validation (was set to FALSE)
    if( FALSE !== strpos( json_encode($validated), 'false' ))
    {
        ...

如您所见,这种方法要求 bar 通过清理,即使不需要进行清理操作。

我是不是误会FILTER_UNSAFE_RAW

【问题讨论】:

    标签: php sanitization filter-var input-sanitization


    【解决方案1】:

    过滤器标志丢失

    您似乎没有为filter_var_array 的清理部分添加正确的标志

    无论何时处理数组,都必须包含标志FILTER_REQUIRE_ARRAY

    因此,如果没有标志,您将收到 false 的响应

    注意: FILTER_UNSAFE_RAW 只是选择性地去除或编码特殊字符。这也是默认过滤器。

    示例

    $test['bar'] = array( 'apple', 'bananna', 'orange', 'lime', 'grape' );
    
    $san['bar'] = [
      'filter' => FILTER_UNSAFE_RAW,
      'flags'  => FILTER_REQUIRE_ARRAY
    ];
    
    print_r(filter_var_array( $test, $san ));
    

    输出

    Array
    (
        [bar] => Array
            (
                [0] => apple
                [1] => bananna
                [2] => orange
                [3] => lime
                [4] => grape
            )
    
    )
    

    编辑的工作代码

    $filters = [
        'sanitize' => [ 
            'foo' => FILTER_SANITIZE_EMAIL,
            'bar' =>  [
                'filter' => FILTER_UNSAFE_RAW,
                'flags'  => FILTER_REQUIRE_ARRAY
            ],
        ],
        'validate' => [
            'foo' => FILTER_VALIDATE_EMAIL,
            'bar' => [
                'filter' => FILTER_VALIDATE_REGEXP,
                'flags' => FILTER_REQUIRE_ARRAY,
                'options' => [ 'regexp' => '/(apple|grape)/' ],
            ],
        ],
    ];
    
    $test = [
        'malicious' => 'something bad',
        'foo' => 'test@ema.il',
        'bar' => [ 'apple', 'grape', 'orange', ],
    ];
    
    // validate
    $checked = sanitizeInput( $filters, $test );
    
    // sanitizer
    function sanitizeInput( $f, $input ) {
      
        // sanitize
        $sanitized  = filter_var_array( $input, $f['sanitize'] );
    
    print_r($sanitized);
    
        // validate
        $validated  = filter_var_array( $sanitized, $f['validate'] );
    
        // if anything appears to have failed validation (was set to FALSE)
        if( FALSE !== strpos( json_encode($validated), 'false' )) {}
    
        return $validated;
    }
    

    【讨论】:

      【解决方案2】:

      它返回 false,因为 filter_var() 无法验证数组。而filter_var_array() 就像对每个主题数组的值运行filter_var()。您可以尝试在sanitize 数组中使用数组作为bar 的值,FILTER_UNSAFE_RAW 作为过滤器,FILTER_REQUIRE_ARRAY 作为标志

      'sanitize' => [ 
          'foo' => FILTER_SANITIZE_EMAIL,
          'bar' =>  [
                  'filter' => FILTER_UNSAFE_RAW,
                  'flags'  => FILTER_REQUIRE_ARRAY
                  ],
      ],
      

      要注意的另一件事是,由于您只使用FILTER_UNSAFE_RAW 而不指定标志,因此它什么也不做。所以不消毒也是一样的。虽然它不适用于您的案例,因为它不会传递给验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        相关资源
        最近更新 更多