入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

php 防止sql注入的方法和步骤

创建时间:2015-01-16 投稿人: 浏览次数:429
要防止sql注入,最主要的就是对用户输入的数据类型进行检查和对数据进行转义,向 MYSQL 提交正确的数据,这是防止sql注入的根本。

所以在获取到用户提交的数据后,应该进行如下操作:

1、利用addslashes() 函数将 单引号 (")、双引号 (")、反斜杠 ()、NULL等字符添加反斜杠进行转义。

if(get_magic_quotes_gpc()){
  $str = $_GET["name"];    
}else{
  $str = addslashes($_GET["name"]); //要转义的参数一定为字符串,如果为数组那需要循环把数组里面的每一项都进行转义
}
或者
if(!get_magic_quotes_gpc()){ //php.ini中没有打开magic_quotes_gpc设置
	$_GET  = addslashes($_GET);
	$_POST = addslashes($_POST);
	$_REQUEST = addslashes($_REQUEST);
}

2、严格的数据类型验证
   
   如果明确知道参数应该为数字或数字字符串,那么一定要用is_numeric()验证,intval()强制类型转换。
  
   如果参数为字符串,那么根据实际需要检查是否存在有危害的字符:

if (eregi("select|insert|update|delete|"|/*|*|../|./|union|into|load_file|outfile", $str)){
	exit("参数不合法");
}

3、给sql语句中包含的变量加引号

$sql = "select * from user where uid = "$uid"";

$sql = "select * from user where uid = $uid";

如果传过来的$uid为 1; delete from article 那么我们上面的两个sql就变为:

$sql = "select * from user where uid = "1; delete from user"";

$sql = "select * from user where uid = 1; delete from user";

很显然第二个sql,执行了两条语句,user表被清空.

两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$uid放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格或分号,那空格后的内容都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯.

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。