例子:

考慮一個可能容易受到 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
瀏覽:711

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]刪除
最新教學 更多>
  • Python中嵌套函數與閉包的區別是什麼
    Python中嵌套函數與閉包的區別是什麼
    嵌套函數與python 在python中的嵌套函數不被考慮閉合,因為它們不符合以下要求:不訪問局部範圍scliables to incling scliables在封裝範圍外執行範圍的局部範圍。 make_printer(msg): DEF打印機(): 打印(味精) ...
    程式設計 發佈於2025-07-15
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案: args)拋出異常{ 日曆cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    程式設計 發佈於2025-07-15
  • 為什麼儘管有效代碼,為什麼在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-07-15
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-15
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-07-15
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-07-15
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-07-15
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-07-15
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-07-15
  • 在JavaScript中如何並發運行異步操作並正確處理錯誤?
    在JavaScript中如何並發運行異步操作並正確處理錯誤?
    同意操作execution 在執行asynchronous操作時,相關的代碼段落會遇到一個問題,當執行asynchronous操作:此實現在啟動下一個操作之前依次等待每個操作的完成。要啟用並發執行,需要進行修改的方法。 第一個解決方案試圖通過獲得每個操作的承諾來解決此問題,然後單獨等待它們: c...
    程式設計 發佈於2025-07-15
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-07-15
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-07-15
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-07-15
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 在使用Chrome and IE9中的圖像時遇到的一個頻繁的問題是圍繞圖像的持續薄薄邊框,儘管指定了圖像,儘管指定了;和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下...
    程式設計 發佈於2025-07-15
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-07-15

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

Copyright© 2022 湘ICP备2022001581号-3