php防止SQL注入

//永远不要相信用户的输入,为了防止黑客在我们的表单,GET,header头中输入一些恶意的SQL,为此,我们需要在后台进行执行SQL代码的时候进行对SQL注入的预防

//那么首先来说一下什么是SQL注入
//案例一
http://localhost/cacos/index.php?id=1
select * from goods where id=1
//我们通过GET来进行传递参数,查询数据库中goods表中id=1的数据,这样的查询是非常正常的,来看看我们后台的代码
$id=$_GET['id'] ? $_GET['id'] : "";
if(empty($id)){
	echo "goods‘’s id is not null";
}
//可以看出来,我们在后台是没有对传递过来的参数进行过滤的,所以,黑客往往可以对SQL进行SQL注入,达到恶意攻击的效果
select * from goods where id=-1 OR 1=1
//这个SQL前面部分id=-1是永远不可能存在的,因为ID为一个整形,所以前面的部分返回false,然而后面的1=1这块SQL返回值为true,所以这条SQL的返回永远为true,这样的话,这条SQL将会变为
select * from goods;  //就会查出全表的数据,这样并不是我们想要的结果,那么我们怎么防止用户这样输入呢
//在后台执行SQL前,对传递过来的参数进行校验
is_numeric():判断是否为一个数字
$id=$_GET['id'] ? $_GET['id'] : "";
if(empty($id) || !is_numeric($id) || preg_match("/^[1-9][0-9]*$/",$id)){
	echo "id为空或者不是一个数字或不为正数";
}
//这样校验就会达到防止用户恶意输入的效果


//上面是最基本的SQL注入,SQL注入还可以通过mysql的注释符: #,-- ,来通过截止注释符号后面的SQL语句,一般用来攻击公司后台,用户账号等。
//我们来模拟一个表单
$username=$_GET['username'];
$password=md5($_GET['password']);
if(empty($username) || empty($password)){
	echo "username or password is not null";
}
$sql="select * from user where username={$username} and password={$password}";
//这样的SQL实际上是没有什么问题的,但是在经过处理之后,就会变成
$sql="select * from user where username={$username}# and password={$password}";
//在加了一个#注释符后,SQL语句就不会执行后面对密码的查询,或者是,
$sql="select * from user where username={$username}--  and password={$password}";
//处理的方法为:
//1.使用mysqli_real_escape_string  和 addslashes函数,函数结果相同
$username=addslashes($username); 
$username=mysqli_real_escape_string("数据库",$username);
//对where条件比较靠前的,采用SQL语句转义,输出的结果为
select * from user where username=$username and password='123213213';
//这样运行SQL注入后,SQL就会变为
$sql_carry=select * from user where username='Abel_jiawei'# and password='123213123';
//通过转移符,控制SQL语句
$new_sql=select * from user where username='Abel_jiawei'\'#' and password='123213312';
//2.运用PHP正则表达式匹配
preg_match("/^[a-zA-Z0-9]{6,}$/",$username)  //PHP正则表达式验证
//3.如果用户输入中含有','',",这样的值,使用str_replace函数过滤
str_replace(要过滤的值,改变成什么,对谁)
$username=str_replace(''','',$username);
//这样的话再执行SQL,当用户输入->Abel_jiawei',这样的值也就不会出错了;



//原创文章,请勿转载!!!谢谢!!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值