【问题标题】:what is a good method to sanitize the whole $_POST array in php?在 php 中清理整个 $_POST 数组的好方法是什么?
【发布时间】:2011-04-08 09:22:56
【问题描述】:

我有一个包含很多变量的表单,然后它会发送一封电子邮件,而不是使用 filter_var($_POST['var'], FILTER_SANITIZE_STRING); 清理每个 $_POST 值,我追求的是一段更简单的代码。我想出了下面的方法,这似乎可行,因为我相信默认操作是FILTER_SANITIZE_STRING,但我只是想知道人们的意见是什么,如果这不是好的做法,也许你可以告诉我为什么?然后将 $_POST 值单独嵌入到新变量中,因此我只会在开始时使用 array_map 来清理所有内容...

$_POST = array_map('filter_var', $_POST);

谢谢你的回复,给你更多的信息,基本上:

我在一个表单中有 20-30 个输入字段正在被捕获, 然后将数据显示给用户以检查他们的输入, 然后清理变量, 然后向用户发送一封电子邮件 然后最后将详细信息输入到数据库中。

目前我在发送电子邮件之前使用上述 array_map 函数以及电子邮件地址上的 FILTER_SANITIZE_EMAIL 进行消毒,然后在插入数据库之前使用 mysql_real_escape_string() 转义输入。没有进入准备好的陈述等。你认为我应该做些什么额外的吗?再次感谢!

【问题讨论】:

标签: php arrays sanitization


【解决方案1】:

取决于它的用途。

如果您将其插入数据库,那么 mysql_real_escape_string() 用于引用字符串和类型转换用于数字将是可行的方法 - 理想情况下准备好的语句,但那是完全不同的事情。

如果您打算将数据输出到网页上,那么我会推荐类似htmlspecialchars()

如果您打算将用户输入用作 shell 参数,那么您将使用 escapeshellarg()

转到您关于发送电子邮件的问题。好吧,以下应该就足够了:

filter_var($_POST['message'], FILTER_SANITIZE_STRING);

所有这些基本上都是剥离标签和编码特殊字符。

【讨论】:

  • 好答案。我只是补充一点,如果您要允许用户对您的网页进行输入,请考虑使用 strip_tags() 来防止人们输入
  • 如果您使用的是 PHP 7 或更高版本,mysql_real_escape_string() 函数已被删除。请改用 PDO。 (为问题的新访问者发布此内容。)
【解决方案2】:

没有正确的方法来进行毯子卫生。您需要什么样的清理方法取决于对数据所做的处理。

在使用数据之前直接对其进行清理。

【讨论】:

  • 谢谢,我意识到了这一点,我只是想在不编写大量重复代码的情况下实现这一点......
  • @SirG: 意味着验证输入,但您应该只在数据离开 PHP 时对数据应用清理转换 - 并且该方法应该适合数据所在的位置进行中(mysql_real_escape_string()、htmlentities()、urlencode()、base64)_encode()、escapeshellarg()、addslashes()....等等都做不同的事情)
  • @symcbean,感谢您的回答,那么 filter_var 是否适合在通过 php 的邮件功能发送电子邮件之前应用?干杯。
  • 也许 - 您可以使用 filter_var 验证电子邮件地址 - 但您无法验证电子邮件的正文、主题或其他标题。 MTA 应该处理前者,但后者 2 都是标头注入的目标,这可能会危及您的应用程序。
【解决方案3】:

如果您的每个输入变量的类型都是字符串,并且您想一次性清理它们,您可以使用:

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

这将清理您的 $_GET 和 $_POST 数组。

在这里看到:PHP -Sanitize values of a array

【讨论】:

    【解决方案4】:

    这是我在所有项目中使用的:

    function util_array_trim(array &$array, $filter = false)
    {
        array_walk_recursive($array, function (&$value) use ($filter) {
            $value = trim($value);
            if ($filter) {
                $value = filter_var($value, FILTER_SANITIZE_STRING);
            }
        });
    
        return $array;
    }
    

    它允许修剪和清理发布数据的嵌套数组

    【讨论】:

      【解决方案5】:

      要对多个字段应用特定过滤器,请使用switch 语句。

      $post  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
      
      foreach($post as $k => $v) {
          switch ($k) {
              case 'int_1':
              case 'int_2':
                  $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_INT) * 1;
                  break;
              case 'float_1':
              case 'float_2':
                  $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) * 1;
                  break;
              default:
                  break;
          }
      }
      

      注意:我的 IDE (NetBeans) 警告在任何地方使用全局 $_POST 会违反安全规定,因此我刚刚养成了使用本地 $post 变量的习惯。如果您选择不先清洁毛毯,FILTER_SANITIZE_STRING 可用于 default: 案例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 2011-03-25
        • 2012-04-04
        • 1970-01-01
        • 2011-09-06
        相关资源
        最近更新 更多