2013-08-06 31 views
-1

我只是偶然發現了一個同事的SQL代碼(我們有一個」不修復它,如果它不破壞策略「),登錄過程。 名稱變量由一個輸入字段從JSP在所有交付當<>「'%;()被刪除時SQL注入是否可能?

//BAD CODING ALERT: DONT USE THIS CRAPPY CODE, YOU NAUGHTY COPY PASTERS! 
Query q = em.createQuery("select object(u) from User as u where u.name = '" + name + "'"); 

在沒有衛生設施的name變量除了服務器端驗證上一些非法字符:<>"'%;()(記住,是單雙報價)

這可以被利用嗎?如果是的話,怎麼樣?

如果它不是爲單引號和雙引號,我們可以這樣做:blah' OR 'x'='x

+3

你會如何處理O'Reilly這個名字的用戶? – Olaf

+2

必須的XKCD鏈接http://xkcd.com/327/ –

+2

如果em代表EntityManager,那可能意味着您有可能使用JPA。實際上,如果您直接使用JPA或Hibernate,那麼他究竟爲什麼要連接這樣的SQL語句?相反,使用'Query'提供的方法,讓框架管理消毒。 – Gamb

回答

0

回答我自己的問題......這是安全的,但不像我自己所說的那樣實用。

在下調之前,請閱讀該問題。或者給出一個利用例子,否則。

+0

爲什麼會這樣?只是要求麻煩。你是否會在jr dev複製粘貼將來編輯此代碼時執行此操作? – tgkprog

+0

@tgkprog現在夠好了嗎? – Terence

+1

沒有。我向你投票,不是因爲我同意,而是喜歡鼓勵討論。 – tgkprog

2

你永遠也不會通過連接字符串創建查詢。使用query.setParameter("paramName",paramValue);

所以它會是這樣的

 
Query q = em.createQuery("select object(u) from User as u where u.name =:name"); 
q.setParameter("name", "O'Reilly") 
沒有SQL注入可能因爲轉義值;

+0

非常好的重構,但看看我原來的問題。我問過以前可以(或者不能)被利用。並且不要介意這不是我,而是我的同事。 – Terence

+0

我從來沒有嘗試添加「OR 1 = 1」到休眠查詢,但你可以試試看。 SQL注入漏洞在查詢返回的結果(最糟糕的情況 - 數據庫轉儲或丟失xD)上並不如此,而是取決於使用結果集進行的操作。 所以是的,在你的例子中,你總是可以提供'u.name'作爲名字 - 這將返回具有名字的所有用戶(名字不爲空)。問題是,你以後在做什麼。也許你把返回的用戶密碼發送給提供的電子郵件,這裏是所有的密碼 - 只是一個愚蠢的例子,但可能。 – Antoniossss

+0

輸入u.name(在原始文章sql中)將被視爲一個字符串而不是列 – Terence

相關問題