1.对用户登录进行验时的sql写成
$name = $_POST[‘name’];
$password = $_POST[‘password’];
$query = “select * from t_user where name=’$name’ and password=’$password’ ”;
可注入方式:
(1)万能密码:xx’ and 1=1
(2)万能用户名 xx’ union select * from t_user/*
其中/*在sql语句中表示之后的字符都不要管了,只用/*之前的字符作为sql语句进行查询。
防范
(1)服务器配置。php.ini文件中magic_quote_gpc=on ,即对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes(),即对数据中某些特殊字符加\进行转义,如单双引号\反斜线与null
(2)密码对比。即根据用户名在数据库中取出密码再同$password进行对比。
$query = “select password from t_user where name=’$name’ ”;
(3)pdo的预处理
$pdoHandle = new PDO(“mysql:host=localhost;port=3306; dbname=test”, “username”, “password”);
$pdoHandle->exec(“set names utf8”);
$pdoStatment = $pdoHandle->prepare(“select * from t_user where name=? And password=? ”);
pdoStament->execute(array($name, $password));
$result = pdoStament->fetch();
2.php搜索此擎中的sql注入问题
如写成:
$key = $_POST[‘key’];
$query = “select * from t_product where name like ‘%$key%’”;
可注入方式:
(1)用户输入的关键字是%或___等sql的通配符就可以查到所有信息了。、
防范:
1对$key进行特殊字符过虑。
$key = addslashes($key),即某些特殊字符加\进行转义,如单双引号、反斜线与null。
$key = preg_replace(‘/%/’, ‘\%’, $key); 对通配符%进行替换
$key = preg_replace(‘/_/’, ‘\_’, $key); 对通配符_进行替换