防止sql注入属于安全性的工作;
1. 服务器端进行配置:magic_quotes_gpc设置为on,在php.ini中设置;
如果设置后,针对$sql="select * from users where username='$username'and password ='$password'"就会失效;
但是针对$sql="select * from users where username=$usernameand password =$password"还是会生效;
而且如果程序员没有修改服务器端配置的权利,那么也不能这样预防;
如何从程序角度考虑?
1. 密码比对:通过用户输入的用户名去查询数据库,如果查询到对应的密码,则和用户提交的密码进行比对,相同则说明合法,反之非法;
$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:Manageusers.php");
}else{
echo "你输入的密码不正确<a href='Login.php'>返回重新登陆</a>";
}
}else{
echo"你输入的用户名不存在<a href='Login.php'>返回重新登录</a>"
}
2.PDO方式,使用PDO::prepare()预处理操作,防止sql注入漏洞;在php.ini中启用pdo;在extention=mysql前面去掉;
$myPdo=new PDO("mysql:host=localhost;port=3306;dbname=spdb","root","root");
$myPdb->exec("set names utf-8");
$pdoStatment= $myPdo->prepare($sql);
$pdoStatment->execute(array($username,$password));
$res=$pdoStatment->fetch();
if(empty($res)){
echo"用户名密码错误<a href='Login.php'>返回</a>"
}else{
header("Location:ManageUsers.php");
}
$sql="select * from users where username=? and password =?"
3.入侵检测系统,应用IDS可以提供对sql的保护,并监视数据库和其他应用;
另外在搜索引擎中,由于查询使用模糊查询,虽然只读不会破坏数据库,但是不加控制的话会影响效率,同时存在泄露隐私的可能。
1.关键字使用addslashes方法:$keyword=addslashes($keyword);
2.关键字加转义符:$keyword=str_replace("_","\_",$keyword);
$keyword=str_replace("%","\%",$keyword);