最近看到有人竟然去测试了一下12306的数据库进行SQL注入,好邪恶地注入成功,并且通过异常栈追踪到了数据库的架构:
架构:SSH2
服务器:WebLogic
数据库:Oracle
连接池:C3P0
说起数据库,不得不说起安全性,说起安全性不得不说起SQL注入,说起SQL注入必须说一下Statement与PreparedStatement区别。后者安全性更好,并且在编程的时候写起来更方便,可以批量处理(通过使用占位符号?及setXxx()来实现),预编译也提高了SQL语句执行效率。
下面用实例来说一下SQL注入:
------------------------------------(1)---------------------------------------------------
Connection con = DriverManager.getConnection(url,username,password);
String sql = "select * from e_shan where username ='" + username + "' and password ='" + password + "'";
Statement stmt = con.CreateStatement();
stmt.execute(sql);
...
------------------------------------(2)---------------------------------------------------
Connection con = DriverManager.getConnection(url,username,password);
String sql = "select * from e_shan where username =? and password =?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1,username);
pstmt.setString(2,password);
pstmt.execute(sql);
...
上面(1)与(2)看上去正常执行起来没有问题,但是如果稍的经验的类人猿都会毫不犹豫地选择第二种,在第一种最常见的SQL注入是在username传入参数时将其值赋值为"' or true or '",那么无论登陆密码是什么,该SQL语句都是返回true,成功SQL注入,当进入到你系统之后,一切都像~~~~总之各种悲催吧,像这种基础中的基础,12306竟然犯了,不知道这3亿花在什么地方了吐槽一下12306的SQL注入漏洞
好吧,吐槽完了。