我有一個我用GET提交的表單,這意味着數據會被附加到URL中。表單由安全令牌保護。爲什麼不能用GET提交表單
我總是被告知的形式應該用POST提交。在我的情況下,如果表單是用GET提交的,會發生什麼?那裏有什麼安全風險?
我有一個我用GET提交的表單,這意味着數據會被附加到URL中。表單由安全令牌保護。爲什麼不能用GET提交表單
我總是被告知的形式應該用POST提交。在我的情況下,如果表單是用GET提交的,會發生什麼?那裏有什麼安全風險?
真正的風險是用戶能夠確切地看到提交給服務器的參數,並且不僅可以爲該URL添加書籤(要重新提交),還可以修改URL以將其他可能無意義的參數提交給您服務器端腳本。
在某些情況下,這是可取的(例如谷歌使用,以GET該搜索可以書籤),在其他國家,這將帶來風險(登錄形式,例如)。
在你自己的情況下,它依賴於本質「安全令牌」,以及潛在的損害如果令牌是您的網站/應用的用戶可見(和可修正)。但值得注意的是,即使您使用POST提交表單,這在提交頁面的html源代碼中也是可見的。
根據服務器端腳本收到的數據會發生什麼情況,您還應該清理提交的信息,以減少SQL注入的範圍等等(+1到@Switz)。
正如DT所說,請參閱http://en.wikipedia.org/wiki/Session_fixation – TBH 2010-12-12 12:09:31
@ Down-voter:我不介意*被低估,但如果可以的話留下評論解釋*爲什麼*這將不勝感激,然後OP得到一個更加圓潤的論點/反對,我也可以學到一些東西。 *嘆息... * – 2010-12-12 12:45:51
作爲一個額外的說明,當然POST提交可以改變和篡改就像GET變量,所以這不是真正的原因。但是,如果表單本身不顯示在頁面上,除非用戶通過身份驗證,但該URL已公開(未經身份驗證),攻擊者也可以看到表單鍵。 – Kissaki 2010-12-12 12:52:26
如果你有一個很好的執行令牌,則沒有什麼區別,除了書籤問題。 GET將允許您使用提交的參數爲url添加書籤,POST不會。 至於什麼是很好的實現令牌,我會說12-15個字符長的隨機字符串,散列到MD5應該做的工作。
普遍得到被視爲容易被利用通過Cross Site Scripting Forgery,但同樣,如果你在的地方標記表示無所謂。
任何用戶都可以向服務器端腳本提交任何無意義或重新提交的數據,而不管數據如何在那裏發送(POST或GET),所以它不是一個有效的考慮因素......這是服務器端腳本驗證提交的數據,並決定是否處理它。在將敏感信息提交給服務器的情況下,您應該使用POST,以避免用戶爲其添加書籤,並且主要是爲了避免瀏覽器將其存儲在瀏覽歷史記錄中,以便任何人都可能查看用戶的密碼等。
數據清理是必不可少的,但與表單方法無關。針對XSS一般保護(htmlentities
),SQL注入(mysql_real_escape_string
)被認爲是應用戶的輸入(如果用戶提交的數據將出現在HTML源的前者,後者如果您使用的是提交來實現的最基本的保障數據與SQL訪問)。
如果你有一個大表格,注意對URL長度的限制爲每個瀏覽器
URL Length = protocol+domain+port+query_string (GET)
對於安全的關注,其他答案哈已經覆蓋了很好。
拿筆記,表單提交是書籤,能夠
Opera中URL的最大長度:2147483647字節 – mario 2010-12-12 15:39:10
IMO的主要原因使用POST是不是安全(您可以安全GET)不必需的,但它是有正確的語義的問題。
A GET
請求應該沒有副作用。例如,使用GET的搜索表單非常好。 GET請求可能會重複,如果用戶使用後退按鈕,或一些反病毒或interne加速器可能會在用戶實際訪問它之前執行它,...
GET的一個安全問題是url並因此令牌)成爲衝浪歷史的一部分。所以你必須使用GET請求的一次性令牌。
取決於表單的目的。 **你在說什麼特定的表單?** – 2010-12-12 13:20:06
這是一種可以創建或更新數據庫中的條目的表單。 – sami 2010-12-12 13:33:53
它應該始終是POST方法。根據HTTP標準和常識 – 2010-12-12 13:47:53