」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解並防止 JavaScript 中的跨站請求偽造 (CSRF)

了解並防止 JavaScript 中的跨站請求偽造 (CSRF)

發佈於2024-11-08
瀏覽:492

Understanding and Preventing Cross-Site Request Forgery (CSRF) in JavaScript

介紹

在不斷發展的 Web 安全領域,跨站請求偽造 (CSRF) 仍然是開發人員必須解決的重大威脅,以確保 Web 應用程式的完整性和安全性。在這篇文章中,我們將深入探討什麼是 CSRF、它如何影響您的應用程序,並提供實用的解決方案來防止使用 JavaScript 進行 CSRF 攻擊。最後,您將對 CSRF 以及如何保護您的應用程式免受這種常見安全漏洞的侵害有深入的了解。

什麼是 CSRF?

跨站請求偽造 (CSRF) 是一種攻擊,它會誘騙使用者在經過驗證的 Web 應用程式上執行操作。與利用使用者對特定網站的信任的跨站腳本 (XSS) 不同,CSRF 利用網站對使用者瀏覽器的信任。

CSRF 攻擊如何運作

CSRF 攻擊通常涉及三個主要步驟:

1。受害者身分驗證: 受害者登入合法網站(例如他們的銀行)。

2.惡意要求: 攻擊者誘騙受害者造訪惡意網站,該網站代表受害者向合法網站發送請求。

3.執行: 合法網站處理該請求,因為該請求似乎來自經過身份驗證的用戶,從而導致轉移資金或更改帳戶詳細信息等不需要的操作。

CSRF 攻擊範例

考慮一個場景,銀行網站允許透過簡單的 GET 請求進行轉帳:

Click here to win $1000!

如果受害者在登入銀行帳戶時點擊此鏈接,轉帳將在未經他們同意的情況下執行。

防止 CSRF 攻擊

為了防止CSRF攻擊,開發者可以實施以下幾種策略:

1。同步器令牌模式(CSRF 令牌)
2. SameSite Cookie
3.雙重提交 Cookie

1. 同步器令牌模式(CSRF令牌)

防止 CSRF 攻擊的最有效方法之一是使用 CSRF 令牌。 CSRF 令牌是伺服器產生並傳送到客戶端的唯一、秘密且不可預測的值。該令牌必須包含在客戶端發出的任何狀態變更請求中。

逐步實施:

1。產生 CSRF 令牌:

const generateCSRFToken = () => {
    return crypto.randomBytes(24).toString('hex');
};

2.將 CSRF 令牌傳送給客戶端:

在您的 HTML 表單中,包含 CSRF 令牌作為隱藏欄位:

3.驗證伺服器上的 CSRF 令牌:
在伺服器端,驗證每個狀態變更請求的令牌:

const validateCSRFToken = (req, res, next) => {
    const token = req.body.csrf_token;
    if (token === req.session.csrfToken) {
        next();
    } else {
        res.status(403).send('CSRF validation failed');
    }
};

2. 同站點 Cookie

Cookie 的 SameSite 屬性可以透過控制跨網站請求發送 Cookie 的方式來減輕 CSRF 攻擊。

res.cookie('session', 'value', { sameSite: 'Strict' });

3.雙重提交Cookie

雙重提交 cookie 方法涉及將 CSRF 令牌作為 cookie 和請求參數發送。

逐步實施:

1。將 CSRF Token 設定為 Cookie:

res.cookie('csrfToken', csrfToken, { httpOnly: true });

** 在請求中包含代幣:**

** 3. 驗證伺服器上的代幣:**

const validateCSRFToken = (req, res, next) => {
    const token = req.cookies.csrfToken;
    const bodyToken = req.body.csrf_token;
    if (token && token === bodyToken) {
        next();
    } else {
        res.status(403).send('CSRF validation failed');
    }
};

結論

跨站點請求偽造 (CSRF) 是一種嚴重威脅,可能會危及 Web 應用程式的安全。透過了解 CSRF 攻擊的工作原理並實施強大的預防技術(例如 CSRF 令牌、SameSite cookie 和雙重提交 cookie),您可以保護您的應用程式和使用者免受此常見漏洞的影響。在開發過程中始終優先考慮安全最佳實踐,以確保安全可靠的使用者體驗。

立即在您的 JavaScript 應用程式中實作這些 CSRF 預防技術並保護您的使用者資料。在下面的評論中分享您的想法和經驗。不要忘記關注更多網路安全提示和技巧!

版本聲明 本文轉載於:https://dev.to/rigalpatel001/understanding-and-preventing-cross-site-request-forgery-csrf-in-javascript-2ne0?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-03-12
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符在postgresql中提取最後一行,您可能需要遇到與數據集合中每個不同標識的信息相關的信息。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: id dat...
    程式設計 發佈於2025-03-12
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-03-12
  • Python命名元組詳解:對比普通元組的優勢
    Python命名元組詳解:對比普通元組的優勢
    命名的元組是輕量級且易於創建的對像類型,可通過提供命名屬性來增強該元素的可用性。讓我們深入研究其用法和與常規元素的比較。 的創建和命名元組的用法創建命名元組,我們使用collections.namedtuple Factory函數。例如,為要點定義一個命名元組:可以像常規元組一樣創建此名稱元組的實...
    程式設計 發佈於2025-03-12
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    程式設計 發佈於2025-03-12
  • VS Code & Delve 調試Go代碼:Build Tags配置指南
    VS Code & Delve 調試Go代碼:Build Tags配置指南
    在Visual Studio Code中使用標籤進行調試,並在使用構建標籤來編譯GO程序的各種版本時,請在delve debugger 中使用,這對於配置DEBUGGER以配置最佳debugger以進行最佳利用。標籤:在Visual Studio Code的GO插件中指定構建標籤,您可以使用bui...
    程式設計 發佈於2025-03-12
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-03-12
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-03-12
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-03-12
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-03-12
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-03-12
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-03-12
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-03-12
  • Laravel要去:我的旅程和纖維API樣板的創建
    Laravel要去:我的旅程和纖維API樣板的創建
    花費四年以上,我對MVC(Model-View-Controller)架構非常熟悉。它的簡單性和結構使與之合作變得很高興,而Laravel的有條理的文件夾可幫助開發人員保持正軌。您始終知道將代碼放置在哪裡,以及廣泛的內置工具 - 數據庫連接,redis,排隊,遷移,ORM等等 - 將設置無縫。只需...
    程式設計 發佈於2025-03-12
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中可能會遇到一個衝突,其中3派對軟件包將另一個帶有導入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    程式設計 發佈於2025-03-12

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3