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沒關系