安全性

安全性是網站開發中的一個基本主題,任何開發人員(從實習生到技術長)都不應忽視這個主題。全球各地經常出現引人注目的駭客攻擊事件,但只要仔細思考和規劃,您就能快速建立安全的應用程式。

概述

此頁面將討論與 DataTables 直接相關的網站安全攻擊,以及如何應對這些攻擊的方法。網站安全是一個非常廣泛的主題,不可能在此涵蓋所有主題。有關網站和軟體安全的更一般性資訊,請參考優秀的 OWASP 網站。

軟體版本

在考慮軟體安全性時,首先要做的事情始終是執行可用的最新軟體版本。最新版本將包含已知問題的修復,而這些問題可能存在於較舊的版本中。對於 DataTables,最新版本始終可在下載頁面上取得。

攻擊類型

使用 DataTables 時,通常需要考慮兩種重要的攻擊類型

  • 跨網站指令碼攻擊 (XSS)
  • 跨網站請求偽造 (CSRF)

還可能發生其他形式的資料外洩,例如允許未登入的使用者存取敏感資料、允許權限升級(查看不應被允許查看的資料)和 SQL 注入攻擊。這些主要是使用 DataTables 所建立的應用程式的問題。

跨網站指令碼攻擊

XSS 攻擊可以透過允許在您自己的網站上執行任意 Javascript 或 HTML 來執行。注入的 Javascript 隨後可以使用目前使用者的帳戶執行動作或竊取資訊。在 DataTables 的情況下,如果您允許使用者編輯表格內容或將其他資料輸入表格,則可能會執行 XSS 攻擊。

例如,假設您允許編輯表格中的儲存格,並且使用者輸入:<script>alert('Hi');</script>。當儲存格顯示在表格中時,如果資料未編碼,則會觸發 alert()。雖然這是一個非常簡單的範例,但如果成功,也可能發生更強大的攻擊。

預防

有兩種方法可以阻止此類攻擊在您的應用程式中取得成功

  1. 禁止提交任何有害資料
  2. 使用轉譯函數編碼所有不受信任的輸出。

對於第一個選項,您的伺服器端指令碼會主動阻止所有包含有害資料的資料寫入(即輸入)。您可以選擇簡單地禁止所有包含任何 HTML 的資料,或使用 HTML 剖析器來允許「安全」標籤。如果您採取這種方法,強烈建議您使用已知且經過驗證的安全性程式庫 - 不要編寫您自己的程式庫!

第二個選項是使用轉譯函數,這將在顯示資料(即輸出)時防止攻擊。DataTables 有兩個內建的轉譯函數可用於防止 XSS 攻擊;$.fn.dataTable.render.text$.fn.dataTable.render.number

只需在建立表格時將轉譯函數分配給 columns.render 即可使用它們 - 例如

{
    data: 'product',
    render: DataTable.render.text()
}

請參閱資料轉譯文件以取得更多詳細資料。

跨網站請求偽造

CSRF 攻擊會強迫最終使用者(通常在他們不知情的情況下 - 一切都在後台發生!)在他們目前已通過驗證的網站或應用程式上執行不需要的動作。例如,假設您已登入網路銀行,然後造訪另一個看似無害的頁面。如果該頁面在隱藏的 iframe 中執行您銀行帳戶上的交易,則銀行會接受該交易,認為該交易來自您!

預防

為了防止這種類型的攻擊,大多數系統會使用一個權杖,該權杖將在每個資料請求中提交,以確保最終使用者是他們聲稱的身分。

權杖的產生和處理不在本文件的範圍內(如果您使用的是框架,請參閱框架文件,如果您建立自己的系統,請參閱OWASP 指南)。但是,我們需要詳細說明如何將 CSRF 權杖傳輸到伺服器,這在使用 Ajax 來源資料時尤其重要。

DataTables ajax 設定物件可以用作 object,它接受與 $.ajax 方法相同的所有選項,包括提交標頭和資料的能力。根據您的應用程式預期 CSRF 權杖的方式,您可以使用多種方法之一

設定全域標頭(這可確保頁面的所有 Ajax 請求都具有 CSRF 權杖)

$.ajaxSetup( {
    headers: {
        'CSRFToken': TOKEN
    }
} );

ajax 設定中將權杖作為標頭值提交

$('#myTable').DataTable( {
    ajax: {
        url: '...',
        headers: {
            'CSRFToken': TOKEN
        }
    }
} );

將權杖作為請求資料的一部分提交

$('#myTable').DataTable( {
    ajax: {
        url: '...',
        data: function ( d ) {
            d.CSRFToken = TOKEN;
        }
    }
} );

在所有情況下,TOKEN 都是 CSRF 權杖(同樣,如何取得此權杖取決於您使用的應用程式或框架)。