PHP防恶意用户输入

1. 过滤影响SQL正常运行的字符。

1) 过滤影响MySQL正常运行的字符。

当需要把用户输入的内容(有可能包含单引号、双引号 、反斜线、空字元 NULL )代入到mysql的语句 中执行时,应该把php.ini中的magic_quotes_gpc项设成On。

如果php.ini中的此项设成Off时,也可用php的函数addslashes()达到相同的目的,但这两种手段不能同时使用,否则会出现重复替换,出现错误。

样例:

PHP代码
  1. <?php      
  2. if (get_magic_quotes_gpc()) {   
  3.     $content=$_POST["content"];   
  4. } else {   
  5.     $content=addslashes($_POST["content"]);   
  6. }   
  7. ?>  

当然,如果php.ini中的magic_quotes_gpc项为On,但有时又不想转义某项的特殊字符,可以使用stripslashes()去掉其中的 \

使用get_magic_quotes_gpc特别需要注意的一点是,get_magic_quotes_gpc对$_REQUEST的变量不起作用,也就是说即使get_magic_quotes_gpc的状态为开启,$_REQUEST的变量也不会自动转义

2) 过滤影响MSSQL正常运行的字符。

当需要把用户输入的内容(有可能包含单引号)代入到mssql的语句中执行时,应该把php.ini中的magic_quotes_sybase项设成On,此时magic_quotes_gpc项不再生效。

如果php.ini中的此项设成Off时,php中并没有合适的函数达到相同的目的,只能使用字符串替换函数来达到此目的。

样例:

 

PHP代码
  1. <?php   
  2. $content=str_replace("'","''"$_POST["content"]);   
  3. ?>   

现在PHP既要访问mysql又要访问mssql,php.ini中的设置不能兼顾两种数据库,所以只对mysql做了相应设置。

2. 应对用户输入包含SQL语句的一个措施。

以下两种SQL写法都比较普遍,但安全程度是不同的,当用户提交的$id='1 and 1=2 union select ...'时第一种就会显示出不该显示的数据,而第二种就相对安全些。

SQL代码
  1. Select * FROM article Where articleid=$id   
  2. Select * FROM article Where articleid='$id'  

 

3. 防止用户输入的内容因包含html标签或javascript而影响页面的正常显示。

可以用htmlspecialchars()过滤其中的 & " < >

PHP代码
  1. $content=htmlspecialchars($content);  

4. 当页面要显示的内容包含回车换行时,可以使用nl2br()来达到页面上换行的效果。