
掌握ChatGPT插件與自定義GPT
相當令人印象深刻,對吧?
好的,那么首先什么是訪問控制?
好吧,如果您已經看到了登錄頁面,那么您已經與訪問控制的實現進行了交互。
訪問控制,通常稱為授權,是一組強制訪問資源的機制和策略。
通常,一旦服務器通過身份驗證機制確定了您的身份,它就會授予或限制您在系統中可以訪問的資源。
此外,授權基礎設施是用戶跟蹤和資源監控的支柱。
充分實施強大而安全的訪問控制系統是一項復雜而棘手的任務。訪問控制本質上與系統架構密切相關。
由于大多數平臺的用戶通常扮演多個角色,因此訪問控制的復雜性可能會呈指數級增長。
開發強大的訪問控制是一項艱巨的挑戰,即使是經驗豐富的工程師也難以應對。根據系統的規模和復雜性,適當的解決方案可能意味著實施簡單的身份驗證、第三方庫,甚至兩者兼而有之。
值得慶幸的是,JavaScript 和 Angular 擁有流行且強大的解決方案,例如auth0和JWT(JSON Web Tokens),等等。
簡而言之,破壞的訪問控制包括可能影響您訪問系統組件的威脅或漏洞。
訪問控制被破壞可能會給您的系統帶來災難性的后果,因為它允許攻擊者在您的平臺上肆意妄為。因此,解決任何存在的漏洞至關重要。
現在我們了解了訪問控制中斷的概念,讓我們來討論一下這些攻擊的實際例子。
我們將重點關注不安全的 ID、路徑遍歷、文件權限漏洞和客戶端緩存攻擊。
大多數存儲數據的關系數據庫都使用 ID 來識別資源。此外,現代網站使用某種形式的 ID 或索引來快速高效地檢索數據。因此,如果您的網站允許用戶為這些敏感資源輸入他們的 ID,并且這些 ID 很容易猜到,那么您就很容易受到這種攻擊。
讓我們舉例說明。
假設您有一個顯示用戶個人資料的個人資料頁面部分。然后以下 URL 檢索用戶個人資料。
https://www.mywebsite.com/profile?id=123
但是,如果我手動更改查詢字符串中的數字并且不存在活動訪問控制,那么我就可以訪問任何配置文件。
為了減輕這種脆弱性,我們必須在開發周期早期解決它。
首先,ID 不應容易被猜到。因此,您必須開發系統,使所有 ID(或至少屬于敏感資源的 ID)都經過混淆且獨一無二。您可以通過將全局唯一標識符(或GUID)實現為 ID 來實現這一點。
另一個可靠的解決方案將涉及每個請求的會話驗證以及適當的訪問控制。
路徑遍歷背后的想法是在未經授權的情況下瀏覽文件系統的目錄樹。?
這意味著允許用戶訪問服務器文件系統中的資源的系統存在漏洞。
如果路徑字符串可供修改且不存在驗證,則此漏洞尤其危險。
為了說明,請看以下場景。
https://www.mywebsite.com/photos?file=user.png
在這種情況下,攻擊者可以將user.png更改為../../etc/passwd并訪問應用程序的數據。
為了減輕路徑遍歷攻擊,您必須對用戶輸入進行適當的驗證,并限制對應用程序外部的服務器目錄的訪問。
幸運的是,這方面的責任通常由服務器工程師承擔。但是,如果您啟用需要訪問和修改服務器中的文件(如文件上傳)的功能,請確保實施強大且經過測試的庫。
文件權限漏洞與服務器文件系統有關。
應用程序包含許多不應修改的配置文件和資源,在大多數情況下,用戶無法讀取或執行這些文件和資源。然而,如果沒有適當的配置策略,攻擊者就可以瞄準這些文件并控制整個平臺。
為了說明這一點,這里有一個嘗試訪問不可讀文件的示例。
https://www.mywebsite.com/photos?file=../../angular.json
解決文件權限漏洞需要對服務器配置和維護有廣泛的了解。因此,我們建議您咨詢服務器工程師并避免觸碰任何東西。除非您絕對需要修改服務器權限以添加與文件操作相關的功能,否則請將此事留給服務器工程師。
現在,您的某些客戶端很可能與其他用戶共享計算機。不幸的是,這是我們作為開發人員無法控制的情況,但它會導致客戶端緩存等漏洞。
客戶端緩存漏洞很難緩解,因為它們涉及攻擊者利用會話憑證、緩存頁面或存儲在經過身份驗證的客戶端的瀏覽器中的數據。
要利用此類漏洞,攻擊者需要物理訪問受害者的計算機。一旦獲得訪問權限,足夠有決心的攻擊者就可以破壞用戶數據。
對于客戶端緩存,最有效的解決方案就是不在客戶端上存儲敏感的用戶信息。但是,如果由于某些業務需求而必須這樣做,請確保實施適當的 HTML 元標記和異步驗證以確認顯示的權限。
許多因素都會使解決訪問控制漏洞變得非常簡單或極具挑戰性。系統架構、平臺復雜性和數據敏感性只是其中的一部分。
保護系統安全的第一步應該始終是實施適當的身份驗證機制。
就安全性而言,實施auth0之類的解決方案?將幫助您實現大部分目標。出于本文的目的,我們僅探討如何實施基本的 auth0 登錄。但是,如果您想要更多自定義功能,也可以探索 JWT 之類的解決方案。?
首先,運行以下命令將 auth0 添加到您的 Angular 項目。
ng add @auth0/auth0-angular
現在,轉到項目 src 文件夾內的app.module.ts文件并導入模塊。您可以在此文件中指定域和客戶端 ID。
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
// Import the module from the SDK
import { AuthModule } from '@auth0/auth0-angular';
@NgModule({
declarations: [
AppComponent,
HomeComponent
],
imports: [
BrowserModule,
AppRoutingModule,
// Import the module into the application, with configuration
AuthModule.forRoot({
domain: 'YOUR_AUTH0_DOMAIN',
clientId: 'YOUR_AUTH0_CLIENT_ID',
}),
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
最后,轉到您想要添加登錄功能的組件并導入AuthService模塊。
import { Component } from '@angular/core';
// Import the AuthService type from the SDK
import { AuthService } from '@auth0/auth0-angular';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
title = 'My App';
// Inject the authentication service into your component through the constructor
constructor(public auth: AuthService) {}
loginWithRedirect(): void {
// Call this to redirect the user to the login page
this.auth.loginWithRedirect();
}
}
現在,您需要做的就是設置正確的域和客戶端 ID,添加一個按鈕來顯示登錄,瞧,您就擁有了一個具有身份驗證機制的登錄功能。
當然,還需要進行許多調整才能完成實施,但為此,我們將引導您訪問 auth0 wiki 頁面,其中有關于如何正確實施其解決方案的詳盡指南。
現在您了解了什么是破壞的訪問控制,以及如何通過結合適當的身份驗證機制、適當的系統架構實施和輸入驗證來減輕其影響,您的系統就有更好的機會抵御潛伏在網絡上的惡意行為者。
緩解訪問控制漏洞的方法與漏洞數量一樣多。此外,網絡上每天都會出現新的威脅,其中任何一個都可能對我們的平臺造成毀滅性打擊。
不幸的是,實現強大的訪問控制策略可能是一項艱巨的任務。對于擁有眾多服務和前端的大型復雜平臺來說,情況尤其如此。
盡管如此,我們必須盡力彌補盡可能多的差距。
文章來源:Angular Broken Access Control Guide: Examples and Prevention