网站sql注入攻击原理及防御介绍
sql注入原理介绍
sql注入攻击是指web程序对用户输入数据的合法性的判断不够严谨或是过滤不严格,甚至是根本没有经过判断,这样的情况下,攻击者就可以在web程序中原本设定好的查询语句的结尾添加额外的sql语句,以此来欺骗数据库服务器执行一些非正当的操作,然后获取服务器信息和权限。
一般来说sql注入是通过表单提交、输入域名或页面请求的查询字符串中,插入sql命令,使服务器执行恶意的命令,比如修改数据,提权等操作。
sql注入可操作性的界面包含,登录界面,留言表单提交界面,站内搜索界面,这些都可能有被sql注入入侵风险。
sql注入操作原理步骤
1、寻找可以注入的点,构造特殊的sql语句。
语句有两种:数字类型,参数不用被引号括起来,如?id=1;
其他类型,参数要被引号扩起来,如?page="one";
2、用户构造sql语句,如:'or 1=1#;admin'#。
3、语句发送给数据库,数据库开始执行语句,数据库管理系统(DBMS)收到返回的结果,执行代码指令,执行一些操作。
4、数据库讲处理好的结果,返回给用户,从这个结果上攻击者就能清晰的了解到一些漏洞,从而攻破。
攻击者在登录界面,用户名输入框中输入:'or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:
select*from users where username=''or 1=1#'and password=md5('')
其中“#”在mysql中是注释符,这样的话"#"后的语句将被mysql视为注释内容,就不会去执行,换句话说,以下的两句sql语句等价:select*from users where usrername=''or 1=1,1=1永远是成立的,不用输入用户名照样可以登录。
还有就是很多人把用户名命名成admin,很多攻击者就会尝试直接输入用户名,然后破解密码登录,构造语句:
select*from users where username='admin'#'and password=md5('')等价select*from users where username='admin'。
也就是说,不需要密码直接就可以登录了,连验证码都不需要。
这样来看的话其实,sql注入的风险还是很高的,大家需要提前预防。
sql注入防御措施:
1、关闭无用的表单提交页面,搜索页面。用户名千万不要默认admin,过于简单,很容易被入侵。
2、登录页面对特殊字符(?,=,'',#)进行过滤,不能被执行,无法输入等。
3、采用sql语句预编译和绑定变量,预先编译好的语法,会严格按照语法执行,后面不管你输入什么参数,都是无效的。
4、严格检测参数的数据类型,使用一些安全函数,防止注入。如接收到用户输入的参数后,就严格检查id,只能是int型,复杂参数则使用规则进行判断过滤。