Ruby on Rails中使用"2.months"字符串进行日期计算的安全方案
Ruby on Rails安全处理字符串形式的时间周期计算
要安全处理形如"2.months"的字符串周期,不用eval的核心思路是解析字符串并做白名单校验,具体实现如下:
步骤与代码示例
# 待处理的周期字符串 period = "2.months" # 拆分并清理输入内容 value_str, unit = period.split('.').map(&:strip) # 定义允许的安全时间单位(可根据业务需求扩展) allowed_units = %w[days weeks months years] # 合法性校验+日期计算 if value_str.match?(/^\d+$/) && allowed_units.include?(unit) # 生成Rails内置的Duration对象,直接参与日期运算 duration = value_str.to_i.send(unit) target_date = Date.current - duration else # 非法输入处理,可根据需求调整(比如返回默认值或抛错) raise ArgumentError, "无效的时间周期格式,请传入类似'2.months'的合法字符串" end
安全说明
- 白名单
allowed_units严格限制了可调用的方法,避免恶意输入触发危险操作 - 正则
/^\d+$/确保数值部分为正整数,排除非数值或恶意字符串 - 最终调用的
days/weeks/months/years都是Rails内置的安全方法,生成的Duration对象可直接参与日期运算
内容的提问来源于stack exchange,提问作者pinkfloyd90
相关产品推荐
相关产品推荐

