BigDecimal中的DoS攻击漏洞

新发现的DoS漏洞影响所有版本的Ruby1.8.x,在处理BigDecima对象时可能出现段错误,导致多数Rails应用受影响。Rails 2.3.3版本将做出调整以减轻威胁,建议用户尽快更新Ruby版本。
一个新的拒绝服务( DoS )漏洞已被发现,影响所有版本的Ruby 1.8.x :
转换BigDecima对象到Float数时出现了问题,使攻击者能够有效地产生段故障。

ActiveRecord依赖于这种方法,因此大多数Rails的应用受到此问题的影响。虽然这不是一个Rails的特殊问题。

Riding Rails博客还指出这一脆弱性:
即将发布的Rails的2.3.3版本将包括一些细微的变化,以减少一些潜在的攻击者利用此漏洞。不过,这些缓解措施也不能解决每一个潜在的攻击方法,用户仍应尽快升级他们的Ruby版本。
该博客还提到NZKoz 的 bigdecimal - segfault修复方案,给那些不能立即升级他们的Ruby安装版本的用户的一个临时的解决方案-虽然升级是 唯一 正确的解决方案 , 但此修复程序可能中断应用服务。

所有的Ruby 1.8.x 版本都受此 影响 - 第一次修复版本 的Ruby是 { ( 1.8.6 FTP下载链接) 和 Ruby 1.8.7 - p173 ( 1.8.7 FTP下载链接) 。

JRuby 似乎也受到影响。Bug JRUBY-3744跟踪了这个问题,并说:
JRuby似乎受到影响。它没有崩溃,但似乎是停留在一个无限循环。
这一行为已由本示例输出文档化 。
快速试验表明 , 该解决方案中使用bigdecimal - segfault修复工程作为一个 临时的 解决办法,在JRuby也可以工作 ,因为它只是打开了BigDecimal类和修改它以在使用了一个过大的数字的情况下抛出一个异常。以使代码立即失败,而不是保持JRuby线程繁忙;显然这种方法中断了那些需要处理大于补丁设定的默认数字的代码。

Ruby1.9.x用户不会受到这一问题的影响。
 
=====
以上内容由google翻译辅助工具(http://translate.google.com/toolkit/)翻译。
### BigDecimal 的中文资料或翻译 #### 1. BigDecimal 的定义与特性 BigDecimal 是一个不可变的、带符号的任意精度十进制数类[^3]。它由任意精度整数(非标定值)和一个 32 位整数比例组成。如果比例为零或正数,则精度是小数点右侧的位数;如果比例为负数,则该数字的非缩放值会乘以 10 的比例否定次幂。 #### 2. BigDecimal 的基本操作 - **加法**:`add(BigDecimal)` 方法用于将两个 BigDecimal 对象的值相加,并返回一个新的 BigDecimal 对象[^4]。 - **减法**:`subtract(BigDecimal)` 方法用于从当前 BigDecimal 对象中减去另一个 BigDecimal 对象的值,并返回结果[^4]。 - **乘法**:`multiply(BigDecimal)` 方法用于将两个 BigDecimal 对象的值相乘,并返回结果。结果的规模为 `max(this.scale(), multiplicand.scale())`[^1]。 - **除法**:`divide(BigDecimal)` 方法用于执行除法运算,但需要注意精度问题,可能需要指定舍入模式[^4]。 - **字符串转换**:`toString()` 方法将 BigDecimal 对象的数值以规范格式表示出来。 #### 3. 常见问题与注意事项 在使用 BigDecimal 时,可能会遇到一些常见问题,例如创建 BigDecimal 对象时精度丢失的问题。这通常发生在直接使用浮点数构造 BigDecimal 对象时,因为浮点数本身存在精度限制[^2]。因此,建议使用字符串或整数来构造 BigDecimal 对象,以避免精度损失。 #### 4. 浮点数与 BigDecimal 的区别 计算机中的浮点数有基本数据类型 `float`(4 字节)和 `double`(8 字节)。默认情况下,Java 中的小数被认为是 `double` 类型。如果希望将其视为 `float` 类型,需要在小数后添加后缀 `f` 或 `F`[^5]。然而,对于高精度计算,推荐使用 BigDecimal,因为它可以避免浮点数的精度问题。 #### 5. 示例代码 以下是一个简单的 BigDecimal 使用示例: ```java import java.math.BigDecimal; public class BigDecimalExample { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("123.456"); BigDecimal num2 = new BigDecimal("78.9"); // 加法 BigDecimal sum = num1.add(num2); System.out.println("加法结果: " + sum); // 减法 BigDecimal difference = num1.subtract(num2); System.out.println("减法结果: " + difference); // 乘法 BigDecimal product = num1.multiply(num2); System.out.println("乘法结果: " + product); // 除法 BigDecimal quotient = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP); System.out.println("除法结果: " + quotient); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值