好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php 防止SQL注入的几种方法

SQL注入是可以通过一些sql语法上的处理不当导致数据库或网站权限给你拿到了,今天小编整理了一些常用的php mysql中的SQL注入防范方法吧.

使用php5.3或以上的版本我们可以直接使用PDO与mysqli处理数据

1.使用PDO(PHP Data Objects) ,代码如下:

$stmt  =  $pdo ->prepare( 'SELECT * FROM employees WHERE name = :name' );  $stmt ->execute( array ( ':name'  =>  $name ));  foreach  ( $stmt   as   $row ) {       // do something with $row   } 

2.使用mysqli, 代码如下:

$stmt  =  $dbConnection ->prepare( 'SELECT * FROM employees WHERE name = ?' );  $stmt ->bind_param( 's' ,  $name );  $stmt ->execute();  $result  =  $stmt ->get_result();  while  ( $row  =  $result ->fetch_assoc()) {       // do something with $row   }   //开源软件:phpfensi测试数据  

3.如果是php5.3以下版本我们可以使用ADDSLASHES和MYSQL_REAL_ESCAPE_STRING这些函数来处理,代码如下:

function  get_str( $string )  {       if  (!get_magic_quotes_gpc())      {           return   addslashes ( $string );      }       return   $string ;  } 

国内很多PHP coder仍在依靠addslashes防止SQL注入(包括我在内),我还是建议大家加强中文防止SQL注入的检查,addslashes的问题在于可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,所以addslashes无法成功拦截.

当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧.

最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[‘lastname’]进行检查一下.

再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:

mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用,否则只能用 mysql_escape_string,两者的区别是:

mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑.

如果是字符型就用addslashes()过滤一下,然后再过滤]%]和]_],代码如下:

$search = addslashes ( $search );  $search = str_replace ([_],]\_], $search );  $search = str_replace ([%],]\%], $search ); 

当然也可以加php通用防注入代码:

/*************************   PHP通用防注入安全代码   说明:   判断传递的变量中是否含有非法字符   如$_POST、$_GET   功能:   防注入   **************************/   //要过滤的非法字符   $ArrFiltrate = array (]‘],];],]union]);  //出错后要跳转的url,不填则默认前一页   $StrGoUrl =]";  //是否存在数组中的值   function  FunStringExist( $StrFiltrate , $ArrFiltrate ){  foreach  ( $ArrFiltrate   as   $key => $value ){  if  ( eregi ( $value , $StrFiltrate )){  return  true;  }  }  return  false;  }  //合并$_POST 和 $_GET   if (function_exists( array_merge )){  $ArrPostAndGet = array_merge ( $HTTP_POST_VARS , $HTTP_GET_VARS );  } else {  foreach ( $HTTP_POST_VARS   as   $key => $value ){  $ArrPostAndGet []= $value ;  }  foreach ( $HTTP_GET_VARS   as   $key => $value ){  $ArrPostAndGet []= $value ;  }  //开源软件:phpfensi测试数据   }  //验证开始   foreach ( $ArrPostAndGet   as   $key => $value ){  if  (FunStringExist( $value , $ArrFiltrate )){  echo  [alert(/]Neeao提示,非法字符/]);];  if  ( empty empty ( $StrGoUrl )){  echo  [history.go(-1);];  } else {  echo  [window.location=/]". $StrGoUrl .]/];];  }  exit ;  }  } 

保存为checkpostandget.php

然后在每个php文件前加include([checkpostandget.php[);即可

总结一下:

addslashes() 是强行加.

mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求.

mysql_escape_string不考虑连接的当前字符集.

查看更多关于php 防止SQL注入的几种方法的详细内容...

  阅读:40次