1. Hibernate要不要写专门的代码防止sql注入
不要。
你的sql或者hql,是拼装的还是prepared传递的(?传递)。
拼出来的,当然需要防注入了。和你用不用hibernate没关系
2. hibernate的sql注入是什么意思能解释透彻一点么
如果在查询字段中输入单引号"'",则会报错,这是因为输入的单引号和其他的sql组合在一起编程了一个新的sql,实际上这就是SQL注入漏洞,后来我在前台和后台都对输入的字符进行了判断。
永远也不要写这样的代码:
String queryString = "from Item i where i.description like '" + searchString + "'";
List result = session.createQuery(queryString).list();
如果用户输入:foo' and callSomeStoredProcere() and 'bar' = 'bar,则你的程序在执行一个简单查询后,还会调用某个存储过程,
这样你的程序就开了一个安全漏洞,如果用户偶尔输入了一个单引号,你的程序就可能报错。
3. spring的HibernateDaoSupport这样写hql会被sql注入吗
嗯 是的
只要是拼接的hql就有可能被注入,因为它最后还是要根据hql生成sql语句的
4. SQL注入攻击有哪些主要的特点
1、变种极多
有经验的攻击者,也就是黑客会手工调整攻击的参数,致使攻击的数据是不可枚举的,这导致传统的特征匹配方法仅能识别到相当少的攻击。或者是最常规的攻击,难以做到防范。
2、攻击简单
攻击过程简单,目前互联网上流行的众多SQL注入攻击工具,攻击者借助这些工具可以很快的对目标网站进行攻击或者是破坏,危害大。
3、危害极大
由于web语言自身的缺陷,以及具有安全编程的开发人员较少,大多数web应用系统均具有被SQL注入攻击的可能,而攻击者一旦攻击成功,就可以对控制整个web应用系统对数据做任何的修改或者是窃取,破坏力达到了极致。
5. 有人遇到过项目中已经使用了hibernate,可是测试的时候依然会被sql注入,请问是怎么回事呢
需要提供具体调用的代码,否则无法判断。
再强大的框架,也不能完全杜绝漏洞,因为框架既要考虑安全性,也要考虑灵活性,数据库的封闭框架,如果严格按照既有的方法生成查询或写入语句,一般是不会有注入漏洞的。但个别地方可能需要灵活拼装查询或更新语句,传入了自拼装的代码,就很可能导致漏洞产生
6. sql注入攻击是怎么在用户名和密码那儿登陆的时候注入SQL语句的说得通俗点,官网的太理论太笼统看不明白
比如 你的检测语句是
select * from user where name=‘“变量1”’ and password=‘变量2’
如果能找到记录则判定登陆成功。
那么对方如果在填写用户名和密码的时候写 密码 1' or ’1‘='1 吧这个替换到 你最后形成的sql 语句就变成了
select * from user where name=‘ 1' or ‘1’='1’ and password=‘ 1' or ‘1’='1’
由于1=1是恒等的。也就会把所有记录给查出来。这样。这样就可以达到不知道密码或者是用户名的情况就登陆了
7. 怎样利用Hibernate来防止SQL注入的方法
SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者)。[摘自] SQL injection - Wikipedia
SQL注入,大家都不陌生,是一种常见的攻击方式。攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序。所以,在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性要求很高的应用中(比如银行软件),经常使用将SQL语句全部替换为存储过程这样的方式,来防止SQL注入。这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式。
MyBatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入。其实,MyBatis的SQL是一个具有“输入+输出”的功能,类似于函数的结构,如下:
<select id="getBlogById" resultType="Blog" parameterType=”int”>
SELECT id,title,author,content
FROM blog
WHERE id=#{id}
</select>
8. 如何进行SQL注入攻击
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,首先你要熟悉SQL语句和语法
猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
也可以这样
and exists (select * from 表名)
and exists (select 列名 from 表名)
9. 扫描发现一个SQL注入,请问如何验证这个注入,请给我详细过程,谢谢,好的话还可以加分
扫描是如何进行的,验证是否存在也是一样的!
扫描是用某一地址后加上了and 1=1取得的结果进行与and 1=2取得的结果进行比较而确认存在的!有时直接可以对and 1=2进行分析.如果内容没有显示完或是显示有部分错误时,一般会报数据库错误!可以知道这存在一个SQL 注入的!
然后就是直接的注入了!以手动为例,第一步猜表名:使用(select count(*) from admin)>0将语句中的1=2代替,查看反回结果,若是与1=2的界面一样出现错误或是显示不完全,则说明不存在admin表,一步一步到试表名,常用的一般是admin,administrator,manager等表名的!
第二步从猜到的表名中猜列名
(select count(*) from admin where len(username)>=1)>0
如果显示完全则表明存在username列名,当然还要猜一个密码的列名,一个是user,username之类,密码是password之类.
第三步,从猜到的表名或列名中猜管理员的名称.
如果是论坛的形式,有些设计上有不好的地方,就是管理员在论坛中发言的那个名称往往就是管理员的名称,因为图省事,发言所用的昵称与登陆所用的用户名是同一个.如果是,则好办,否则也是猜的!
一般我会找一个最长的管理员名称猜或者先猜出长度!如:len(username)>=5时正常,而大于等于6时出错!那么长度一定是5位!
然后用
(select count(*) from admin where len(username)=5 and left(username,1)>='a')>0
出错则第一个字符小于a,根据字符的编码去猜吧,可以找到猜到left(username,1)>="A"时正常,而>="B"时不正常.那么第一个字符就是"A",直到5个都猜完,比如得到"Admin"就知道了其用户名!
第四步猜密码:
(select count(*) from admin where username ='Admin' and left(password,1)>='a')>0
同样的方式可以猜到密码,最好先猜一下密码长度,如果是16位或是32位时往往使用了MD5加密,猜到的是加密过的字符而不是真正的密码!
第五步,其实第五步也是提前确认的,不然我们作的都是无用功!找后台登陆页面.
在后台登陆,当然如果网站为了安全,使用了JS先对密码进行加密的话,可以让JS不运行或是下载页面进行改造,不让其加密你的密码,这时你可以在密码中直接输入第四步的MD5的值.如果密码是明文传播,也就是在服务器端进行校验时,只有将第四步得到的MD5匹配,不叫反解MD不能反解,但可以在网站上得到一个匹配,也就是说某一个密码可以生成同样的MD5值,那这个密码就可以用!当然,如果明文存在数据库中就更好玩了!直接输入吧!
第六步,进入后台后,添加管理员帐户!以后想怎么玩就怎么玩,要是一个不细心的网管,再不查一下后台的管理员,你想他的后果是什么?
第七步,可能吗?大部分的管理员不是弱智,所以第六步往往只是一个障眼法!因为添加管理员很容易被发现的!添加木马程序!或者写一个页面,这个页面的名字与地址你自己记好,然后隐藏,一般管理员都不会在意的!这个页面是显示其特定数据库的!你也想了显示哪个呢?肯定管理员了!
以后你也登陆,如果添加的帐户登陆不上,就调用那个隐藏的地址,显示出真正管理员的密码或是MD5值,同上边一样登陆进行!再建一个管理员迷惑他!
当然,如果数据库允许插入的话,也好玩!不必狂管理员的帐户与密码,直接使用insert into语句插入一个管理员和密码就可以了!但是由于admin表中除这两项外,还有不允许为空时我们要么再猜其他字段(这个很难),很难插入的!
如果是SQL数据库,而他们开的恰恰又是sa帐户的话,好玩的事更多了!因为sa的权限很大,直接可以从系统表中查询各个表的名称等,
这只是手动的一个例子,做为新手可以实现注入.但记着不要给人家网站添麻烦,都不容易!
10. hibernate防止SQL注入的原理是怎么样的
不要。 你的sql或者hql,是拼装的还是prepared传递的(?传递)。 拼出来的,当然需要防注入了。和你用不用hibernate没关系