題:
是否有一個太短的字段長度,以至於不允許有害的SQL注入?
James Jenkins
2017-02-28 22:18:55 UTC
view on stackexchange narkive permalink

我正在閱讀有關SQL注入的內容,並看到了這一點,這使我開始思考:

輸入字段應盡可能小,以減少黑客將SQL代碼壓入該字段的可能性不會被截斷(通常會導致T-SQL語法錯誤)。

來源: Microsoft SQL Server 2008 R2釋放

SQL注入會造成損害的最短字段大小是多少?

損害是數據庫修改或返回設計所不希望的結果。在兩個字符字段中包含結束註釋標記(-)不會造成危害,只會導致查詢失敗。潛在的黑客可能會知道該領域容易受到注入,但他們無法利用它。

如果給出的錯誤是冗長的,則可能足以獲取有用的信息,尤其是在開發人員將表名視為“秘密”的情況下……
並非總是在輸入字段上執行SQL注入-您可以將URL中的orderby子句作為目標,例如可以執行惡意sql的位置。字段的有限大小不會阻止這一點。
@iain:好點了。另外,限制(我假設)接收到的HTML表單數據的字段長度並不能使我成為避免sql注入的好方法。避免SQL注入基本上是一個可以解決的問題。只需讓數據庫連接庫通過使用帶佔位符的預備語句來處理它,而不是使用編程語言的字符串函數將查詢粘貼到一起,並由於您忘記防止漏洞號59654而把它弄錯了。
@Pascal“ *基本上避免了SQL注入問題; *”僅適用於已應用適當注意事項的新代碼。現有許多代碼尚未解決問題。大概存在一個字符長度,在此長度以下,解決現有問題的壓力要小於長度較長的字符。
我是唯一認為那本書應該被公開焚毀的人嗎?參數化查詢已經存在了很長時間,以至於筆者讓我相信它們根本不知道他們在說什麼。聽起來好像他們從一組博客中復制並粘貼了垃圾,並發行了一本書。他們可能還告訴您,您應該練習用較小的子彈射擊,以便增強對較大子彈的免疫力。
@MonkeyZeus <聳肩/>這不是技術書籍的例外,而是更多的規則。當非安全專家提供安全建議時,通常質量很差。
0個字符怎麼樣?並且僅在服務器上經過驗證的情況下。
-1
@MonkeyZeus我同意這令人不快,但我還是特別喜歡閱讀技術書籍和編程書籍中的安全建議。覆蓋範圍通常是深淵或完全不存在。例如,我有一本書從頭開始構建電子商務系統,簡要討論了HTTPS的使用,然後宣布對安全性的進一步討論不在本書的討論範圍之內。
@Xander我想說“別處看看”比大膽宣稱“在將數據發送到服務器之前,使用JavaScript和服務器生成的隨機密鑰對錶單數據進行模糊處理”更為崇高。至少那本電子商務書說:“嗨,我們不希望您的服務器被沙紙陰莖遮蓋住,因此,如果您關心安全性,那麼請閱讀一本關於它的好書。我們的書只是教您如何構建e商業網站,而不是如何保護它。”
我反對原則上的書籍刻錄-但是會投票給作者帶回存貨-“這通常會導致T-SQL語法錯誤”-SQL Injection的全部重點是使您提交的數據與預定目的地的範圍。
根據其他答案,較短的字段長度不會阻止問題。我最近在一個帶有8個字符的用戶名字段的舊版應用程序上工作(並且在代碼中檢查了8個字符),但是它仍然可以進行SQL注入。當在註入中還使用密碼字段時,情況變得更糟。
儘管我100%同意通常如何解決這些安全問題以及該書中的建議有多糟糕,但我認為該建議很糟糕,主要是因為它很可能使人們愚弄自己以為採取“預防措施”他們保護自己免受SQL注入的侵害,這也是不好的,因為它鼓勵在有可能(且容易)消除風險的情況下追求降低風險。沒有辦法否認該引用並沒有聲稱可以防止SQL注入。它只是聲稱要“降低可能性”(這是愚蠢的並且具有誤導性)。
@MonkeyZeus許多DB API仍然無法支持數組值的參數,例如運算符IN右側的那些。要變通解決此問題,您需要在查詢中包括可變數量的參數,這時最終會“粘貼”一系列佔位符,並使位置佔位符(`?)的順序在語句之間保持同步並且值數組很難逃脫。
八 答案:
Xander
2017-02-28 23:18:13 UTC
view on stackexchange narkive permalink

在沒有上下文的情況下,我將假定作者引用的是客戶端應用程序中的輸入字段。最簡單的示例是Web應用程序中HTML頁面中的表單,儘管我要描述的內容實際上對任何類型的客戶端應用程序都是有效的。

鑑於此,答案是不,沒有最大輸入字段長度足夠短以保護您免受SQL注入,因為您無法控制最大輸入字段長度。攻擊者可以。當包含輸入字段的表單駐留在客戶端上時(例如在攻擊者計算機上的瀏覽器窗口中),它不在信任範圍之內,並且不受您的控制。可以以攻擊者想要或需要的任何方式對其進行操作,或者完全避免。記住,對於Web應用程序,您得到的只是一個HTTP請求。您不知道它是如何創建的,也沒有理由相信您要求瀏覽器執行的任何操作實際上是在發生的,任何客戶端安全控件都已在運行,請求中的任何內容都是

因此,輸入字段長度不是有效的SQL注入預防機制,並且永遠不要信任未經安全驗證跨越安全邊界的輸入。

這是一個很好的答案,也許作者表示字段太短會降低從數據庫獲取信息的可能性,但是它不能避免SQL注入的危害,例如,“或1 = 1”會造成很大的損害。
@hmrojas.p並非如此,因為輸入字段的最大長度實際上並不能阻止惡意用戶在該字段中發送任意數量的數據。我可以將輸入的最大長度設置為3,並且攻擊者仍然可以發送或1 = 1;丟棄表用戶;-如果不檢查服務器端,則沒有什麼可以阻止的。
是的,我同意,我假設服務器端進行了長度驗證,我的意思是這種SQL注入(或1 = 1)可能會影響UPDATE或DELETE之類的SQL查詢,這可能會破壞數據完整性,即使您在服務器端進行了長時間驗證,此措施也是互補的。
因此,如果服務器隨後進行了驗證,那該怎麼辦。惡意用戶無法觸摸。如果我的PHP腳本最多只使用前x個字符(這非常簡單,可以在查詢過程中完成),那該怎麼辦?
-1
我之所以投票,是因為這假設字段長度未通過服務器驗證。雖然我同意任何答案都應該提到必須驗證服務器端的長度,並且在用戶控制範圍之外才可以使用任何長度,但我相信服務器端對長度的驗證會完全使您的整個答案無效。(答案可能仍然是“否”,但並非出於這個原因。)
@jpmc26是否已驗證服務器端無關緊要。引用的上下文是客戶端的“安全”措施,並且未解決服務器端的驗證。
@Xander這裡唯一承擔僅客戶端驗證的人是您。我在問題或評論中沒有看到任何暗示這是OP所描述的情況的信息。
@jpmc26來自問題:*“輸入字段盡可能小” *。服務器收到響應時是否知道輸入字段是什麼?我的意思是,如果您提交HTML表單,則服務器沒有“輸入字段”的概念。它只是獲取數據。我認為,書中沒有上下文,引言有點含糊。
@JacobAlvarez服務器顯然知道什麼是輸入,並且如果可以將值填充到可能發生注入的SQL查詢中,則可以辨別這些值。如果可以識別這些值,則可以確定長度。不要誤會我的意思;引用是胡說八道。但是,也要彌補有關其無意義的無關緊要的原因,所以讓我們弄清原因。
@jpmc26,的引用為“輸入字段”。這就是發生用戶交互的地方。因此,對我來說很明顯,它是關於客戶端而不是服務器端的。進行JS輸入驗證的表單也是如此。除非*明確說明*驗證是*在服務器端重複的,否則可以安全地假定服務器端驗證不存在。
@aross就我們所知,我們可能正在談論甚至沒有提供GUI的REST接口。“輸入字段”對我而言僅意味著用戶生成的值。提到必須在用戶無法控制的環境中進行長度驗證是絕對合適的。假設它沒有發生,並且使* entire *成為答案的基礎實際上只是避免回答所有問題。
@jpmc26您似乎正在將參數與輸入字段進行合併。
@aross我似乎在考慮以下事實:這些“輸入字段”中的值最終*在SQL查詢中*。沒有實際差異,“輸入字段”沒有嚴格定義。認為這是僅客戶端驗證的概念,是“完全沒有根據的假設”,只不過是一個補充說明。它對SQL注入上下文中長度是否重要的問題沒有任何回答。
好吧,如果我們開始討論語義,這裡有一些資料來源:[輸入](https://en.wikipedia.org/wiki/Input_(computer_science)),[參數](https://en.wikipedia。org / wiki / Parameter_(computer_programming))
讓我們[繼續聊天中的討論](http://chat.stackexchange.com/rooms/54700/discussion-between-jpmc26-and-aross)。
tim
2017-03-01 00:10:54 UTC
view on stackexchange narkive permalink

不,沒有太短而無法利用的長度(至少在某些情況下)。

長度過濾器不是防止SQL注入的有效保護措施,而準備好的語句實際上就是

長度過濾器是深度防禦的好方法(整數過濾器,字母數字過濾器等)。在許多情況下,例如有效輸入絕不能超過30個字符,但是有意義的利用需要更多的字符。應該(但可能不是)不用說,任何過濾作為深度防禦都必須在服務器端進行,因為任何客戶端都可以簡單地繞過。

限制繞過

限制子句(例如, AND / OR )可以繞過兩個字符,這會造成真正的傷害,而不僅僅是查詢失敗。最簡單的示例是登錄(其他示例是未經授權的其他數據刪除):

  SELECT * FROM users WHERE userid = [id] AND password = [password]  

注入:

  id = 1#password =錯誤密碼 

有效載荷:2個字符

DoS

DoS攻擊只需要很少的字符。在一個MySQL示例中,實際調用花費7,在給定的秒數內x,加上調用該函數和修復查詢所需的一切。

示例:

  SELECT * FROM users WHERE userid = [id]  

注入(這是有效的注入,較長的形式為 1 AND sleep(99) ):

  sleep(99) 

有效載荷:9個字符

讀取數據

如果有數據在顯示時,長度主要取決於表和列的名稱。我將假定所有表的列數相等(這可能會發生,並且會保存字符)。

示例:

  SELECT *來自評論,其中commentid = [id]  

注入:

  1個並集選擇*從用戶 

有效載荷:27個字符。

編輯數據

未經授權的數據庫修改也可以用很少的字符完成。

示例:

  UPDATE用戶SET password ='[password]'WHERE id = [id]  

注入(輸入密碼):

 ',isadmin ='1  

有效載荷:12個字符

限制繞過也會起作用(結果是所有密碼現在為空*):

 '# 

有效載荷:2個字符

*密碼示例是為了簡化起見;應該對密碼進行哈希處理,以使該示例變得不可能。該示例仍適用於所有類似情況(更新用戶名,更新權限等) sub>

“長度過濾器不是針對SQL注入的有效保護措施,而準備好的語句確實是唯一的適當防禦措施。”這是唯一有效的答案。沒有準備語句的SQL使我想起[“如何駕馭死馬的策略”](http://www.deadhorses.org/)
祝您好運,準備一個帶有可變數量佔位符的語句,例如運算符`IN`的右側。
@DamianYerrick我認為這是一個有缺陷的假設。您為什麼需要為最終用戶提供IN子句的無休止的佔位符組合?擁有幾個允許1..n(很小的n)的模板很容易。
在“ SELECT * FROM users WHERE userid = [id]”中,如果a是列名,則可以插入a,因此只能注入1個字符。
@ShawnC用例是用戶輸入要查詢的項目列表。一方面,“小n”有多大?它似乎違反了零一無限規則。另外,如果有兩個不同的列表值輸入字段,則現在需要存儲和測試O(n ^ 2)模板。
@Alexander:請注意,您無法始終使用準備好的語句,因為它們無法對字段名稱進行參數化。而且,當您必鬚根據用戶輸入來構建聯接時,您的工作就會變得更加困難...
-1
@Alexander:運行時是否從MyTable生成`SELECT [whatever]形式的查詢存在任何安全問題,其中id = @ @p0或id = @ @p1或id = @ @p2`,無論用戶輸入多少參數(如果沒有)語句中包含參數的文本?
Serge Ballesta
2017-03-01 04:13:06 UTC
view on stackexchange narkive permalink

輸入字段應盡可能小,以減少黑客將SQL代碼壓縮到該字段中而不被截斷的可能性(通常會導致T-SQL語法錯誤)。

恕我直言,這只是狗屎。可怕的建議是使用輸入字段的長度來防止SQL注入:

  • 防止SQL注入的唯一正確方法是使用準備好的語句。輸入數據是查詢的參數,並且永遠不會用作SQL文本。
  • 字段的大小必須控制服務器端,因為您永遠無法相信請求中包含的內容-它可能是偽造的-並且應在業務層或數據庫存儲中使用之前,先對數據進行清理。對於新手開發人員來說很困惑。
benrifkah
2017-03-01 03:10:19 UTC
view on stackexchange narkive permalink

否。

考慮查詢:

 從tweets中選擇* WHERE RowNum > = [offset] AND RowNum < [offset] + [limit]  

如果您可以為 offset 注入單個非整數(例如,字母“ a”),則查詢將產生語法錯誤,並且不會顯示任何帖子,導致您提出“設計未預期的結果”以引起損壞。如果您可以注入一個空字符串,則有效載荷長度為零的效果相同。注入結束註釋將浪費兩個字符;)

攻擊者可以在拒絕服務攻擊中利用這一點(不同於通常與DoS相關的網絡氾濫,仍然是 DoS)。取決於被拒絕的服務,這可能是災難性的。

其他答案表明,字段長度與SQL注入影響無關。如 OWASP SQL注入預防速查表所述,準備好的,參數化的語句是處理方法。

拒絕服務和SQL注入是兩個非常不同的事物。該答案沒有提供現有答案中尚未解決的任何有用信息。
正確,SQL注入是“注入攻擊”類別的一種形式,它可以產生許多不同的目的,包括拒絕服務。拒絕服務是一項可以通過不同媒介實現的技術。常見的是通過分佈式洪水。但是,任何產生無響應服務的技術都可以適當地歸類為拒絕服務攻擊。這可以包括SQL注入。我的回答提供了有關如何使用零個字符完成此操作的說明。它還提供了OWASP SQL注入預防作弊表的鏈接。感謝您指出我應該強調這些內容。
MikeSchem
2017-03-02 02:14:18 UTC
view on stackexchange narkive permalink

否。

一個單字符SQL注入的簡單示例:

 ` 

它將引發錯誤,將是“返回非設計意圖的結果”的示例。很多時候,錯誤可以被用來獲取信息,這將在以後的攻擊中有所幫助。

也許您可以添加有關該注射可能有害的解釋?
這將是一個錯誤,將是“返回並非設計意圖的結果”的示例。很多時候,錯誤可用於獲取信息,這將在以後的利用中有所幫助。
謝謝!我可以自由地在回答中包含您的解釋。
Dan
2017-03-03 00:27:35 UTC
view on stackexchange narkive permalink

是。

最大長度為零。通過最大長度確保不受信任的輸入安全而不進行其他驗證或檢查的唯一方法是完全忽略從索引0開始的輸入。

這裡還有許多其他(更好的)答案,但是這個可以回答理論上的問題,即當場長是您唯一可用的工具時,如何保持安全。

老實說,我不相信足夠聰明的攻擊者無法管理零字符的攻擊。
與上述其他評論類似,設計非預期的結果都是某種形式的SQL注入;可以肯定地說,任何非設計意圖的行為都是Sql注入的一種形式(請參閱上面的sleep(60)示例..有點酷:)? 那麼,長度為0的SQL注入,不一定要涉及任何SQL ....,只要您可以捆綁連接?
如果我知道我會繼續採取對策,@Dan很好。一般而言,這就是安全性問題。我們認為它是安全的,直到某些攻擊者證明不是。
Spencer Williams
2017-03-03 05:47:59 UTC
view on stackexchange narkive permalink

字段的長度與SQL注入無關,因為這種攻擊只需要註釋掉先前的代碼並啟動攻擊代碼即可,因此任何字段的長度都不會影響此策略。 / p>

我認為OP的要點是應用程序不會允許任意數量的文本到達數據庫-它仍然會截斷特定長度。
Almenon
2018-08-02 20:38:10 UTC
view on stackexchange narkive permalink

這裡有很多理論,但沒有實際例子。當我發現一個真實的sql注入漏洞(現已修復)時,我嘗試使用大約30個字符長的輸入字段。這讓我很沮喪,因為我花了一段時間才弄清刪除了30個字符後的所有內容,而30個字符並沒有給我留下太多的空間。

(許多sql注入示例都具有簡單的sql“例如select * from id = @id的表”,現實世界中的sql通常會復雜得多)

您可以獲得看中了您的輸入,SQL專家可能會使用一些技巧來減少有效負載計數。但是,如果您要選擇一些較長的表名,那麼無論您多麼棘手,都將需要很多字符。

無論如何,當我切換到使用超過1000個字符的輸入字段時,我發現有很多用於sql注入的方法。

就像我上面的許多評論者所說的那樣,針對sql注入的最佳防禦方法是準備好的語句



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...