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注入的几种方法的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did29801