1. SQL注入概述:
SQL注入是从普通的WWW端口访问的,表面上看起来和普通的网页访问没有什么区别,所以目前市面上的防火墙不会对SQL注入发出警报。 如果管理员没有检查日志的习惯,他可能很容易被入侵。 很长一段时间你都不会注意到它。
其实SQL注入主要是由于一些程序员的水平和经验参差不齐,对用户输入数据的合法性没有判断。 这使得应用程序存在安全风险。 任何用户都可以提交数据库查询代码,根据程序返回的结果获取一些他想知道的数据。 结果,用户可以在输入中包含恶意代码来篡改程序功能。 更严重的用户还可能窃取最高管理权限并删除数据库中的所有数据。
2、SQL注入原理:
2.1 没有过滤,或者转义字符没有被正确过滤:
首先我们看一条Sql语句:
String sql = "SELECT * FROM USERINFO WHERE NAME = '+" NAME "+'";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
Statement state =con.createStatement();
ResultSet resultSet = state.executeQuery(sql);
这里我们直接使用用户传递的name变量来拼接一条SQL语句进行查询。 我们乐观地认为所有用户输入的都是正常字符串,没有考虑恶意攻击。 但如果用户输入这样的内容:name = "xxx'or'1'='1"
那么拼接后得到的SQL就变成了这样。 sql = " * FROM WHERE NAME = 'xxx'or'1'='1'",会查询到使用的用户信息。
name = "xxx'或'1'='1';" 而如果sql语句变成这样,那么sql = "* from where name ='xxx' or '1' ='1';" 会清除整个表记录。 那么后果可想而知。
2.2. 数据库服务器的漏洞:
很多程序员认为jsp结合mysql是一个不错的选择。 主要原因是这两种技术都可以在免费运营商中找到。 但有时,数据库服务器软件存在漏洞。 如MYSQL服务器中的()、USER()、()、-ER()、()等函数漏洞。 该漏洞允许攻击者基于不正确的 编码执行成功的 SQL 注入攻击。
2.3. SQL盲注攻击:
当 Web 应用程序容易受到攻击但攻击者看不到结果时,就会发生所谓的盲目 SQL 注入攻击。 存在漏洞的网页会根据注入合法语句的逻辑语句的结果显示不同的内容。 这种攻击非常耗时,因为必须为获得的每个字节仔细构造一个新语句。 通过一次又一次地分析这些结果来获取所需的信息。
Java Web下的3种解决方案:
3.1. 在客户端使用并验证:
通过上面的分析我们可以看出,SQL注入实际上是利用一些特殊的符号来操作数据库的。 所以你可以用它来过滤输入字符。
例如:/|||exec|count|'|” |=|;|>|0。 这种方法很容易注入。
你应该用:from user where = ?,然后你用的和他提交的对比一下,看看是否一致。 因此,想要防止注入,必须进行整体设计,并养成良好的编程习惯。
3.3. 使用连接数据库:
为了解决这个问题我们可以使用. 首先sql在创建的时候就处理一次,然后在传递参数的时候,参数并不是直接拼接到sql中的。 使用占位符,参数中的任何特殊字符都会自动转换。 总之,在执行查询时对SQL进行了严格的处理,防止SQL注入。
3.4. 使用框架:
当今Java Web领域,比较流行的是使用、等框架来防范风险。