PHP / MySQL:过滤POST&获取数据

时间:2012-12-12 07:34:08

标签: php mysql

  

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

前段时间我发现了这个,我认为很棒,在某些代码中代码片段来过滤POST并从注入中获取数据。

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...

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

5 个答案:

答案 0 :(得分:4)

以下是您需要的功能:

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;
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您应该检查输入是否是数组。如果是这样,请为每个数组成员循环并剥离标记,否则,只需为输入剥去标记。

答案 4 :(得分:0)

你可以使用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');