《Java安全编码标准》一1.5 拒绝服务

1.5 拒绝服务

拒绝服务攻击试图使计算机的资源不可获得,或者对需要使用该计算机资源的用户来说,会造成资源不足的情况。通常这种攻击是持续服务的服务器系统需要重点关注的,它与桌面应用程序有很大区别;然而,拒绝服务的问题可以出现在所有类别的应用上。

1.5.1 资源耗尽型的拒绝服务

拒绝服务可能出现在,相对于输入数据需要的资源消耗来说,使用比例上更为巨大的资源。通过客户端软件检查资源是否被过度消耗,并希望用户来处理与资源相关的问题是不合理的。但是,存在这样的客户端软件,它们可以检查那些可能会导致持久拒绝服务的输入,比如将文件系统进行填充的操作。
《Java安全编码指南》(Secure Coding Guidelines for the Java Programming Language)[SCG 2009]中列举了可能的攻击的例子:
请求一个大的矢量图片,如SVG文件或者字体文件。
“Zip炸弹”(Zip bomb)那些如ZIP、GIF或那些经过gzip编码的HTML内容,会因为解压而消耗大量的资源。
“XML解析炸弹”,在解析的时候,在扩展XML所包含的实体时,有可能会使得XML文档急剧增长。可以通过设置XMLConstants.FEATURE_SECURE_PROCESSING功能并设置合理的限度值解决前面的问题。
过度使用的磁盘空间。
在一个散列表中插入了多个密钥,而这些密钥使用相同的散列码。这样会导致最差的性能(O(n2))而不是平均性能(O(n))。
发起许多连接,服务器为每个连接分配大量的资源(例如传统的洪水攻击)。
针对拒绝服务攻击并防止出现资源耗尽的规则,有以下几点:

1.5.2 与并发相关的拒绝服务

某些拒绝服务攻击是通过试图引入并发问题来实现的,如线程死锁、线程饥饿和竞态。
针对拒绝服务攻击并防止出现并发问题的规则,有以下几点:

1.5.3 其他的拒绝服务攻击

其他预防拒绝服务攻击的规则如下:

1.5.4 拒绝服务的前提

其他的规则会处理安全漏洞,这些安全漏洞会导致拒绝服务攻击,但它们自己并不足以导致拒绝服务:

时间: 2024-10-01 13:08:42

《Java安全编码标准》一1.5 拒绝服务的相关文章

《Java安全编码标准》一导读

前 言 在Java编程语言中,关键的安全编码要素是采用良好的文档和强制的编码规范.本书提供了在Java语言中的一系列安全编码规则.这些规则的目标是消除不安全的编码实践,因为这些不安全的因素会导致可利用的漏洞.如果应用这些安全编码标准,可以帮助设计出安全的.可靠的.健壮的.有弹性的.可用性和可维护性高的高质量系统,并且这些安全编码规范还可作为评估源代码质量特性的一个指标(不管使用的是手动的还是自动化的过程).对于使用Java编程语言开发的软件系统,这个编码规范具有广泛的影响. 目 录 第1章 概述

《Java安全编码标准》一1.11 小结

1.11 小结 尽管作为一种相对安全的语言,Java语言及其类库还是在很大程度上存在着一些编程问题,从而造成系统安全漏洞.如果假设Java本身提供的功能特性可以减少一般的软件问题,并足够Java程序安全得不需要进行进一步检测,那么我们就大错特错了.因为任何在软件实现中出现的缺陷都会产生严重的安全影响,绷紧安全性这根弦是非常关键的,这样,当我们进行系统开发和部署时,就可以避免出现软件的安全漏洞问题.为了减少因为编程错误所带来的安全漏洞的可能性,Java开发人员应当遵循本编码标准中的安全编码规则,并

《Java安全编码标准》一2.1 IDS00-J净化穿越受信边界的非受信数据

2.1 IDS00-J净化穿越受信边界的非受信数据 许多程序会接受来自未经验证的用户数据.网络连接,以及其他来自于非受信域的不可信数据,然后它们会将这些数据(经过修改或不经修改)穿过受信边界送到另一个受信域中.通常,这些数据是以字符串的形式出现的,并且它们会有既定的内部数据结构,这种数据结构必须能够被子系统所解析.同时,必须净化这些数据,因为子系统可能并不具备处理恶意输入信息的能力,这些未经净化数据输入很有可能包含注入攻击. 值得注意的是,程序必须对传递给命令行解释器或者解析器的所有字符串数据进

