例子:

考慮一個可能容易受到 JavaScript 注入的簡單登入表單。以下是保護它的方法:

HTML:

JavaScript:

document.getElementById(\\'login-form\\').addEventListener(\\'submit\\', function(event) {    const username = document.getElementById(\\'username\\').value;    const password = document.getElementById(\\'password\\').value;    if (!validateInput(username) || !validateInput(password)) {        alert(\\'Invalid input\\');        event.preventDefault();    }});function validateInput(input) {    const regex = /^[a-zA-Z0-9_]*$/;    return regex.test(input);}

伺服器端(Node.js 範例):

const express = require(\\'express\\');const app = express();const bodyParser = require(\\'body-parser\\');const mysql = require(\\'mysql\\');const db = mysql.createConnection({    host: \\'localhost\\',    user: \\'root\\',    password: \\'\\',    database: \\'test\\'});app.use(bodyParser.urlencoded({ extended: true }));app.post(\\'/login\\', (req, res) => {    const username = req.body.username;    const password = req.body.password;    const query = \\'SELECT * FROM users WHERE username = ? AND password = ?\\';    db.execute(query, [username, password], (err, results) => {        if (err) throw err;        if (results.length > 0) {            res.send(\\'Login successful\\');        } else {            res.send(\\'Invalid credentials\\');        }    });});app.listen(3000, () => {    console.log(\\'Server is running on port 3000\\');});

結論:

偵測並防止 JavaScript 注入攻擊對於維護 Web 應用程式的安全至關重要。透過實施本部落格中討論的技術,您可以顯著降低此類攻擊的風險。請記得驗證和清理所有使用者輸入、使用 CSP、僅限 HTTP 的 cookie,並使用 SRI 限制 JavaScript 功能。

請繼續關注更多有關高級 JavaScript 主題和網路安全的部落格。請隨時在下面的評論中分享您的想法和經驗。我們可以一起建立更安全的 Web 應用程式!

","image":"http://www.luping.net/uploads/20240801/172248888466ab183485a83.jpg","datePublished":"2024-08-01T13:08:03+08:00","dateModified":"2024-08-01T13:08:03+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 偵測並防止 JavaScript 注入攻擊的高階技術

偵測並防止 JavaScript 注入攻擊的高階技術

發佈於2024-08-01
瀏覽:868

Advanced Techniques for Detecting and Preventing JavaScript Injection Attacks

介紹:

JavaScript 注入攻擊是對 Web 應用程式的重大安全威脅。這些攻擊可能導致資料外洩、未經授權的操作和各種其他安全問題。我將指導您使用先進的技術來偵測和防止 JavaScript 注入攻擊。本部落格將包含實際範例程式碼,以幫助您有效地理解和實施這些技術。

什麼是 JavaScript 注入?

當攻擊者能夠將惡意程式碼注入 Web 應用程式時,就會發生 JavaScript 注入。這可以透過多種方式實現,例如輸入欄位、URL 參數,甚至 cookie。一旦注入,惡意程式碼就可以在 Web 應用程式的上下文中執行,可能導致資料竊取、未經授權的操作和其他有害後果。

JavaScript 注入攻擊的常見型別:

1.跨站腳本 (XSS): 將惡意腳本注入其他使用者檢視的網頁中。
2.基於 DOM 的 XSS: 操縱 DOM 環境來執行惡意 JavaScript。
3. SQL注入:注入可以對資料庫執行任意查詢的SQL指令。

偵測 JavaScript 注入攻擊:

1. 輸入驗證:

  • 驗證客戶端和伺服器端的所有使用者輸入。
  • 使用正規表示式確保輸入符合預期格式。
function validateInput(input) {
    const regex = /^[a-zA-Z0-9_]*$/; // Example regex for alphanumeric and underscore
    return regex.test(input);
}

const userInput = document.getElementById('user-input').value;
if (!validateInput(userInput)) {
    alert('Invalid input');
}

2. 內容安全策略(CSP):

實作CSP來控制JavaScript的載入和執行來源。

3.轉義用戶輸入:

轉義所有使用者輸入以防止執行惡意腳本。

function escapeHTML(input) {
    const div = document.createElement('div');
    div.appendChild(document.createTextNode(input));
    return div.innerHTML;
}

const safeInput = escapeHTML(userInput);
document.getElementById('output').innerHTML = safeInput;

防止 JavaScript 注入攻擊:

1.使用準備好的語句:

對於SQL查詢,使用準備好的語句以避免SQL注入。

const query = 'SELECT * FROM users WHERE username = ?';
db.execute(query, [username], (err, results) => {
    // Handle results
});

2. 清理使用者輸入:

使用 DOMPurify 等函式庫來淨化 HTML 並防止 XSS 攻擊。

const cleanInput = DOMPurify.sanitize(userInput);
document.getElementById('output').innerHTML = cleanInput;

僅 HTTP Cookie:

使用僅限 HTTP 的 cookie 來阻止透過 JavaScript 存取 cookie。

