攻击者把SQL命令插入到Web表单的输入域,或者页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。
在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这种表单很容易受到攻击。
【防范方法】
——替换单引号。
——删除所有连字符。
——对执行查询的数据库账户,限制其权限。
——用存储过程来执行所有查询。
——检查用户输入的合法性。
——将用户登录名和密码等数据加密保存。
——检查提取数据的查询所返回的记录数量。
==========================================================================
【攻击网站的方法】
SQL注入,旁注,XSS跨站,COOKIE欺骗,DDOS,0day 漏洞,社会工程学等等。
【了解注入原理】
因为SQL是一种解释型语言,在运行时,是由一个运行时组件解释语言代码,并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。
【java.sql.PreparedStatement】扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。而且PreparedStatement中绑定的sql语句是可以带参数的。
【注入手法】
我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:
select * from users where username='tarena' and password=md5('admin')
只要构造个特殊的“字符串”,照样能够成功登录。
比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:
select * from users where username='' or 1=1#' and password=md5('')
语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:
select * from users where username='' or 1=1#' and password=md5('')
等价于
select * from users where username='' or 1=1
因为1=1永远都是成立的,即where子句总是为真,将该sql进一步简化之后,等价如下select语句:
select * from users
没错,该sql语句的作用是检索users表中的所有字段。
==========================================================================