登陆验证注入:
//万能用户名失效
//万能密码 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] $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’, ‘[email protected]’,’工程师’,’34’,’3’)/*, ‘1‘);
这样就注册成为超级管理员了。但这种利用方法也有一定的局限性,比如,我没有需要改写的变量如grade字段是数据库的第一个字段,前面没有地方给我们注入,我们也没有办法了。
数据过滤:在接收字符串时把单引号之类的字符给过滤掉