php安全过滤是防止注入的第一道防线,不得大意。提到PHP的安全过滤,不得不提的两个东西是`set_magic_quotes_runtime` 和 `magic_quotes_gpc`。

`set_magic_quotes_runtime()` 可以让程序员在代码中动态开启或关闭 `magic_quotes_runtime`,`set_magic_quotes_runtime(1)` 表示开启, `set_magic_quotes_runtime(0)` 则表示关闭。当`set_magic_quotes_runtime(1)`时,从数据库或通过`fread`之类的函数读取的文本,将自动对' "和\自动 加上反斜杠\进行转义,防止溢出。这在对数据库的数据进行转移的时候非常有用。但在一般情况下,应当将其关闭,否则从数据库读取出来的数据单引 号、双引号和反斜杠都会被加上\,导致显示不正常。像Discuz,PHPWind都在公共文件的头部加上一句 `set_magic_quotes_runtime(0);` 强制关闭 `magic_quotes_runtime` 。

`magic_quotes_gpc` 和 `magic_quotes_runtime` 的区别在于,`magic_quotes_gpc` 是对通过GET、POST、COOKIE传递的数据进行转义,一般在数据入库前 要先进行转义,`magic_quotes_gpc`不能在代码中动态开启或关 闭,需要到`php.ini`将`magic_quotes_gpc`设置为on或off,代码中可以用`get_magic_quotes_gpc` 获取 `magic_quotes_gpc`的状态。当`magic_quotes_gpc`为off时,需要手工对数据进行addslashes,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (!get_magic_quotes_gpc()) {    
     add_slashes($_GET);
     add_slashes($_POST);
     add_slashes($_COOKIE);
}    
   
function add_slashes($string) {    
     if (is_array($string)) {    
         foreach ($string as $key => $value) {    
             $string[$key] = add_slashes($value);    
         }    
     } else {    
         $string = addslashes($string);    
     }    
     return $string;    
}

php防注入函数,字符过滤函数

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//解码
function htmldecode($str)
{
  if(empty($str)) return;
  if($str=="") return $str;
  $str=str_replace("select","select",$str);
  $str=str_replace("join","join",$str);
  $str=str_replace("union","union",$str);
  $str=str_replace("where","where",$str);
  $str=str_replace("insert","insert",$str);
  $str=str_replace("delete","delete",$str);
  $str=str_replace("update","update",$str);
  $str=str_replace("like","like",$str);
  $str=str_replace("drop","drop",$str);
  $str=str_replace("create","create",$str);
  $str=str_replace("modify","modify",$str);
  $str=str_replace("rename","rename",$str);
  $str=str_replace("alter","alter",$str);
  $str=str_replace("cas","cast",$str);
  $str=str_replace("&","&",$str);
  $str=str_replace(">",">",$str);
  $str=str_replace("&lt;","<",$str);
  $str=str_replace("&nbsp;",chr(32),$str);
  $str=str_replace("&nbsp;",chr(9),$str);
  //$str=str_replace("&#160;&#160;&#160;&#160;",chr(9),$str);
  $str=str_replace("&",chr(34),$str);
  $str=str_replace("&#39;",chr(39),$str);
  $str=str_replace("<br />",chr(13),$str);
  $str=str_replace("''","'",$str);
  return $str;
}
//编码
function htmlencode($str)
{
  if(empty($str)) return;
  if($str=="") return $str;
  $str=trim($str);
  $str=str_replace("&","&amp;",$str);
  $str=str_replace(">","&gt;",$str);
  $str=str_replace("<","&lt;",$str);
  $str=str_replace(chr(32),"&nbsp;",$str);
  $str=str_replace(chr(9),"&nbsp;",$str);
  //$str=str_replace(chr(9),"&#160;&#160;&#160;&#160;",$str);
  $str=str_replace(chr(34),"&",$str);
  $str=str_replace(chr(39),"&#39;",$str);
  $str=str_replace(chr(13),"<br />",$str);
  $str=str_replace("'","''",$str);
  $str=str_replace("select","sel&#101;ct",$str);
  $str=str_replace("join","jo&#105;n",$str);
  $str=str_replace("union","un&#105;on",$str);
  $str=str_replace("where","wh&#101;re",$str);
  $str=str_replace("insert","ins&#101;rt",$str);
  $str=str_replace("delete","del&#101;te",$str);
  $str=str_replace("update","up&#100;ate",$str);
  $str=str_replace("like","lik&#101;",$str);
  $str=str_replace("drop","dro&#112;",$str);
  $str=str_replace("create","cr&#101;ate",$str);
  $str=str_replace("modify","mod&#105;fy",$str);
  $str=str_replace("rename","ren&#097;me",$str);
  $str=str_replace("alter","alt&#101;r",$str);
  $str=str_replace("cast","ca&#115;",$str);
  return $str;
}
Original Link: http://ibillxia.github.io/blog/2010/09/24/PHP-string-filter-methods-for-safety/
Attribution - NON-Commercial - ShareAlike - Copyright © Bill Xia