首页 > 技术文章 > sql注入以及防范

jinshiyill 2015-10-12 17:23 原文

登陆验证注入:

//万能用户名失效

//万能密码 xx' or 1='1

//万能用户名 xxx' union select * from users/* 

$sql="select * from users where username='$username' and password='$password'";

 

//万能密码 33 union select * from users

//万能用户名 89 union select * from users;/* 

$sql="select * from users where username=$username and password=$password";//$username不加‘’,只能表示数字,否则sql语句有错,这种写法不可以使用

 

/*

* 防范:

* 1:服务器配置  设置php.ini的magic_quotes_gpc为on

* 2:密码比对

* 3:pdo  php.ini   php_pdo_XXSQL.dll

* 4:入侵检测系统IDS

* */

 

密码比对防止注入

$sql="select password from users where username='$username'";

$res=mysql_query($sql,$conn);

 

if($row=mysql_fetch_array($res)){

if($row[0]==$password){

header("Location:ManageUser.php");

}else{

echo "密码有误";//改成用户名或密码有误

}

}else{

echo "error,<a href='Login.php'>返回</a>";

}

 

 

pdo防范

 

$sql="select * from users where username=? and password=?";

//创建pdo对象

$myPdo= new PDO("mysql:host=localhost;port=3306;dbname=spdb","root","root");

 

//设置编码

$myPdo->exec("set names utf8");

 

//预处理

$pdoStatement=$myPdo->prepare($sql);

 

//填入用户名和密码

$pdoStatement->execute(array($username,$password));

 

//取出结果

$res=$pdoStatement->fetch();

 

if(empty($res)){

echo "error,<a href='Login.php'>返回</a>";

}else{

     header("Location:ManageUser.php");

}

 

防止查询(搜索)注入:

//对关键字进行过滤

$keyWord=addslashes($keyWord);

$keyWord=str_replace("%","\%",$keyWord);

$keyWord=Str_replace("_","\_",$keyWord);

 

$sql="select * from users where username like '%$keyWord%'";

 

if(!empty($keyWord)){

    $res=mysql_query($sql,$conn) or die("不能完成查询".mysql_error());

$flag=0;

while($row=mysql_fetch_array($res)){

$flag=1;

echo "<br/>$row[0]&nbsp;&nbsp;&nbsp;$row[1]";

}

if($flag==0){

echo "你的关键词有误";

}

}else{

echo "请输入";

}

 

插入insert注入

其中的grade代表用户的等级,1是普通用户,2是普通管理员,3是

超级管理员,我们在注册一个用户的时候,默认是普通用户:sql语句:

INSERT INTO `users` (username, password, email, job,sal,grade) VALUES ( '$username', '$password', '$email',’$job’,’$sal’ '1');

 

填入的值 34‘, ’3’)/*   对应的sql语句就是:

INSERT INTO `users` (username, password, email, job,sal,grade) VALUES ( ‘xiaoming’, ‘xiaoming’, ‘xiaoming@sohu.com’,’工程师’,’34’,’3’)/*, '1');

这样就注册成为超级管理员了。但这种利用方法也有一定的局限性,比如,我没有需要改写的变量如grade字段是数据库的第一个字段,前面没有地方给我们注入,我们也没有办法了。

 

 

数据过滤:在接收字符串时把单引号之类的字符给过滤掉

当程序员不容易啊,真希望有个程序员鼓励师来鼓励一下,O(∩_∩)O哈哈~

推荐阅读