安全

Security/CompoundHash

默认启用 安全 支持自动更正 添加版本 更改版本

待定

1.28

1.51

检查 hash 方法的实现,这些方法使用自定义逻辑组合值,而不是委托给 Array#hash

手动组合哈希容易出错且难以跟踪,尤其是在存在多个值的情况下。如果实现容易发生冲突,则可能还会引入性能或安全问题。委托给 Array#hash 更清晰、更安全,尽管它可能比使用案例慢。

安全

如果应用程序逻辑依赖于哈希值,则此 cop 可能不安全,但无论如何这样做都是不可取的。

示例

# bad
def hash
  @foo ^ @bar
end

# good
def hash
  [@foo, @bar].hash
end

Security/Eval

默认启用 安全 支持自动更正 添加版本 更改版本

已启用

0.47

-

检查 Kernel#evalBinding#eval 的使用情况。

示例

# bad

eval(something)
binding.eval(something)

Security/IoMethods

默认启用 安全 支持自动更正 添加版本 更改版本

待定

始终(不安全)

1.22

-

检查 IO.readIO.binreadIO.writeIO.binwriteIO.foreachIO.readlines 的第一个参数。

如果参数以管道字符 ('|') 开头,并且接收器是 IO 类,则会以与 Kernel#open 相同的方式创建子进程,并返回其输出。Kernel#open 可能允许无意中进行命令注入,这就是这些 IO 方法存在安全风险的原因。请考虑使用 File.read 来禁用子进程调用的行为。

安全

此 cop 不安全,因为如果作为第一个参数传递的变量是一个不是文件路径的命令,则会发生误报。

示例

# bad
IO.read(path)
IO.read('path')

# good
File.read(path)
File.read('path')
IO.read('| command') # Allow intentional command invocation.

Security/JSONLoad

默认启用 安全 支持自动更正 添加版本 更改版本

已启用

始终(不安全)

0.43

1.22

检查 JSON 类方法的使用情况,这些方法存在潜在的安全问题。

安全

此 cop 的自动更正不安全,因为它可能很危险。如果使用流,例如 JSON.load(open('file')),则需要手动调用 #read,例如 JSON.parse(open('file').read)。如果读取单个值(而不是正确的 JSON 对象),例如 JSON.load('false'),则需要传递 quirks_mode: true 选项,例如 JSON.parse('false', quirks_mode: true)。其他类似问题也可能适用。

示例

# bad
JSON.load("{}")
JSON.restore("{}")

# good
JSON.parse("{}")

安全/MarshalLoad

默认启用 安全 支持自动更正 添加版本 更改版本

已启用

0.47

-

检查是否使用 Marshal 类方法,这些方法在从不受信任的来源加载时存在潜在的安全问题,可能导致远程代码执行。

示例

# bad
Marshal.load("{}")
Marshal.restore("{}")

# good
Marshal.dump("{}")

# okish - deep copy hack
Marshal.load(Marshal.dump({}))

安全/Open

默认启用 安全 支持自动更正 添加版本 更改版本

已启用

0.53

1.0

检查是否使用 Kernel#openURI.open 以及动态数据。

Kernel#openURI.open 不仅支持文件访问,还支持通过在前面添加管道符号 (例如,open("| ls")) 来调用进程。因此,使用变量输入作为 Kernel#openURI.open 的参数可能会导致严重的安全风险。最好显式使用 File.openIO.popenURI.parse#open

使用字面字符串的 openURI.open 不会被此 cop 标记。

安全性

如果在类中重新定义了 open,然后在该类中没有接收者的情况下使用它,则此 cop 可能会注册误报。

示例

# bad
open(something)
open("| #{something}")
open("| foo")
URI.open(something)

# good
File.open(something)
IO.popen(something)
URI.parse(something).open

# good (literal strings)
open("foo.text")
URI.open("http://example.com")

安全/YAMLLoad

默认启用 安全 支持自动更正 添加版本 更改版本

已启用

始终(不安全)

0.47

-

检查是否使用 YAML 类方法,这些方法在从不受信任的来源加载时存在潜在的安全问题,可能导致远程代码执行。

Ruby 3.1+ (Psych 4) 默认使用 Psych.load 作为 Psych.safe_load

安全性

代码的行为可能会根据 YAML 负载中的内容而改变,因为 YAML.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)