2012-09-18 60 views
0

我理解SQL注入的概念,它們是什麼,它們爲什麼是壞的以及如何通過參數化查詢和突破查詢等方法阻止它們,但是如果在代碼中只使用直接查詢字符串會發生什麼情況,在沒有用戶輸入的地方。例如,如果您在用戶登錄時存儲了有關用戶的信息,並且它是自動完成的,並且用戶沒有意識到或執行任何操作,則可能類似於此;例如,當不處理用戶輸入時,無參數查詢是否可以使用?

UPDATE tblUser SET lastLogged = blahblah WHERE userID = blahblah2; 

這會在開發人員的心中造成任何形式的擔憂威脅嗎?

我的主要猜測是,如果黑客闖入某個程序或網站,或許他可以將這些信息進一步用於其他攻擊?查詢/字符串是否容易混淆?

提前歡呼。

編輯:這純粹是爲了理論,所以儘量避免使用諸如「如果你要做一份工作,做得正確」等等。

回答

4

在查詢中使用參數時,即使參數已更改,數據庫引擎也會將該查詢識別爲相同,從而允許其使用緩存的執行計劃,從而提高性能。所以,是的,總是使用參數。

關於安全性,如上所述,update語句沒有實際問題,除非某些輸入可能被用戶篡改。

+0

有趣的是,我沒有意識到參數在緩存信息方面也增加了性能。感謝:) –

+1

緩存的查詢計劃避免了重新編譯查詢所花費的時間。但是,緩存計劃通常對於參數的所有值都不是最優的(Google用於「參數嗅探」)。參數導致更好性能的說法比真實更爲錯誤。 – Andomar

1

從安全角度來看,我不會擔心,只要您的blahblahs都不受用戶控制。但我仍然從效率的角度使用參數化查詢。

假設您有多個用戶擔心,因此查詢會針對不同的用戶運行。通過參數化語句,DBMS可以進行更高效的緩存。

2

這不是沒有參數的查詢是問題:它是字符串連接。所以,如果你這樣做:

myQuery = "UPDATE tblUser SET lastLogged = blahblah WHERE userID = " + blahblah2 

你在問問題。你可以絕對確定blahblah2還不是來自外部?通常參數會通過其他方法傳遞給方法,而真正的源代碼則會在很多類的地方傳播。其他開發人員可以在不知道後果的情況下更改這些類和源。

不參數化查詢有什麼好處?在大多數語言中很容易做到,你只要養成習慣並堅持下去。

+1

第二個重要問題是由許多獨特的查詢造成的計劃污染。 – usr

4

如果你打算怎麼辦?

通過允許程序來執行任意SQL就像上面定義的更新查詢,如果你的程序遭到了破壞,那麼你就可以不再依賴數據的完整性。

通過使用存儲過程(例如SetUserLastLoggedInDate)並且拒絕針對您的數據庫執行任意SQL的權限,可以減少在發生危害時可能造成的損害。

+1

+1用於抑制!使用存儲過程也是一個好主意。 –

相關問題