首页 > 网站 > 建站经验 > 正文

php 防止SQL注入的几种方法

2024-04-25 20:35:45
字体:
来源:转载
供稿:网友

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

}

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;

}

}

//验证开始

foreach($ArrPostAndGet as $key=>$value){

if (FunStringExist($value,$ArrFiltrate)){

echo “alert(/”Neeao提示,非法字符/”);”;

if (emptyempty($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不考虑连接的当前字符集.

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表