jsp用Statements和PreparedStatement防范sql注入
作者:吕海鹏 文章来源:哈尔滨瑞杰软件 发表时间:2008-03-15 12:11:32
阅读次数:今日:3 本周:4 本月:11 总计:3867

前几天朋友说他们公司的网站被人黑进去了,还居然做了一段视频放到网上,演示如何黑进去的。问他
对方如何做的,只是告诉我是通过sql注入的,下了那段视频看了看,原来这么回事
首先说明 他们公司的网站是用jsp写的而且是用最古老的方式写的(个人认为只能是用来做入门教学的
),没有用任何struts、spring、hibernate等框架。
sql注入想必大家都知道的,比如用个用户登录,那么form表单有用户名和密码
那么我提交时,在用户名输入框内 输入 “aaa’ or ’a’=’a” 密码框随便输入,那么这样意味着 sql的
查询语言就是 “select * from 表 where 用户名='aaa’ or ’a’='a’ and 密码='www.itstudy.cn’  ”,稍懂sql语法的大家就知道 这样的查询结果了。
那 么我朋友公司网站正是在用jsp开发时 用Statement方法向数据库提交sql查询的。不被黑都怪了,实际中现在java程序员早都不用这种方式写 查询了,一般都用PreparedStatement来查询 或干脆就用hibernate之类的持久层框架,这样通过sql注入就无从谈起了。
为什么呢?比较一下Statements和PreparedStatement和的执行就一目了然了(这里具体的理论解释大家网上自己查了,这里就白话文说说了)

如果有一条sql语句:
“select * frim 表 where 用户名=  ’用户名’”

Statement 的sql语句是这样写的 “select * frim  表 where  用户名= ’”+ 变量值 + “’ ”
而PreparedStatement的 sql语句是这样写的 “select * frim  表 where  用户名=?” 然后赋值于?对应

这样我们就发现 输入“aa’ or ’1’=’1”
Statement是将这个他和sql语句做字符串连接连到一起变成一个大字串 sql语句执行
PreparedStatement怎么处理呢?他是将“aa’ or ’1’=’1”作为一个字符串 赋给?做为 “用户名”字段的对应值,显然这样sql注入无从谈起了。

写到这里我们就发现 实际上很多时候被黑客攻击 不是黑客怎么厉害 ,通常都是我们的程序员只是一个简单的软件工人的缘故吧!!!

朋友是做网络的 不会java,催促我好几次让我解释一下,今天抽空一气呵成写了一小段,算是交差了(考虑安全没有具体说明网址)。


关键字:java,jsp
最后编辑时间:2008-03-15 12:11:32
上一篇: asp四舍五入实现统计百分比函数的差异
下一篇: asp生成html静态页的简单方法