安全
Security/CompoundHash
| 默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 | 
|---|---|---|---|---|
| 待定 | 否 | 否 | 1.28 | 1.51 | 
检查 hash 方法的实现,这些方法使用自定义逻辑组合值,而不是委托给 Array#hash。
手动组合哈希容易出错且难以跟踪,尤其是在存在多个值的情况下。如果实现容易发生冲突,则可能还会引入性能或安全问题。委托给 Array#hash 更清晰、更安全,尽管它可能比使用案例慢。
Security/IoMethods
| 默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 | 
|---|---|---|---|---|
| 待定 | 否 | 始终(不安全) | 1.22 | - | 
检查 IO.read、IO.binread、IO.write、IO.binwrite、IO.foreach 和 IO.readlines 的第一个参数。
如果参数以管道字符 ('|') 开头,并且接收器是 IO 类,则会以与 Kernel#open 相同的方式创建子进程,并返回其输出。Kernel#open 可能允许无意中进行命令注入,这就是这些 IO 方法存在安全风险的原因。请考虑使用 File.read 来禁用子进程调用的行为。
Security/JSONLoad
| 默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 | 
|---|---|---|---|---|
| 已启用 | 是 | 始终(不安全) | 0.43 | 1.22 | 
检查 JSON 类方法的使用情况,这些方法存在潜在的安全问题。
安全/MarshalLoad
安全/Open
| 默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 | 
|---|---|---|---|---|
| 已启用 | 否 | 否 | 0.53 | 1.0 | 
检查是否使用 Kernel#open 和 URI.open 以及动态数据。
Kernel#open 和 URI.open 不仅支持文件访问,还支持通过在前面添加管道符号 (例如,open("| ls")) 来调用进程。因此,使用变量输入作为 Kernel#open 和 URI.open 的参数可能会导致严重的安全风险。最好显式使用 File.open、IO.popen 或 URI.parse#open。
| 使用字面字符串的 open和URI.open不会被此 cop 标记。 | 
安全/YAMLLoad
| 默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 | 
|---|---|---|---|---|
| 已启用 | 是 | 始终(不安全) | 0.47 | - | 
检查是否使用 YAML 类方法,这些方法在从不受信任的来源加载时存在潜在的安全问题,可能导致远程代码执行。
| Ruby 3.1+ (Psych 4) 默认使用 Psych.load作为Psych.safe_load。 | 
示例
# bad
YAML.load("--- !ruby/object:Foo {}") # Psych 3 is unsafe by default
# good
YAML.safe_load("--- !ruby/object:Foo {}", [Foo])                    # Ruby 2.5  (Psych 3)
YAML.safe_load("--- !ruby/object:Foo {}", permitted_classes: [Foo]) # Ruby 3.0- (Psych 3)
YAML.load("--- !ruby/object:Foo {}", permitted_classes: [Foo])      # Ruby 3.1+ (Psych 4)
YAML.dump(foo)