当前位置:首页 > PHP教程 > php应用 > 列表

php 防止SQL注入的几种方法

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-13 11:26:58 浏览: 评论:0 

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

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

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

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

2.使用mysqli,代码如下:

  1. $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); 
  2. $stmt->bind_param('s'$name); 
  3. $stmt->execute(); 
  4. $result = $stmt->get_result(); 
  5. while ($row = $result->fetch_assoc()) { 
  6.     // do something with $row 
  7. }  //开源软件:phpfensi.com 

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

  1. function get_str($string
  2.     if (!get_magic_quotes_gpc()) 
  3.     { 
  4.         return addslashes($string); 
  5.     } 
  6.     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()过滤一下,然后再过滤”%”和”_”,代码如下:

  1. $search=addslashes($search); 
  2. $search=str_replace(“_”,”\_”,$search); 
  3. $search=str_replace(“%”,”\%”,$search); 

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

  1. /************************* 
  2. PHP通用防注入安全代码 
  3. 说明: 
  4. 判断传递的变量中是否含有非法字符 
  5. 如$_POST、$_GET 
  6. 功能: 
  7. 防注入 
  8. **************************/ 
  9. //要过滤的非法字符 
  10. $ArrFiltrate=array(”‘”,”;”,”union”); 
  11. //出错后要跳转的url,不填则默认前一页 
  12. $StrGoUrl=”"; 
  13. //是否存在数组中的值 
  14. function FunStringExist($StrFiltrate,$ArrFiltrate){ 
  15. foreach ($ArrFiltrate as $key=>$value){ 
  16. if (eregi($value,$StrFiltrate)){ 
  17. return true; 
  18. return false; 
  19. //合并$_POST 和 $_GET 
  20. if(function_exists(array_merge)){ 
  21. $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS); 
  22. }else
  23. foreach($HTTP_POST_VARS as $key=>$value){ 
  24. $ArrPostAndGet[]=$value
  25. foreach($HTTP_GET_VARS as $key=>$value){ 
  26. $ArrPostAndGet[]=$value
  27. //开源软件:phpfensi.com 
  28. //验证开始 
  29. foreach($ArrPostAndGet as $key=>$value){ 
  30. if (FunStringExist($value,$ArrFiltrate)){ 
  31. echo “alert(/”Neeao提示,非法字符/”);”; 
  32. if (emptyempty($StrGoUrl)){ 
  33. echo “history.go(-1);”; 
  34. }else
  35. echo “window.location=/”".$StrGoUrl.”/”;”; 
  36. exit

保存为checkpostandget.php

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

总结一下:

addslashes() 是强行加.

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

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

Tags: php防止SQL SQL注入

分享到: