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

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

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

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]刪除
最新教學 更多>
  • 引用計數與追蹤垃圾收集
    引用計數與追蹤垃圾收集
    你好,Mentes Tech! 您知道記憶體釋放上下文中的引用計數和引用追蹤是什麼嗎? 引用追蹤(或追蹤垃圾收集)和引用計數(引用計數)之間的區別在於每種技術用於識別和釋放不存在的物件記憶體的方法。使用時間更長。 我將解釋每一個,然後強調主要差異。 引用計數(引用計數) 工作...
    程式設計 發佈於2024-11-08
  • 單行SQL查詢失敗時如何傳回預設值?
    單行SQL查詢失敗時如何傳回預設值?
    單行查詢失敗時傳回預設值在執行SQL查詢以取得特定資料時,常會遇到沒有對應行的情況存在。為了避免傳回空結果,您可能需要提供預設值。 考慮以下 SQL 語句,該語句檢索流的下一個計劃項目:SELECT `file` FROM `show`, `schedule` WHERE `channel` = ...
    程式設計 發佈於2024-11-08
  • Cypress 自動化可訪問性測試:綜合指南
    Cypress 自動化可訪問性測試:綜合指南
    介紹 輔助功能是 Web 開發的重要方面,確保所有使用者(包括殘障人士)都可以與您的 Web 應用程式有效互動。自動化可訪問性測試有助於在開發過程的早期識別和解決可訪問性問題。在這篇文章中,我們將探討如何使用 Cypress 實現自動化可訪問性測試,利用 cypress-axe 等...
    程式設計 發佈於2024-11-08
  • 為什麼 Javascript 和 jQuery 找不到 HTML 元素?
    為什麼 Javascript 和 jQuery 找不到 HTML 元素?
    Javascript 和jQuery 無法偵測HTML 元素當嘗試使用Javascript 和jQuery 操作HTML 元素時,您可能會遇到令人沮喪的問題未定義的元素。當腳本嘗試存取 HTML 文件中尚未定義的元素時,就會發生這種情況。 在提供的 HTML 和腳本中,「script.js」檔案在其...
    程式設計 發佈於2024-11-08
  • Polars 與 Pandas Python 資料幀的新時代?
    Polars 與 Pandas Python 資料幀的新時代?
    北極熊與熊貓:有什麼區別? 如果您一直在關注 Python 的最新發展,您可能聽說過 Polars,一個用於處理資料的新程式庫。雖然 pandas 長期以來一直是首選庫,但 Polars 正在掀起波瀾,尤其是在處理大型資料集方面。那麼,Polars 有什麼大不了的呢?它和熊貓有什麼...
    程式設計 發佈於2024-11-08
  • 使用 Golang 使用 Api 閘道模式建立基本的微服務線上商店後端 - 第 1 部分
    使用 Golang 使用 Api 閘道模式建立基本的微服務線上商店後端 - 第 1 部分
    Introduction Hey, fellow developers! ? Ever thought about building a microservices architecture but felt overwhelmed by where to start? Worry...
    程式設計 發佈於2024-11-08
  • 如何有效率地尋找多個Python清單中的相交元素?
    如何有效率地尋找多個Python清單中的相交元素?
    識別多個Python列表中的共享元素在Python中,提取兩個列表的交集可以使用set.intersection()函數來實現。然而,確定多個清單的交集變得更加複雜。這是一個有效識別多個清單之間共享元素的解決方案:答案中提供的公式set.intersection(*map(set,d)) 提供了一種...
    程式設計 發佈於2024-11-08
  • 如何取得 Openpyxl 中單元格的原始值,即使它包含公式?
    如何取得 Openpyxl 中單元格的原始值,即使它包含公式?
    如何在Openpyxl 中擷取實際儲存格值使用openpyxl 存取Excel 中的儲存格值時,您可能會遇到顯示的值與儲存在Openpyxl中的實際值之間的差異單元格(如果單元格包含公式)。這是因為 openpyxl 通常會解釋公式並檢索計算結果。 要擷取實際儲存格值(包括公式),可以在載入工作簿時...
    程式設計 發佈於2024-11-08
  • Go 中如何有效率地將 UTF-8 字串轉換為位元組數組?
    Go 中如何有效率地將 UTF-8 字串轉換為位元組數組?
    將UTF-8 字串轉換為位元組陣列解組JSON 需要位元組切片輸入,而字串在Go 中儲存為UTF-8 。本文探討了 UTF-8 字串到位元組數組的高效轉換。 直接轉換Go 允許將字串轉換為位元組切片,建立字串位元組的副本:s := "some text" b := []byte(...
    程式設計 發佈於2024-11-08
  • 我如何使用 dpdm 修復 Redux 中的循環依賴錯誤
    我如何使用 dpdm 修復 Redux 中的循環依賴錯誤
    打破混亂循環:Redux 循環依賴之旅 最近,我在 Redux 程式碼庫中偶然發現了一個讓我摸不著頭緒的錯誤。如果您曾經在測試套件拋出毫無意義的錯誤時感到突然的混亂,您就會知道這種感覺。這是發生的事情以及我最終如何發現(並解決)問題的。 循環依賴到底是什麼? 當兩...
    程式設計 發佈於2024-11-08
  • 我可以在單一 MySQLi 語句中準備多個查詢嗎?
    我可以在單一 MySQLi 語句中準備多個查詢嗎?
    在單一 MySQLi 語句中準備多個查詢不可能在單一 MySQLi 語句中準備多個查詢。每個 mysqli_prepare() 呼叫只能準備一個查詢。 執行多個查詢的替代方法如果您需要一次執行多個查詢,您可以建立並為每個查詢執行單獨的mysqli_prepare() 語句。 $stmtUser = ...
    程式設計 發佈於2024-11-08
  • 在 Golang 中安全使用 Map:宣告和初始化的差異
    在 Golang 中安全使用 Map:宣告和初始化的差異
    介绍 本周,我正在为 golang 开发一个 API 包装器包,它处理发送带有 URL 编码值的 post 请求、设置 cookie 以及所有有趣的东西。但是,当我构建主体时,我使用 url.Value 类型来构建主体,并使用它来添加和设置键值对。然而,我在某些部分遇到了有线零指针...
    程式設計 發佈於2024-11-08
  • 下一個目標
    下一個目標
    我剛剛完成了我的論文,並以令人印象深刻的分數9.1/10,我對此感到非常自豪。提交給 REV-ECIT 2024 的截止日期是 9 月 30 日,目的是將我的論文變成已發表的期刊文章。目前我正在博士生導師的支持下完善我的工作,非常感謝他的指導。 ? 另外,在與SA進行了很長時間的面試後,提出了一...
    程式設計 發佈於2024-11-08
  • Better - 人工智慧驅動的程式碼審查器 GitHub Action
    Better - 人工智慧驅動的程式碼審查器 GitHub Action
    代码审查对于维护标准和强调项目中代码的最佳实践始终至关重要。这不是一篇关于开发人员应该如何审查代码的文章,更多的是关于将一​​部分代码委托给 AI。 正如 Michael Lynch 在他的文章“如何像人类一样进行代码审查”中提到的那样——我们应该让计算机处理代码审查的无聊部分。虽然迈克尔强调格式化...
    程式設計 發佈於2024-11-08
  • 如何使用 Java 8 有效統計列表中的詞頻?
    如何使用 Java 8 有效統計列表中的詞頻?
    使用 Java 8 計算詞頻在 Web 開發和資料分析中,理解詞頻至關重要。為了實現這一目標,我們將深入研究如何使用 Java 8 計算清單中單字的頻率。 Java 8 解決方案Java 8 中的 Stream API 為單字提供了一個優雅的解決方案頻率計數。首先,建立一個單字清單:List<...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3