PHP输入消毒剂?

PHP input sanitizer?

什么是一些好的PHP html(输入)清洁剂?

最好是,如果内置了某些东西 - 我希望我们这样做。

更新:

根据请求,通过注释,输入不应该允许HTML(显然阻止XSS和SQL注入等)。


html净化器 - > http://htmlpurifier.org/


使用

1
 $input_var=sanitize_input($_POST);

和功能在下面,几乎消毒你需要的东西

1
2
3
4
5
6
7
8
9
10
11
12
13
function sanitize($var, $santype = 1){
     if ($santype == 1) {return strip_tags($var);}
     if ($santype == 2) {return htmlentities(strip_tags($var),ENT_QUOTES,'UTF-8');}
     if ($santype == 3)
     {
      if (!get_magic_quotes_gpc()) {
       return addslashes(htmlentities(strip_tags($var),ENT_QUOTES,'UTF-8'));
      }
      else {
         return htmlentities(strip_tags($var),ENT_QUOTES,'UTF-8');
      }
     }
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    function sanitize_input($input,$escape_mysql=false,$sanitize_html=true,
             $sanitize_special_chars=true,$allowable_tags='<p>
'
)
    {
      unset($input['submit']); //we use 'submit' variable for all of our form

      $input_array = $input;

      //array is not referenced when passed into foreach
      //this is why we create another exact array
      foreach ($input as $key=>$value)
      {
       if(!empty($value))
       {
        $input_array[$key]=strtolower($input_array[$key]);
        //stripslashes added by magic quotes
        if(get_magic_quotes_gpc()){$input_array[$key]=sanitize($input_array[$key]);}

        if($sanitize_html){$input_array[$key] = strip_tags($input_array[$key],$allowable_tags);}

        if($sanitize_special_chars){$input_array[$key] = htmlspecialchars($input_array[$key]);}    

        if($escape_mysql){$input_array[$key] = mysql_real_escape_string($input_array[$key]);}
       }
      }

      return $input_array;

    }

记住:它不会清理多维数组,你需要递归地修改它。


如果你想运行一个使用let说的$_GET['user']的查询,一个很好的解决方案是使用mysql_real_escape_string()做这样的事情:

1
2
3
4
5
6
7
8
<?php

    $user = mysql_real_escape_string($_GET['user']);
    $SQL ="SELECT * FROM users WHERE username = '$name'";

    //run $SQL now
    ...
?>

如果要将文本存储在数据库中,然后将其打印在网页上,请考虑使用htmlentities

[编辑]或者像awshepard所说,你可以使用addslashes()和stripslashes()函数[/ Edit]

以下是防止XSS攻击的一个小清理示例:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    $str ="A 'quote' is bold";

    //Outputs: A 'quote' is bold
    echo $str;

    // Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
    echo htmlentities($str);

    // Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
    echo htmlentities($str, ENT_QUOTES);
?>


我一直使用PHP的addslashes()和stripslashes()函数,但我也看到了内置的filter_var()函数(链接)。 看起来有很多内置的过滤器。