从 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
敏感信息(例如密码)不应在请求 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
参考¶
PortSwigger (Burp): 使用 GET 方法提交密码
OWASP: URL 中的查询字符串信息泄露
常见漏洞枚举:CWE-598.