如果以防止「靜態」的網址被操縱的目標,那麼你可以簡單地加密參數,或簽字。對於URL參數的MD5以及一些鹽,它可能「足夠安全」。例如,鹽可以是存儲在會話中的隨機字符串。
那麼你可以:
http://example.com/service?x=123&y=Bob&sig=ABCD1324
該技術公開的數據(即,它們可以「看見」 XYZ = 123),但它們不能改變的數據。
有一個「加密」的優點(我使用這個術語鬆散)。這是您加密URL的整個參數部分的地方。
在這裏,你可以這樣做:
http://example.com/service?data=ABC1235ABC
有關使用加密的好處是雙重的。
一個它保護數據(例如,它們的用戶永遠不會看到xyz = 123)。
另一個特點壽就在於它的可擴展:
http://example.com/service?data=ABC1235ABC&newparm=123&otherparm=abc
在這裏,你可以解碼原始的有效載荷,並做了(安全)的新數據合併。
因此,請求可以將ADD數據添加到請求中,而不會更改EXISTING數據。
您可以通過簽名技術做同樣的事情,您只需要將整個請求合併到一個「blob」中,並且該blob被隱式簽名。這是「有效」加密,只是一個弱加密。
顯然你不想在客戶端做任何這樣的事情。毫無意義。如果你可以這樣做,「他們」可以做到這一點,你不能說出區別,所以你可能根本就不這樣做 - 除非你想通過正常的HTTP端口「加密」數據(vs TLS,但人們會明智地想知道「爲什麼打擾」)。
對於Java而言,所有這些工作都在Filter中進行,這就是我所做的。後端與此隔離。
如果您願意,您可以使用出站過濾器將後端完全隔離,該出站過濾器可以在出站時處理URL加密/簽名。
這也是我所做的。
不利的一面是,它非常重要,它使得它正確和高效。你需要一個輕量級的HTML解析器來提取URL(我寫了一個流解析器來實時動態地執行它,所以它不會將整個頁面複製到RAM中)。
好的一面是所有的內容方面「正常」,因爲他們不知道任何事情。
處理Javascript時還有一些特殊處理(因爲您的過濾器不會輕易「知道」哪裏有要加密的URL)。我解決了這個問題,要求將url標記爲特定的「var signedURL ='....'」,這樣我就可以在輸出中輕鬆找到它們。不要像你想象的那樣爲設計師減輕負擔。
過濾器的另一個亮點是您可以禁用它。如果你有一些「奇怪的行爲」發生,只需關閉它。如果行爲仍然存在,您會發現與加密相關的錯誤。它還讓開發人員以純文本工作,併爲集成測試留下加密。
很痛苦,但總體來說很不錯。
如果從形式發佈,該參數將不會是URL – DwB 2010-10-25 18:53:56
這就是爲什麼DWB說,「郵報」 – 2010-10-25 19:23:12
據我所知混淆是當數據被隱藏,因爲複雜(如ROT13或XOR的一部分操作),加密就是您必須知道訪問數據的祕密。 – 2010-10-25 20:07:43