document.cookie = "sessionId=abc123; HttpOnly";

4.限制JavaScript能力:

使用子資源完整性 (SRI) 等功能來確保僅執行受信任的腳本。

例子:

考慮一個可能容易受到 JavaScript 注入的簡單登入表單。以下是保護它的方法:

HTML:

JavaScript:

document.getElementById('login-form').addEventListener('submit', function(event) {
    const username = document.getElementById('username').value;
    const password = document.getElementById('password').value;

    if (!validateInput(username) || !validateInput(password)) {
        alert('Invalid input');
        event.preventDefault();
    }
});

function validateInput(input) {
    const regex = /^[a-zA-Z0-9_]*$/;
    return regex.test(input);
}

伺服器端(Node.js 範例):

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mysql = require('mysql');

const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'test'
});

app.use(bodyParser.urlencoded({ extended: true }));

app.post('/login', (req, res) => {
    const username = req.body.username;
    const password = req.body.password;

    const query = 'SELECT * FROM users WHERE username = ? AND password = ?';
    db.execute(query, [username, password], (err, results) => {
        if (err) throw err;
        if (results.length > 0) {
            res.send('Login successful');
        } else {
            res.send('Invalid credentials');
        }
    });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

結論:

偵測並防止 JavaScript 注入攻擊對於維護 Web 應用程式的安全至關重要。透過實施本部落格中討論的技術,您可以顯著降低此類攻擊的風險。請記得驗證和清理所有使用者輸入、使用 CSP、僅限 HTTP 的 cookie,並使用 SRI 限制 JavaScript 功能。

請繼續關注更多有關高級 JavaScript 主題和網路安全的部落格。請隨時在下面的評論中分享您的想法和經驗。我們可以一起建立更安全的 Web 應用程式!

版本聲明 本文轉載於:https://dev.to/rigalpatel001/advanced-techniques-for-detecting-and-preventing-javascript-injection-attacks-4n61?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在 PHP 中使用數組函數向左旋轉數組元素?
    如何在 PHP 中使用數組函數向左旋轉數組元素?
    在PHP 中向左旋轉數組元素在PHP 中旋轉數組,將第一個元素移動到最後一個元素並重新索引數組,可以使用PHP 的array_push() 和array_shift() 函數組合來實現。 PHP 函數:PHP 沒有專門用於旋轉的內建函數數組。但是,以下程式碼片段示範如何模擬所需的旋轉行為:$numb...
    程式設計 發佈於2024-11-06
  • 如何解決Java存取檔案時出現「系統找不到指定的路徑」錯誤?
    如何解決Java存取檔案時出現「系統找不到指定的路徑」錯誤?
    解決Java 中遇到「系統找不到指定的路徑」時的檔案路徑問題在Java 專案中,嘗試存取文字時遇到錯誤來自指定相對路徑的檔案。此錯誤是由於 java.io.File 類別無法定位指定路徑而產生的。 要解決此問題,建議從類別路徑中檢索文件,而不是依賴文件系統。透過這樣做,您可以消除相對路徑的需要,並確...
    程式設計 發佈於2024-11-06
  • Laravel 中的 defer() 函數如何運作?
    Laravel 中的 defer() 函數如何運作?
    Taylor Otwell 最近宣布了 Laravel 中的新函數 defer()。這只是對 defer() 函數如何運作以及使用它可能遇到的問題進行非常基本的概述。 找出問題 還記得您曾經需要從 API 獲取某些內容,然後在幕後執行一些用戶不關心但仍在等待的操作的路由嗎?是的,我們都至少經歷過一...
    程式設計 發佈於2024-11-06
  • 在 Python Notebook 中探索使用 PySpark、Pandas、DuckDB、Polars 和 DataFusion 的資料操作
    在 Python Notebook 中探索使用 PySpark、Pandas、DuckDB、Polars 和 DataFusion 的資料操作
    Apache Iceberg Crash Course: What is a Data Lakehouse and a Table Format? Free Copy of Apache Iceberg the Definitive Guide Free Apache Iceberg Crash ...
    程式設計 發佈於2024-11-06
  • Vue + Tailwind 和動態類
    Vue + Tailwind 和動態類
    我最近在做的一個專案使用了Vite、Vue和Tailwind。 使用自訂顏色一段時間後,我遇到了一些困惑。 在模板中添加和使用自訂顏色不是問題 - 使用 Tailwind 文件使該過程非常清晰 // tailwind.config.js module.exports = { theme:...
    程式設計 發佈於2024-11-06
  • 端對端(E 測試:綜合指南
    端對端(E 測試:綜合指南
    端到端测试简介 端到端(E2E)测试是软件开发生命周期的重要组成部分,确保整个应用程序流程从开始到结束都按预期运行。与专注于单个组件或几个模块之间交互的单元或集成测试不同,端到端测试从用户的角度验证整个系统。这种方法有助于识别应用程序不同部分交互时可能出现的任何问题,确保无缝且无错误的用户体验。 ...
    程式設計 發佈於2024-11-06
  • 可以在 Go 結構標籤中使用變數嗎?
    可以在 Go 結構標籤中使用變數嗎?
    在Go 結構體標籤中嵌入變數Go 的結構體標籤通常用於註釋和元數據,通常涉及簡單的字符串文字。但是,使用者可能會遇到在這些標籤中需要動態或計算值的情況。 考慮以下結構,其中帶有為 JSON 封送註解的「類型」欄位:type Shape struct { Type string `json:&...
    程式設計 發佈於2024-11-06
  • 如何增強 Visual Studio 的建置詳細程度以實現深入洞察?
    如何增強 Visual Studio 的建置詳細程度以實現深入洞察?
    熟悉 Visual Studio 的建造詳細程度需要全面了解 Visual Studio 建置過程背後的複雜細節?別再猶豫了! 雖然使用 vcbuild 不會產生所需的詳細輸出,但 Visual Studio 的設定中隱藏著一個解決方案。採取以下簡單步驟即可解鎖大量資訊:導覽至 Visual Stu...
    程式設計 發佈於2024-11-06
  • 開發者日記# 誰寫的?
    開發者日記# 誰寫的?
    有個想法困擾著我。也許,我們無法識別它,但日復一日,我們周圍越來越多的人工智慧生成的內容。 LinkedIn 或其他平台上的有趣圖片、影片或貼文。我對帖子的媒體內容沒有疑問(很容易識別它何時生成、從庫存中獲取或創建),但我對帖子的內容表示懷疑。幾乎每次我讀一篇文章時,我都會想這是誰寫的?是作者分享了...
    程式設計 發佈於2024-11-06
  • 哪一種方法計算資料庫行數較快:PDO::rowCount 或 COUNT(*)?
    哪一種方法計算資料庫行數較快:PDO::rowCount 或 COUNT(*)?
    PDO::rowCount 與COUNT(*) 效能在資料庫查詢中計算行數時,選擇使用PDO:: rowCount 和COUNT(*) 會顯著影響效能。 PDO::rowCountPDO::rowCount 傳回受最後一個 SQL 語句影響的行數。但是,對於 SELECT 語句,某些資料庫可能會傳回...
    程式設計 發佈於2024-11-06
  • PART# 使用 HTTP 進行大型資料集的高效能檔案傳輸系統
    PART# 使用 HTTP 進行大型資料集的高效能檔案傳輸系統
    让我们分解提供的HTML、PHP、JavaScript和CSS代码对于分块文件上传仪表板部分。 HTML 代码: 结构概述: Bootstrap for Layout:代码使用 Bootstrap 4.5.2 创建一个包含两个主要部分的响应式布局: 分块上传部分:用于...
    程式設計 發佈於2024-11-06
  • 比較:Lithe 與其他 PHP 框架
    比較:Lithe 與其他 PHP 框架
    如果您正在為下一個專案探索 PHP 框架,很自然會遇到 Laravel、Symfony 和 Slim 等選項。但是,是什麼讓 Lithe 與這些更強大、更知名的框架區分開來呢?以下是一些突出 Lithe 如何脫穎而出的注意事項。 1. 輕量級與性能 Lithe 的設計重點在於輕量級...
    程式設計 發佈於2024-11-06
  • 程式設計風格指南:編寫簡潔程式碼的實用指南
    程式設計風格指南:編寫簡潔程式碼的實用指南
    在过去的五年里,我一直在不断尝试提高我的编码技能,其中之一就是学习和遵循最推荐的编码风格。 本指南旨在帮助您编写一致且优雅的代码,并包含一些提高代码可读性和可维护性的建议。它的灵感来自于社区中最受接受的流行指南,但进行了一些修改以更适合我的喜好。 值得一提的是,我是一名全栈 JavaScript 开...
    程式設計 發佈於2024-11-06
  • 檢查類型是否滿足 Go 中的接口
    檢查類型是否滿足 Go 中的接口
    在Go中,開發人員經常使用介面來定義預期的行為,使程式碼靈活且健壯。但是如何確保類型真正實現接口,尤其是在大型程式碼庫中? Go 提供了一種簡單有效的方法來在編譯時驗證這一點,防止執行時間錯誤的風險並使您的程式碼更加可靠和可讀。 您可能看過類似的文法 var _ InterfaceName = ...
    程式設計 發佈於2024-11-06
  • 掌握 JavaScript 中的 &#this&# 關鍵字
    掌握 JavaScript 中的 &#this&# 關鍵字
    JavaScript 中的 this 關鍵字如果不理解的話可能會非常棘手。這是即使是經驗豐富的開發人員也很難輕鬆掌握的事情之一,但一旦你掌握了,它可以為你節省大量時間。 在本文中,我們將了解它是什麼、它在不同情況下如何運作以及使用它時不應陷入的常見錯誤。 在 JavaScript...
    程式設計 發佈於2024-11-06

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

Copyright© 2022 湘ICP备2022001581号-3