sql注入一点小心得
更多关于PHP技术文章:胡旭个人博客 - php专栏?好久没写技术博客,最近研究产品关于用户体验方面较多,加上项目突然比较多,设计原型、跟进开发、设计师等工作着实没时间写博客。 接下来技术上主要php深入学习和mysql优化。这两天看了关于sql注入方面的知识,拿出来分享一下 :) 登录注入?
$sql = "select * from users where username = '$username' and password = '$password'";
对于这种sql,对应一个万能密码和用户名:
万能密码: xx' or 1='1 万能用户名: xx' union select * from users/*? 执行时mysql解释为:$sql = select * from users where username = '$username' and password = ' xx' or 1='1'
不解释,瞬间破解
同样,上面是在sql语句中查询字段后的输入值加了单引号,有些时候尤其是初级程序员经常对变量不加单引号:
?
$sql = "select * from users where username = $username and password = $password";
?
这时mysql解释会被当做数字型字段来匹配
? ? ?万能密码: 11 union select * from users/*? ?执行语句:select * from users where username = 11 union select * from users/* and password = 54?查询注入?
$keyword = addslashes($keyword);$keword = str_replace("%","\$",$kwyword);
insert into users(username,password,grade) values('frank','123456','1');假如users表中grade为等级字段,并且默认字段为1,注册时用户输入用户名和密码两个字段后,后台插入语句为上面语句,则当用户输入的密码为 123456','3')/*时,执行sql为:
insert into users(username,password,grade) values('frank','123456','3')/*,'1';这样也可以达到注入的目的??解决sql注入:??
$sql = "select * from users where username=? and password=?"; //创建一个pdo对象 $mypdo = new PDO("mysql:host=localhost;port=3306;dbname=xx","root","123456"); //设置编码 $mypdo->exec("set names utf8"); //预处理$sql $pdostatement = $mypdo->prepare(%sql); //将用户名和密码填入sql $pdostatement->execute(array($username,$password)); //得到查询结果 $result = $pdostatement->fetch(); if(empty($result)) ...
?
? ? ?④. 其他企业级解决sql注入方式:IDS(入侵检测系统)?? ? ? ? ??? 关于sql注入对于开发工程师来说主要是防守,提高编写安全代码的意识,让我们编写的代码质量更高,安全性方面更好。