安全性

安全性是 web 开发中一个基本主题,从实习生到首席技术官,任何开发人员都应该重视这个主题。备受瞩目的黑客案例经常见诸全球头条新闻中,但只要仔细思考和规划,您就可以迅速创建安全的应用程序。

概述

此页面将讨论与 DataTables 直接相关的 Web 安全攻击,以及与它们作斗争的方法。Web 安全是一个非常广泛的主题,不可能在此处涵盖所有主题。有关 Web 和软件安全的更多一般信息,请参阅优秀的 OWASP 网站。

软件版本

在考虑软件安全性时,首先要做的就是始终运行可用的最新版本的软件。最新版本将包含已知问题的修复程序,而这些问题可能存在于旧版本中。对于 DataTables,最新版本始终可以在 下载页面 上获得。

攻击类型

通常在使用 DataTables 时需要考虑两种攻击类型

  • 跨站点脚本 (XSS)
  • 跨站点请求伪造 (CSRF)

还可能发生其他形式的数据泄露,例如允许未登录用户访问敏感数据、允许权限提升(查看某人被禁止查看的数据)和 SQL 注入攻击。这些主要都是使用 DataTables 创建的应用程序的问题。

跨站点脚本

通过允许在您自己的网站上执行任意 Javascript 或 HTML 可以执行 XSS 攻击。然后,注入的 Javascript 可以使用当前用户的帐户执行操作或窃取信息。在 DataTables 的情况下,如果允许用户编辑表的内容或在表中输入其他数据,则可能会执行 XSS 攻击。

例如,考虑一下如果您允许编辑表格中的单元格,并且用户输入了以下内容:<script>alert('Hi');</script>。如果未对数据进行编码,则在表格中显示单元格时,将触发 alert()。尽管这是一个非常简单的示例,但如果成功,也可以进行更有效的攻击。

预防

有两种方法可以防止这种类型的攻击在您的应用程序中成功

  1. 禁止提交任何有害数据
  2. 使用 呈现函数对所有不受信任的输出进行编码。

对于第一个选项,你的服务器端脚本会主动阻止任何具有有害数据(输入)的数据的写请求。你可以直接禁止包含任何 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 令牌(同样,如何获取此令牌由你正在使用的应用程序或框架决定)。