【问题标题】:PHP -Sanitize values of a arrayPHP - 清理数组的值
【发布时间】:2011-06-19 03:56:18
【问题描述】:

我有一个数组,它来自$_POST[],并且可以在其中包含其他数组作为值,例如:

array(
 'title' => 'Title',
 'data' => array(
             'hdr' => 'Header'
             'bdy' => 'Body'
           ),
  'foo' => array(1, 23, 65),
  ...
)

如何清理这个大数组的所有值? 例如。将strip_tags() 应用于TitleHeaderBody123等值强>、65等?

【问题讨论】:

  • 我希望你不要使用这种清理思想来进行 SQL 转义
  • 不,这是在将其插入 SQL 之前完成的

标签: php arrays multidimensional-array sanitization


【解决方案1】:

这看起来不错,但如果可以改进或有任何疑虑,请发表评论:

$_GET =filter_var_array($_GET);
$_POST=filter_var_array($_POST);

【讨论】:

    【解决方案2】:

    假设我们要清理 $_POST 数组:

    foreach($_POST as $k=>$v) {$_POST[$k] = htmlspecialchars($v);}

    就这么简单。不是吗?

    【讨论】:

    • 1) 这不会递归工作,这是问题的关键点。 2) 从不 清理输入端的值。始终在 output 端对它们进行清理,因为它是定义要求的输出(无论是 html、数据库、xml、json 等)。例如,上面的代码很可能会导致 SQL 注入攻击。
    • 问题不在于清理 SQL 注入。这是为了剥离标签。我认为为此目的使用 Prepared Statement 会更好。我写的代码并没有去除标签,它只是将那些 html 特殊字符重写为displayable format 格式例如:“&eacute”。当然你可以用 strip_tags 替换 htmlspecialchars。取决于你想做什么!
    • Prepared statements 确实可以防止 SQL 注入,但它们也是一种在输出端而不是输入端进行清理的形式。永远不要对输入进行消毒,当然永远不要both :)。预期的目标是使输出到 HTML 中的事情变得理智,而不是为了其他任何潜在目的而破坏它们。如果人们更关心 XSS 攻击而不是 SQL 注入,那么这段代码就是 magic_quotes_gpc 的样子。这是坏的。不要这样做。不要做任何类似的事情。
    【解决方案3】:
    function strip($string, $allowed_tags = NULL)
    {
        if (is_array($string))
        {
            foreach ($string as $k => $v)
            {
                $string[$k] = strip($v, $allowed_tags);
            }
            return $string;
        }
    
        return strip_tags($string, $allowed_tags);
    }
    

    只是一个递归函数的例子,在这种情况下用于剥离标签。

    $arr = strip($arr);
    

    【讨论】:

      【解决方案4】:

      看看array_map

      <?php  
      $a = array(
      'title' => 'Title',
      'data' => array(
          'hdr' => 'Header',
          'bdy' => 'Body'
          ),
      'foo' => array(1, 23, 65)
      );
      
      $b = array_map("strip_tags", $a);
      print_r($b);
      ?>
      

      二维数组更新:

      function array_map_r( $func, $arr )
      {
          $newArr = array();
      
          foreach( $arr as $key => $value )
          {
              $newArr[ $key ] = ( is_array( $value ) ? array_map_r( $func, $value ) : ( is_array($func) ? call_user_func_array($func, $value) : $func( $value ) ) );
          }
      
          return $newArr;
      }
      

      用法:

      $a = array(
      'title' => 'Title',
      'data' => array(
          'hdr' => 'Header',
          'bdy' => 'Body'
          ),
      'foo' => array(1, 23, 65)
      ); 
      
      $ar =array_map_r('strip_tags', $a);
      print_r($ar);
      

      注意,我只是通过在 cmets 中搜索 Dimension 发现的

      【讨论】:

      • 但我得到了Warning: strip_tags() expects parameter 1 to be string, array given。我认为它不适用于 2nd level+ 数组...
      • @Col。弹片:实际上根据 php.net array_walk_recursive() - Any key that holds an array will not be passed to the function. 我只是在测试 array_walk_recursive() 行为,它与上面的解决方案完全不同,而且 array_walk_recursive() 似乎也有问题。
      【解决方案5】:

      只需使用filter extension

      /* prevent XSS. */
      $_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
      $_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
      

      这将清理您的 $_GET$_POST

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        相关资源
        最近更新 更多