題:
由於權限原因,用戶無法通過UI導航到網頁,但可以通過粘貼URL導航到頁面。我該如何防範?
Michael
2017-10-10 21:33:32 UTC
view on stackexchange narkive permalink

在我的應用程序中,用戶具有某些具有權限的角色。這些權限指示在主屏幕上可以使用哪些UI元素。許多元素鏈接到其他頁面,許多用戶看不到這些頁面,因為他們的權限不允許他們訪問該網頁。

例如,名為 button1 的按鈕鏈接設置為應用程序中的隨機頁面,例如 http://www.example.com/example.jsp 。但是,用戶John的權限設置不允許他查看 button1 。因此,John無法訪問 http://www.example.com/example.jsp

我遇到的問題是,如果我以John的身份登錄,並且我粘貼了該URL,它將帶我到頁面。

很明顯,如果攻擊者獲得了指向管理員頁面的URL,這將帶來巨大的安全風險。那麼,我該如何防範呢?我需要驗證每個頁面的用戶,檢查權限並確保允許它們存在嗎?

此應用程序中有數百個頁面,而且看起來非常多餘並且包含效率很低每個頁面上的代碼來執行此操作。有沒有比我剛才提到的方法更簡單的方法?

我很好奇這是否被視為與“ [[強制瀏覽](https://www.owasp.org/index.php/Forced_browsing)”)相同的問題?該頁面將其描述為查找從未公開的頁面,而不是繞過用戶權限檢查。
@Michael如果實際上在每個頁面上執行代碼都需要分別修改每個頁面,則您可能還會在做其他錯誤的事情。如果您沒有針對站點範圍的安全性和完整性檢查的準備,則應盡快添加它,而不是以後添加。開發人員是否接受過安全培訓?這裡到處都是危險信號,修復找到的問題將使未找到的問題保持不變。
由於看起來您的應用程序是基於servlet的,因此值得一看的是Spring Security(即使Spring很棒,您也不必使用Spring來使用它)。
是的,每個頁面,每個破壞性操作以及每個公開私有數據的操作。您在這裡所擁有的被稱為“跨領域關注點”
不應僅通過隱藏UI元素來強制執行權限;),而是有了答案,我認為您現在已經明白了
我總是嘗試更改URL ust來獲得樂趣。當只有一個enable.php時,我嘗試使用disable.php為例。
如果您當前正在客戶端級別進行安全檢查(這很不錯,可以避免對服務器的無用查詢,但絕不能保證安全),則可能還有其他安全問題,例如SQL注入。確保服務器正確處理了客戶端拋出的所有數據(是的,因為每個人都已經提到過您的服務器必須確保允許當前登錄的用戶執行當前的HTTP查詢)。
我還沒有閱讀任何答案中的魔術字。**做。不。相信。輸入。曾經。**。
-1
@danbru1211我以為我不小心闖入了網絡,直到我意識到這只是公司所銷售產品的演示。密碼“ security”是客戶端的“ md5”哈希,如果您執行了與您描述的操作類似的操作,則密碼將完全破解。不過,這是執行真正的基本筆測試的好方法。
我有一個GreaseMonkey腳本,通過按“僅一個鍵”,我可以查看頁面上的“所有隱藏元素”!試想一下,如果我實際上不願意閱讀源代碼,該怎麼辦?
“ *我遇到的問題是,如果我以John *身份登錄”-為什麼您一開始可以隨意登錄他人的帳戶?
您需要實現javax.servlet.Filter接口。它使您能夠處理每個請求。順便說一句,jsp已經過時了,除非這是一個大學項目,否則您應嚴格放棄Java EE並繼續使用具有所有這些基本必需品的更現代的框架。
抱歉,您似乎對基本的Web應用程序安全性一無所知。您應該看看[OWASP前十名](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)。
令我驚訝的是,這種情況實際上是多麼普遍...
七 答案:
Trickycm
2017-10-10 21:43:34 UTC
view on stackexchange narkive permalink

我是否需要為每個頁面驗證用戶?

絕對。不僅每個頁面,而且對特權資源的每個請求,例如對更新數據,刪除,查看等的POST請求。這不僅與查看頁面有關,還與控制誰可以在系統上執行操作有關。 / p>

這聽起來像您的整個身份驗證和權限系統在當前實施中已損壞。解決這個問題的步驟對於這個答案來說太寬泛了。值得對該論壇和更廣泛的網絡進行一般搜索,以找到適合您的框架的解決方案(JSP,ASP.Net,PHP等)。大多數框架具有解決此問題的即用型功能。

一個好的開始就是OWASP的高級指南:操作安全性:管理接口

我只想重申一下,因為在OP階段您的回答並非一件小事:是的,這絕對是正確且唯一的答案。每個頁面都必須正確執行安全規則。聽起來當前存在的只是客戶端安全性,實際上它不提供任何安全性。有多種方法可以編寫代碼,以便您可以輕鬆地在每個頁面上應用安全性,但是沒有答案不涉及對每個單獨的請求強制執行安全性。否則,您將沒有任何安全性。
要比您說的Trickycm更加精確,理想情況下,您需要找到一個統一的解決方案來處理導航鏈接/按鈕/ ...和直接URL導航。由於它是統一的,因此您幾乎沒有機會忘記一件事。因為如果不是這樣,則意味著您始終必須處理同一安全性的至少兩個不同的偏離(請注意:我目前擁有,並且確實需要統一它:3)。
請注意:“ AJAX請求”也是請求,並且“應該經過驗證”。無關緊要的是,該特定的AJAX請求僅應發生在已驗證用戶的頁面上。我知道答案屬於“每個請求”。確保OP也知道這一點。
還有一點:必須在服務器上**進行此檢查-而不是在客戶端上運行(或不運行)的javascript代碼。惡意用戶可以避免運行javascript代碼。
最後:使用javascript隱藏用戶無權訪問的鏈接很好-但這是擁有一個不錯的UI而不是安全性的問題。
在本文中的某處包含“授權”一詞可能會很有用,因為這也是描述權限檢查/管理的常用術語,因此可能對搜索有所幫助。
@MartinBonner我更希望“隱藏” PHP中的鏈接-可能會更慢,但是如果這些鏈接從未生成HTML,則即使客戶端/用戶通過瀏覽器梳理了源代碼,也不會更明智。檢查員。
@psosuna為什麼客戶端/用戶可以找到URL會很重要?他們不能對他們做任何事情。如果他們嘗試使用這些URL,服務器將只說“對不起,您不是管理員”。
@immibis出於清潔的考慮(如果有的話)。可能是站點中的*一頁*並未強制執行安全性(應該如此!),並且在客戶端檢查源代碼時可以發現其地址。為了減輕這種可能性,最好不要公開它,不是嗎?我說,安全比後悔好。
@psosuna: [聳聳肩]我不太在乎隱藏鏈接的位置。關鍵是隱藏鏈接並不是真正的安全性,它是關於一個好的UX。(儘管在這種情況下,好的UX當然不會與安全衝突。)
@MartinBonner完全同意您的意見,但是總的來說,安全性是關於層次的。雖然隱藏鏈接當然不是安全的,但它可以提供幫助。如果安全檢查中某處存在錯誤,則不具有鏈接仍然會增加某些內容,因此我也更喜歡不首先將數據發送給客戶端。(我將其視為另一層)。
出於所有目的和目的,必須將服務器未直接進行身份驗證和授權的所有資源/請求都視為公開。如果您不檢查X請求是否來自具有適當權限的註冊用戶,則X請求是公共的,任何人都可以訪問,無論您的UI將提供什麼。
Stilez
2017-10-11 22:42:57 UTC
view on stackexchange narkive permalink

快速的答案是肯定的。但這並不一定是您正在考慮的繁瑣工作。 (整個安全性可能很大,但這只是其中一部分)。您還有比這更嚴重的問題。

為什麼重要

您創建的任何內容都會受到嘗試破壞它的打擊。有人會很好奇。有人會做一些您從未想到的事情,而這違背了您的想法。有人會好奇,惡意或流鼻涕。

您還應該理會您的軟件/網絡應用 將通過自動化工具進行嚴格測試。擁有在線門戶(幾乎所有類型)的服務器在首次上線後的數十分鐘內就被黑客發現,並開始針對可能發生的任何安全漏洞或疏忽進行檢測。這意味著他們將探查“幕後”究竟在運行什麼,以及可被利用的任何可檢測到的失誤(在數據驗證,跨腳本驗證,SQL或二進制注入,JavaScript hacking,後端本身,什麼?強迫某些事情失敗,暴露哪些數據會導致弱點...)。

您的網絡服務器 將通過數百種(即使不是數千種)自動化工具,不斷地針對任何可能的Web代碼和後端失效進行探測。人類和用戶一樣,而不是人類。

您是希望這是遙不可及的,但會被評論家,媒體和憤怒的用戶強力引起您的注意,還是導致賠償責任?還是您想修復它?

如何解決它

從某種意義上說,這並不是一項艱鉅的工作。您創建一個安全框架,然後每個頁面導入或使用它。這樣做的概念並不難,並且有據可查。因此,頁面數量並不重要。

這項工作的困難之處在於安全性是困難。您真正的問題是,由於存在這些問題並且您正在問這些問題,所以您沒有足夠的希望去做,而無需幫助。說真的您。做。不是。

我不知道您擁有多少規模的團隊或資源。您需要它-在沒有外部幫助的情況下,您可能沒有希望。

我在這裡真正擔心的是

也就是說,我真正關心的不是網絡應用。

假設我正在考慮購買或使用您的應用。

這顯然無助於或使讀者放心,您顯然將安全性視為事後思考,對工作的干擾或事後的不便修復(或者至今為止對這種方式的理解不夠深),也許問題出在真正的基礎上,例如正確編碼按鈕URL 。

安全性是您的工作,因為無論產品/服務在技術上多麼出色,並且無論其用戶是誰,您的真實產品都是對您的信任和保證。您可以滿足我的需求,而不會給我造成重大災難。

我應該將我的數據信任您的應用程序嗎?現在,很抱歉,我想我也可以將其發佈在Google+上。是的,這是一種“糟糕”的情況和印象,而且這並沒有誇大其效。

對不起。

現在,如果您的應用程序有好處,請其他人參與。

後者似乎建議客戶根據安全性來決定產品。除了在某些非常非常特定的領域中,這是不正確的,而且從業務PoV角度來看,在無功能性需求(如啟動安全性)上花費多於光禿禿的錢是一個可怕的主意。是的,這裡的每個人都討厭這種心態,但簡單的事實仍然是用戶不關心安全性,即使他們做到了,他們也無法判斷什麼是安全的,什麼不是(不相信嗎?WhatsApp的TextSecure / Signal用戶號)
您正在考慮預先。最初不是,不是。但是,一旦知道一個重大問題-是的。一旦獲得評論-是的。一旦社交媒體開始獲得超過一兩個人的評論,例如“發生了什麼以及它如何發生”。人們並沒有積極地尋求安全性,但是他們確實會考慮評論和公共知識(如果有的話),而且還會有一段時間。(我確實同意,如果他們先看會更好,但是如果它是一個主要問題(如操作說明所示),它將很快就可以看到-正確的說明是什麼時候搞砸了,有人發怒地張貼了它)
Silencer310
2017-10-11 02:46:02 UTC
view on stackexchange narkive permalink

您需要檢查 用戶權限級別,以每個請求(獲取,發布,放置,刪除)。瀏覽到頁面,例如您的情況是GET請求。未經許可,用戶也不應發布請求。

現在是否需要在應用程序的每個頁面上添加代碼取決於您的應用程序框架。例如,某些框架(Laravel,Express.JS)允許您對路由進行分組並為該路由的每個請求應用過濾器,這就是檢查的地方。對於純PHP的應用程序,您需要在每個頁面上都有代碼,可以使用“ include”語句來最大程度地減少整個代碼塊的重複。

HEAD或任何其他[怪異的HTTP方法](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)也是如此(除非您*總是*始終阻止它們)。
psosuna
2017-10-11 04:11:22 UTC
view on stackexchange narkive permalink

之前已經說過,但是,是的,您應該在每個頁面上驗證用戶憑據。例如,如果您的站點使用PHP,則最簡單的方法是將登錄用戶及其特權級別保存在會話變量中,然後在代碼開頭對這些會話變量進行驗證。這些將在註銷(如果您創建註銷邏輯來擦除這些變量)或會話超時(可以定義超時時間,但我認為默認值為5分鐘的不活動時間)時擦除,因此未經授權的用戶不應能夠訪問頁面。其他技術將具有類似的處理方式。

我說這句話的意思並不是真的屈尊,所以希望您不要這麼認為,但這只是種基本信息。如果您在自學過程中以某種方式沒有學習到此內容,或者沒有遇到過這個問題,我強烈建議您注意這一點,並深入閱讀該特定主題,因為它非常重要。您將一次又一次地為任何類似的應用程序進行此操作。

請注意,有多種方法可以簡單有效地完成此任務,我個人對您的建議是按照自己的邏輯練習編碼,以便您完全理解它在嘗試使用框架之前有效。針對多種訪問方法進行測試,一旦感到滿意,就可以研究各種框架如何執行用戶會話處理。

編輯:我在下面的評論中對此進行了評論,但這實際上也是OP的良好資源: https://www.w3schools.com/ php / php_sessions.asp

PHP為這些會話變量提供哪些安全保證?它們是否存儲在客戶端計算機上?如果不是,客戶端如何識別其會話?客戶端數據是否已加密?是否有防止共享客戶端數據的保護措施?
這是對PHP會話的快速簡單說明:https://www.w3schools.com/php/php_sessions.asp。信息和會話變量不存儲在客戶端,僅存儲在服務器端。服務器向客戶端提供密鑰。該密鑰用於標識用戶當前正在參加的會話。
除了@jpmc26之外,還包括:PHP =超文本* Pre- *處理器。這意味著PHP代碼在服務器端運行。它在HTML之前執行,因此有很多東西不需要傳輸到用戶的機器上。這就是為什麼PHP是進行身份驗證的好選擇的原因,因為可以在將響應發送回客戶端之前驗證輸入數據。
哦,我對PHP作為服務器端技術非常熟悉。(我在Web應用程序上謀生,而不是在PHP上謀生);)但是我知道*某些內容必須存儲在客戶端,這樣才能識別用戶會話。因此,我想知道有關此數據是否已加密以及您擁有什麼的信息(用於防止會話劫持或有意與其他用戶共享密鑰)。例如,請參閱[此批評](https://security.stackexchange.com/a/18898/46979)。不過,我不知道在過去5年中某些情況是否發生了變化。
@jpmc26我認為批評的針對性很差:它是關於共享服務器配置錯誤的,以便用戶可以訪問彼此的數據。答案不是加密,而是將會話放在其他用戶無法訪問的目錄中。如果沒有這樣的目錄,他們仍然可以訪問您的解密密鑰。它也與會話劫持無關,它通常描述了攻擊者*在客戶端*竊取會話標識符。加密也無濟於事。
@jpmc26由於擔心話題太離譜,您可以使用csrf令牌來確保會話安全。您執行的每個操作都會刷新令牌(因此,我使用我的令牌=>服務器請求執行某些操作會發回新令牌以用於下一個操作)。
Majid Khan
2017-10-10 22:11:12 UTC
view on stackexchange narkive permalink

無論用戶鍵入地址還是單擊鏈接,用戶都不能導航到頁面。

問題的通用解決方案是使用基於角色的訪問控制( RBAC)方法。創建不同的組,並將具有相同特權的用戶分配給相應的組。同樣,將網頁和其他資源分組到不同的文件夾中;每個由特定組擁有。我使用 chgrp (更改組)在運行帶有輕量級Web服務器的嵌入式Linux的系統上實現了這一目標。通過放置.htaccess文件並拒絕訪問,如 Stack Overflow所述,可以在Apache Web服務器中實現相同的目的。

對於UI元素,您將創建不同的頁面(或通過組檢查隱藏元素)。您將需要識別用戶(登錄他們並確定他們對應的組),然後根據用戶的權限顯示網頁。

Jester
2017-10-11 02:25:04 UTC
view on stackexchange narkive permalink

關於實現的快速建議,因為您對100頁的頁面有些擔心。例如,在ASP.NET MVC中,您可以創建一個全局過濾器或一個其他所有其他類都可以從其繼承的“基本”頁面。並將其與當前頁面的權限/許可/或組成員身份列表進行比較(可能是每個頁面上的數據結構或基於頁面名稱的數據庫查找等)。

Readin
2017-10-14 07:44:13 UTC
view on stackexchange narkive permalink

其他答案非常籠統,因此我將其添加,因為提到了 JSP頁,因此我認為我可以假設您正在使用Java。

,您很可能可以使用過濾器在每次向應用程序發出請求時執行代碼。如果您使用像 Spring這樣的安全框架,則可以配置可能由誰訪問的URL。



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