浅析SQL注入
演示
记得以前瞎鼓捣的时候,学过一个传说中的SQL注入万能字符串,是这个样子的' or '1'='1
先演示一下效果:
这是我们数据库中目前的存储的用户情况. 当然…明文存储密码是件非常值得鄙视的事情…
这是一个简单的登录界面. 正常情况下,我们如果输入的密码错误,会出现错误提示.
但是,如果我们在用户名后拼接一个传说中的万能字符串,或者直接使用万能字符串作为密码的话,就可以直接登录.会跳转到我写的一个简陋到令人发指的欢迎页面.
原因
很简单,看一下代码:
这里是关于数据库查询的代码,我们实际执行的那条sql语句是拼接出来的. String sql = "select * from user where username='"+username+"' and password='"+password+"'";
而从页面上拿到的用户名和密码就是两个文本框里输入的内容.
因此,如果我们将密码输入框里输入' or '1'='1
那么这条sql语句会变成这个样子: String sql = "select * from user where username='tom' and password='' or '1'='1'"
这种情况下where子句无论如何其结果都是true. 是可以正常通过认证的.
解决办法
最简单的解决办法就是使用PreparedStatement,先对sql语句进行预编译. 这种情况下就避免了字符串拼接的问题了.
当然也可以采用一些正则匹配去对输入做校验. 只不过…太多人遇到正则表达式都头疼,所以…还是用最简单的PreparedStatement吧…