php SQL注入问题
在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符。通常,用户可以通过以下接口调用数据库的内容:URL地址栏、登陆界面、留言板、搜索框等。这往往会带来一些不必要的风险,比如说数据遭到泄露。
这次解决SQL注入问题,是查找之前的controller文件中的SQL注入问题,修补漏洞很重要,预防漏洞的产生也同样重要,在使用SQL语句对数据库进行增删改查操作的时候,要考虑到SQL注入问题的出现。
首先了解一下SQL注入的步骤:
(1)寻找注入点(如:登录界面、留言板等);
(2)用户自己构造SQL语句;
(3)将sql语句发送给数据库管理系统(DBMS);
(4)DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作;
(5)DBMS接受返回的结果,并处理,返回给用户;
例如:
登录界面的表单数据$name(用户名)、$possword(密码)都是通过前端页面submit把表单数据提交到后台,然后在后台PHP文件中通过执行SQL语句对所需数据进行查询.
$sql="select * from users where username='$name' and password=ma5('.$possword.') ";
直接将用户提交过来的数据(用户名和密码)直接拿去执行(没有实现进行特殊字符过滤),如果用户名和密码都匹配成功的话,将跳转到登录后的界面,不成功,则给出错误提示信息。
正常情况下,$name='user',$possword='123456',执行的SQL语句为:
$sql="select * from users where username='user' and password=md5('123456') ";
如果账号密码正确,那么我们会正常的登录,假如账号密码错误,会给出错误提示。但是在有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。比如:在用户名输入框中输入:or1=1#,密码随便输入,那么这时SQL语句为:
$sql="select * from users where username='or 1=1#' and password=md5('12345asdada6') ";
“#”在mysql中是注释符,这样#号后面的内容将被mysql视为注释内容,这样就不会去执行了。SQL语句在这时变成了
$sql = select * from users where username='' or 1=1#' and password=md5('12345asdada6')"; //即为$sql = select * from users where username='' or 1=1;
这时判断1=1肯定为true,那么执行者就可以随意获取自己想要的数据了,这就是SQL注入漏洞的一个表现。