CodeQL 文档

从 GET 请求中读取敏感数据

ID: rb/sensitive-get-query
Kind: problem
Security severity: 6.5
Severity: warning
Precision: high
Tags:
   - security
   - external/cwe/cwe-598
Query suites:
   - ruby-code-scanning.qls
   - ruby-security-extended.qls
   - ruby-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

敏感信息(例如密码)不应在请求 URL 的查询字符串中传输。URL 中的敏感信息可能会记录在各种位置,包括用户的浏览器、Web 服务器以及两者之间的任何代理服务器。URL 也可能会在屏幕上显示,被用户添加书签或通过电子邮件发送。当用户访问任何非网站链接时,它们可能会通过 Referer 标头泄露给第三方。因此,将敏感信息放入 URL 会增加攻击者捕获它的风险。

建议

使用 HTTP POST 将敏感信息作为请求主体的一部分发送;例如,作为表单数据。

示例

以下示例展示了两个路由处理程序,它们都接收用户名和密码。第一个从 GET 请求的查询参数中接收此敏感信息,该参数在 URL 中传输。第二个从 POST 请求的请求主体中接收此敏感信息。

Rails.application.routes.draw do
  get "users/login", to: "#login_get" # BAD: sensitive data transmitted through query parameters
  post "users/login", to: "users#login_post" # GOOD: sensitive data transmitted in the request body
end
class UsersController < ActionController::Base
  def login_get
    password = params[:password]
    authenticate_user(params[:username], password)
  end

  def login_post
    password = params[:password]
    authenticate_user(params[:username], password)
  end

  private
  def authenticate_user(username, password)
    # ... authenticate the user here
  end
end

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私