安全性
安全性是 web 开发中一个基本主题,从实习生到首席技术官,任何开发人员都应该重视这个主题。备受瞩目的黑客案例经常见诸全球头条新闻中,但只要仔细思考和规划,您就可以迅速创建安全的应用程序。
概述
此页面将讨论与 DataTables 直接相关的 Web 安全攻击,以及与它们作斗争的方法。Web 安全是一个非常广泛的主题,不可能在此处涵盖所有主题。有关 Web 和软件安全的更多一般信息,请参阅优秀的 OWASP 网站。
软件版本
在考虑软件安全性时,首先要做的就是始终运行可用的最新版本的软件。最新版本将包含已知问题的修复程序,而这些问题可能存在于旧版本中。对于 DataTables,最新版本始终可以在 下载页面 上获得。
攻击类型
通常在使用 DataTables 时需要考虑两种攻击类型
- 跨站点脚本 (XSS)
- 跨站点请求伪造 (CSRF)
还可能发生其他形式的数据泄露,例如允许未登录用户访问敏感数据、允许权限提升(查看某人被禁止查看的数据)和 SQL 注入攻击。这些主要都是使用 DataTables 创建的应用程序的问题。
跨站点脚本
通过允许在您自己的网站上执行任意 Javascript 或 HTML 可以执行 XSS 攻击。然后,注入的 Javascript 可以使用当前用户的帐户执行操作或窃取信息。在 DataTables 的情况下,如果允许用户编辑表的内容或在表中输入其他数据,则可能会执行 XSS 攻击。
例如,考虑一下如果您允许编辑表格中的单元格,并且用户输入了以下内容:<script>alert('Hi');</script>
。如果未对数据进行编码,则在表格中显示单元格时,将触发 alert()
。尽管这是一个非常简单的示例,但如果成功,也可以进行更有效的攻击。
预防
有两种方法可以防止这种类型的攻击在您的应用程序中成功
- 禁止提交任何有害数据
- 使用 呈现函数对所有不受信任的输出进行编码。
对于第一个选项,你的服务器端脚本会主动阻止任何具有有害数据(输入)的数据的写请求。你可以直接禁止包含任何 HTML 数据,或者使用 HTML 解析器来允许“安全的”标签。如果你采用此方案,强烈建议你使用已知且经验证的安全代码库,不要编写你自己的!
第二个选项是使用一个 rendering function,此函数可以在显示数据(输出)时防止攻击。DataTables 自带了两个用于防止 XSS 攻击的 rendering function,即 $.fn.dataTable.render.text
和 $.fn.dataTable.render.number
。
设置这些 rendering function 的方法非常简单,只需在创建表格时将它们分配给 columns.render
。例如:
{
data: 'product',
render: DataTable.render.text()
}
请参阅 数据渲染 文档以获取更多详细信息。
跨站请求伪造
CSRF 攻击将强制最终用户(通常在他们不知情的情况下,所有操作都在后台进行!)执行他们当前经过身份验证的网站或应用程序上不需要的操作。例如,假如你已登录到你的在线银行,然后访问另一个看起来无害的页面。如果该页面在你隐藏的 iframe
中对你的银行账户执行交易,则该银行会接受该交易,因为他们认为该交易来自你!
预防
为了防止这种类型的攻击,大多数系统都会使用 令牌,该令牌将提交在每次数据请求中,以确保最终用户就是他们声称的那个人。
生成和处理令牌不在本文档的讨论范围内(如果您正在使用框架,请参阅框架文档,如果您正在创建自己的系统,请参阅 OWASP 指南)。不过,我们需要详细说明 CSRF 令牌如何传输到服务器,这在 Ajax 源数据 中尤为重要。
DataTables ajax
配置对象可以用作一个 object
,该对象接受所有与 $.ajax
方法 相同的选项,包括提交标头和数据的能力。根据应用程序对 CSRF 令牌的期望,你可以使用以下多种方法来提交 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 令牌(同样,如何获取此令牌由你正在使用的应用程序或框架决定)。