hibernate中是怎么避免SQL注入式漏洞的?

dddeee 2005-05-15 01:48:24
比如我要执行的一个HQL语句如下:
String hql = "select count(*) from CpUser where ID='"+ userForm.getId() + "' and password='" + userForm.getPassword() + "'";

如果我的表单中没有对输入的字符进行限制,它就存在注入式漏洞。

在hibernate中是怎样解决的?是和以前JSP中的做法一样吗?(写个函数,过滤掉'号)
...全文
2100 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahawen 2005-05-20
  • 打赏
  • 举报
回复
如果非要用字符串组合写的话,可以在前端加一个filter, 自动把所有的request参数值处理一下,加上特殊字符前加上\,就不会有注入错误了
zhirenshao 2005-05-20
  • 打赏
  • 举报
回复
应该和上面所说的,用PreparedStatement,Hibernate参考手册上有例子:

session.createQuery("select count(*) from CpUser where ID = ? and password = ?")
.setString(0, userForm.getId())
.setString(1, userForm.getPassword());
dddeee 2005-05-18
  • 打赏
  • 举报
回复

robbin给了个回答,放在这里。其实也是占位符


你这种拼SQL的用法根本就是错误的!应该使用占位符!

select count(*) from CpUser where id = :id and password = :password";
...
query.setParameter("id".userForm.getId());
...
dddeee 2005-05-18
  • 打赏
  • 举报
回复
。。。。。。

晕。这是个HQL语句,不是SQL。不过看起来和SQL是一样的-_-##

hibernate中可以使用prepareStatement吗?

hibernate本身有没有提供什么样的工具、函数、方法来防止注入式漏洞?如果没有的话,对于这种需要拼出来的HQL应该怎么写?

在SQL中我还有一个prepareStatement可以用,在hibernate中呢?
zjjsgwm 2005-05-17
  • 打赏
  • 举报
回复
你可以使用Hibernate和Spring整合...
YuLimin 2005-05-17
  • 打赏
  • 举报
回复
不用preparedStatement,你数据库里的密码是明码吗?是的话,晕了。。。

一般密码要回密一下吧,比如用MD5一下

这样它输入注入的一些信息,都要先MD5一下,也就通过不了了

如:1' or 1=1进行MD5后变成这样了B102C867D61C4E034BA01040441E5487

select userpwd0_.id as id, userpwd0_.userid as userid, userpwd0_.password as password from userpwd userpwd0_ where (userid='EA04' )and(password='B102C867D61C4E034BA01040441E5487' )

就不会了。。。
dddeee 2005-05-16
  • 打赏
  • 举报
回复
会的!我已经测试通过
比如
userForm.getId() 为 1
userForm.getPassword() 为 1' or 1=1 or ID='1
就能避过验证,直接进系统
DanielYWoo 2005-05-16
  • 打赏
  • 举报
回复
大多情况下,你可以用preparedStatement,这样是可以避免的;但是有时候实在是很难用preparedStatement,比如某些动态的sql。我曾经自己写了持久框架,就是为了可以防止SQL注入(我这边有些项目要做hack test).我解析我自己的QL,把字符常量内的single quote都给换掉,like里的wild char根据开关变量都换掉。
blackhost 2005-05-16
  • 打赏
  • 举报
回复
避免注入漏洞的根本方法就是不要使用STRING组合SQL,而要使用参数传递的方式!这和使用什么工具,什么框架一点关系都没有!你就是直接使用SQL去做,使用参数的方式也没有任何注入问题,使用楼主这种方式写SQL的是一个很不好的习惯!
deargaogao 2005-05-16
  • 打赏
  • 举报
回复
一直用PreparedStatement
sunyanbing 2005-05-16
  • 打赏
  • 举报
回复
同意楼上的说法
jihanzhong 2005-05-16
  • 打赏
  • 举报
回复
tring hql = "select count(*) from CpUser where ID=?...";
ps1= Connection.prepareStatement(sql);
ps1.setString(1,userForm.getId());
...
rs=ps1.excuteQuery();
jihanzhong 2005-05-16
  • 打赏
  • 举报
回复
用PreparedStatement
String hql = "select count(*) from CpUser where ID=?...";

ps1.setString(1,userForm.getId());
simon11111122222 2005-05-16
  • 打赏
  • 举报
回复
"但是有时候实在是很难用preparedStatement,比如某些动态的sql"这个问题我也正在想,觉得一个个查找换掉很麻烦,有没有更好的办法可以解决?(不用preparedStatement的)
ssht968 2005-05-15
  • 打赏
  • 举报
回复
不用,你直接写入.它不会的。你试一下就知道了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