先简单的聊一聊 SQL 注入,这个基本上是最常见的 web 漏洞了。SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。比如执行下述 SQL 时
String sql = “select * from user where username = ‘” +uname “‘ and password = ‘” + pwd + “‘”;
# 输入用户名为: tom’ or ‘1=1 , 密码不输入或者随便输入, SQL如下:
select * from user from username = ‘tom’ or ‘1=1’ and password = ‘你输入的密码’
有了or 自然只要username = ‘tom’ 成立, 后面的也不会起作用,这个sql基本上是很常见的比较典型的 SQL 注入问题,在直接使用 JDBC进行 SQL 拼接操作时,很容易引发这种情况。通常情况下,SQL注入的位置包括:
(1)表单提交,主要是POST请求,也包括GET请求;
(2)URL参数提交,主要为GET请求参数;
(3)Cookie参数提交。
将JDBC代码中的Statement 换成 PreparedStatement ,使用预编译机制进行 SQL 注入预防,最普遍的是选用 Mybatis 或 Hibernate 等持久化框架,避免 JDBC 的直接使用,并在 Mybatis 的 SQL 中使用 ‘