安全性
安全性是網站開發中的一個基本主題,任何開發人員(從實習生到技術長)都不應忽視這個主題。全球各地經常出現引人注目的駭客攻擊事件,但只要仔細思考和規劃,您就能快速建立安全的應用程式。
概述
此頁面將討論與 DataTables 直接相關的網站安全攻擊,以及如何應對這些攻擊的方法。網站安全是一個非常廣泛的主題,不可能在此涵蓋所有主題。有關網站和軟體安全的更一般性資訊,請參考優秀的 OWASP 網站。
軟體版本
在考慮軟體安全性時,首先要做的事情始終是執行可用的最新軟體版本。最新版本將包含已知問題的修復,而這些問題可能存在於較舊的版本中。對於 DataTables,最新版本始終可在下載頁面上取得。
攻擊類型
使用 DataTables 時,通常需要考慮兩種重要的攻擊類型
- 跨網站指令碼攻擊 (XSS)
- 跨網站請求偽造 (CSRF)
還可能發生其他形式的資料外洩,例如允許未登入的使用者存取敏感資料、允許權限升級(查看不應被允許查看的資料)和 SQL 注入攻擊。這些主要是使用 DataTables 所建立的應用程式的問題。
跨網站指令碼攻擊
XSS 攻擊可以透過允許在您自己的網站上執行任意 Javascript 或 HTML 來執行。注入的 Javascript 隨後可以使用目前使用者的帳戶執行動作或竊取資訊。在 DataTables 的情況下,如果您允許使用者編輯表格內容或將其他資料輸入表格,則可能會執行 XSS 攻擊。
例如,假設您允許編輯表格中的儲存格,並且使用者輸入:<script>alert('Hi');</script>
。當儲存格顯示在表格中時,如果資料未編碼,則會觸發 alert()
。雖然這是一個非常簡單的範例,但如果成功,也可能發生更強大的攻擊。
預防
有兩種方法可以阻止此類攻擊在您的應用程式中取得成功
- 禁止提交任何有害資料
- 使用轉譯函數編碼所有不受信任的輸出。
對於第一個選項,您的伺服器端指令碼會主動阻止所有包含有害資料的資料寫入(即輸入)。您可以選擇簡單地禁止所有包含任何 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 權杖(同樣,如何取得此權杖取決於您使用的應用程式或框架)。