1

可能重复:
最好的 PHP 输入清理功能是什么?

不久前,我发现了这个,我认为很棒的代码片段,用于过滤来自注入的 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...

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

4

5 回答 5

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;
}
于 2012-12-12T07:51:08.987 回答
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);
   }
}
于 2012-12-12T07:41:05.517 回答
0

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

function filter($data) {
    if(is_array($data)) {
        foreach($data as $key => $value) {
            // Do stuff...
        }
    } else {
        // Do stuff...
    }
}
于 2012-12-12T07:43:00.990 回答
0

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

于 2012-12-12T07:47:41.573 回答
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');
于 2012-12-12T07:54:58.270 回答