【问题标题】:PHP/MySQL: Filtering POST & GET Data [duplicate]PHP/MySQL:过滤 POST 和 GET 数据
【发布时间】:2012-11-29 20:57:02
【问题描述】:

可能重复:
What are the best PHP input sanitizing functions?

不久前我发现了这个,我认为很棒,在某人的代码中 sn-p 以过滤来自注入的 POST 和 GET 数据。

function filter($data) { //Filters data against security risks.
    $data = trim(htmlentities(strip_tags($data)));
    if(get_magic_quotes_gpc()) $data = stripslashes($data);
    $data = mysql_real_escape_string($data);
    return $data;
}
foreach($_GET as $key => $value) $filterGet[$key] = filter($value);
foreach($_POST as $key => $value) $filterPost[$key] = filter($value);

从那以后我就一直在使用它。但是今天,在通过 ajax 发送数组时,我遇到了很多错误。大部分人说strip_tags() expects parameter 1 to be string, array given in...

过滤数据的最佳方法是什么?所有这些数据都将进入数据库。但是,它不进入数据库的情况呢?

【问题讨论】:

  • 错误信息中有什么不清楚的地方?

标签: php mysql


【解决方案1】:

这是你需要的功能:

function filter($data) { //Filters data against security risks.
    if (is_array($data)) {
        foreach ($data as $key => $element) {
            $data[$key] = filter($element);
        }
    } else {
        $data = trim(htmlentities(strip_tags($data)));
        if(get_magic_quotes_gpc()) $data = stripslashes($data);
        $data = mysql_real_escape_string($data);
    }
    return $data;
}

【讨论】:

  • 也是解决问题的好方法。
  • 你是对的,你也会过滤和多维数组。我将不得不为您更改正确答案。这样更好。
【解决方案2】:

正如错误消息所清楚的那样,在通过 GET/POST 传递数组的情况下会发生这种情况。对于这种情况,您可以解析数组的每个值。

foreach($_GET as $key => $value){
   if(is_array($value)){
       foreach($value as $val){
           $filterGet[$key][] = filter($val);
       }
   }
   else{
         $filterGet[$key] = filter($value);
   }
}

【讨论】:

  • 如果是多维数组呢?它会抛出同样的错误!
  • @jackflash Karan 提供的代码支持多维数组。
  • @AndrewSpear 不。该代码根本不是递归的,因此它无法处理多个嵌套数组。
  • @jackflash 我将“foreach”和“filter”误读为“function”!您希望将所有这些都包装在一个函数中并递归调用它,而不是执行第二个 foreach()。
  • @jackflash 这就是你的解决方案所做的,干得好!
【解决方案3】:

你应该首先检查 $data 是否是你需要的正确格式。你描述的是一个数组被传递到你的函数的 $data 参数中,PHP 需要你把它分解成一个字符串。需要一些额外的逻辑,例如:

function filter($data) {
    if(is_array($data)) {
        foreach($data as $key => $value) {
            // Do stuff...
        }
    } else {
        // Do stuff...
    }
}

【讨论】:

    【解决方案4】:

    您应该检查输入是否为数组。如果是这样,循环它并为每个数组成员去除标签,如果不是,那么只需去除输入的标签。

    【讨论】:

      【解决方案5】:

      你可以使用 array_walk

      <?php
      function wsafe(&$value,$key)
      {
          return safe($value);
      }
      function safe($value)
      {
          if(is_array($value))
          {
              foreach($value as $key=>$val)
              {
                  $value[safe($key)] = safe($val);
              }
          }
          else
          {
              $value = trim(htmlentities(strip_tags($value)));
              if(get_magic_quotes_gpc()) $value = stripslashes($value);
              $value = mysql_real_escape_string($value);
          }
      }
      array_walk($_POST,'wsafe');
      array_walk($_GET,'wsafe');
      

      【讨论】:

        猜你喜欢
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 2012-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多