《Java安全编码标准》一2.7 IDS06-J从格式字符串中排除用户输入

2.7 IDS06-J从格式字符串中排除用户输入 对Java格式字符串的解释要比对在像C语言这样的语言中更严格[Seacord 2005].当任何转换参数不能匹配相应的格式符时,标准类库实现会抛出一个相应的异常.这种方法降低了被恶意利用的可能性.然而,恶意用户输入可以利用格式字符串,并且造成信息泄露或者拒绝服务.因此,不能在格式字符串中使用非受信来源的字符串. 2.7.1 不符合规则的代码示例 这个不符合规则的代码示例展示了可能出现信息泄露的问题.它将信用卡的失效日期作为输入参数并将其用在格式字

《Java安全编码标准》一2.11 IDS10-J不要拆分两种数据结构中的字符串

2.11 IDS10-J不要拆分两种数据结构中的字符串 在历史遗留系统中,常常假设字符串中的每一个字符使用8位(一个字节,Java中的byte).而Java语言使用16位表示一个字符(Java中的Char类型).遗憾的是,不管是Java的byte类型还是char类型数据,都不能表示所有的Unicode字符.许多字符串使用例如UTF-8编码的方式存储和通信,而在这种编码中,字符长度是可变的. 当Java字符串以字符数组的方式存储时,它可以用一个字节数组来表示,字符串里的一个字符可以用两个连续的或更

《Java安全编码标准》一2.13 IDS12-J在不同的字符编码中无损转换字符串数据

2.13 IDS12-J在不同的字符编码中无损转换字符串数据 在String对象之间进行转换时,如果涉及不同的编码类型,可能会导致数据丢失. 根据Java API[API 2006] 对?String.getBytes(Charset)方法的描述: 该方法总会替代那些错误格式的输入和不可映射的字符序列,把它们替换成这些字符的字节数组. 当必须将一个String转化为字节数组时,例如写入一个文件,并且在这个字符串中含有不可映射的字符序列的时候,就必须进行正确的字符编码. 2.13.1 不符合规则的

《Java安全编码标准》一2.9 IDS08-J净化传递给正则表达式的非受信数据

2.9 IDS08-J净化传递给正则表达式的非受信数据 正则表达式在匹配文本字符串时被广泛使用.比如,在POSIX中,grep命令就支持正则表达式,使用它可以在指定文本中搜索模式.如果要了解正则表达式的基本情况,请参考Java教程[Tutorials 08].java.util.regex包提供了Pattern?类,这个类封装了一个编译过的正则表达式和一个Matcher类,通过Matcher类这个引擎,可以使用Pattern?在CharSequence中进行匹配操作.在Java中,必须注意不能误

《Java安全编码标准》一2.3 IDS02-J在验证之前标准化路径名

2.3 IDS02-J在验证之前标准化路径名 根据Java API[API 2006]文档对java.io.File类的描述:一个路径名,不管是抽象的还是字符串形式的,可以是相对路径也可以是绝对路径.使用绝对路径名,因为在定位一个路径表示的文件时,已经不需要其他信息了,因而可以认为是完整的.相比之下,一个相对路径名必须要增加其他的路径信息才能进行解释.绝对路径名或者相对路径名会包含文件链接,比如符号(软)链接.硬链接.快捷方式.影子.别名和联名.这些文件链接在文件验证操作进行之前必须完全解析.例

《Java安全编码标准》一3.2 DCL01-J不要重用Java标准库的已经公开的标识

3.2 DCL01-J不要重用Java标准库的已经公开的标识 不要重用那些在Java标准库中已经使用过的公共的标识.公共的工具类.接口或者包.当一个程序员使用和公开类相同的名字时,如Vector对后来的维护者来说,他可能不知道这个标识并不是指?java.util.Vector?,并且可能会无意地使用这个自定义的Vector类而不是原有的java.util.Vector类.使得这个自定义的?Vector会遮蔽java.util.Vector类,正如在JLS的6.3.2节中提到的那样.从而会导致不可