java编程——sql如何优雅的注入

前言

SQL注入,对这个说法一点都不陌生,但是具体什么叫sql注入,什么情况会发生sql注入,又该如何预防它的发生,一直都不是很清楚。

是什么

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

为什么会发生

最简单的理解SQL注入漏洞形成的原因主要就是,网站代码存在漏洞,或者程序没有细致地过滤用户输入的数据造成的。

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户在使用应用程序时,通过特殊输入内容来构造动态sql语句来访问数据库,而这些输入大都是SQL语法里的一些组合,这就相当于提交了一段sql语句的代码,通过执行SQL语句进而执行攻击者所要的操作,于是sql注入就发生了。

例证

比如程序的代码是利用的拼接字符串

string sql = "Insert into category(name) values ('" + caName + "')";

插入语句是根据用户输入的字符串来执行的,比如用户在下图的textbox中输入“军事新闻”,那么整个插入语句就是:string sql = "Insert into category(name) values ('军事新闻')";

这样,军事新闻就插到了数据库category表中。

这是正常用户的使用方法,也是程序员期待的使用方法。

java编程——sql如何优雅的注入

但是,偏偏有用户不按正常套路出牌,他非要在textbox框中输入“军事新闻')delete from category where id = 1--”,如上图所示。

那么这时候插入语句就变成了:

string sql = "Insert into category(name) values ('军事新闻')delete from category where id = 1--')";

这样的语句就相当与两条完整的sql语句,用户在军事新闻后边输入了“')”,正好使前一部分语句(如下图标红语句),变成了一个完整的插入语句:

string sql = "Insert into category(name) values ('军事新闻')delete from category where id = 1--')";

而后一部分语句(如下图标红语句),又是一条语句:

string sql = "Insert into category(name) values ('军事新闻')delete from category where id = 1--')";

还是一条删除语句,删除了id=1的记录。

有人也许会问“--”是什么呢?在数据库中"--"表示注释,所以"--"后边的内容都被注释掉了,剩下的内容正好是一条插入,一条删除,两条sql语句。

这样就发生了sql注入,或者说恶意sql语句的攻击。

如何预防

归纳一下,主要有以下几点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

java编程——sql如何优雅的注入

结语

而我们上述的例证正是由于使用了第二点预防所提到的动态拼接sql语句,而导致的sql注入。理解的很片面,若有错误,望各位大咖指点。


分享到:


相關文章: