安全
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)