MST

星途 面试题库

面试题:Ruby代码中如何利用工具进行基础的静态分析以检测潜在的安全漏洞

请简述在Ruby项目中,使用一种常见的静态分析工具(如RuboCop)来检测代码中可能存在的安全问题(例如SQL注入风险、命令注入风险)的基本步骤和常用配置。并举例说明如何通过该工具发现和修复一个简单的SQL注入风险代码片段。
37.9万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

基本步骤

  1. 安装工具:在Ruby项目的环境中,使用gem install rubocop命令安装RuboCop。
  2. 初始化配置:运行rubocop --auto-gen-config生成默认配置文件.rubocop.yml
  3. 运行检测:在项目根目录下执行rubocop命令,RuboCop会遍历项目中的Ruby文件并检测代码是否符合规则。

常用配置

  1. 启用安全相关规则:在.rubocop.yml中,确保与安全相关的规则被启用,例如Security/EvalSecurity/InsecureSQL等规则。例如:
Security/Eval:
  Enabled: true
Security/InsecureSQL:
  Enabled: true
  1. 自定义规则:如果默认规则不满足需求,可以自定义规则。比如定义一个新的规则来检测特定模式的SQL注入风险。

示例

假设存在以下简单的SQL注入风险代码片段:

username = gets.chomp
sql = "SELECT * FROM users WHERE username = '#{username}'"
  1. 发现问题:运行rubocop后,它会检测到上述代码中字符串拼接SQL语句的操作可能存在SQL注入风险,并给出类似如下提示:
Inspecting 1 file
C

Offenses:

example.rb:2:16: C: Security/InsecureSQL: Possible SQL injection detected. Avoid string interpolation in SQL statements.
sql = "SELECT * FROM users WHERE username = '#{username}'"
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 file inspected, 1 offense detected
  1. 修复问题:可以使用参数化查询来修复这个问题,修改后的代码如下:
require 'pg'
username = gets.chomp
conn = PG.connect(dbname: 'your_database', user: 'your_user', password: 'your_password')
sql = "SELECT * FROM users WHERE username = $1"
result = conn.exec_params(sql, [username])

这样就避免了SQL注入风险,再次运行rubocop,该安全问题提示将不再出现。