存储型跨站脚本¶
ID: rb/stored-xss
Kind: path-problem
Security severity: 6.1
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-079
- external/cwe/cwe-116
Query suites:
- ruby-code-scanning.qls
- ruby-security-extended.qls
- ruby-security-and-quality.qls
在未对值进行适当清理的情况下,直接将不受控制的存储值(例如数据库字段)写入网页,会导致跨站脚本漏洞。
这种漏洞也被称为 *存储型* 跨站脚本,以将其与其他类型的跨站脚本区分开来。
建议¶
为了防止存储型跨站脚本,请在使用不受控制的存储值创建 HTML 内容之前考虑转义。某些框架(如 Rails)默认情况下隐式执行此转义操作。
使用 html_safe
或 raw
等方法时要小心。它们可以用于发出字符串而无需转义,并且仅在字符串已手动转义(例如,使用 Rails html_escape
方法)或内容以其他方式保证安全时才应使用(例如,硬编码字符串)。
示例¶
以下示例是安全的,因为输出标签中的 user.name
内容将在发出之前自动进行 HTML 转义。
<% user = User.find(1) %>
<p>Hello <%= user.name %>!</p>
但是,以下示例可能不安全,因为 user.name
未经转义就发出,因为它被标记为 html_safe
。如果在将 name
写入数据库之前没有对其进行清理,则攻击者可以使用此方法将任意内容插入 HTML 输出中,包括脚本。
<% user = User.find(1) %>
<p>Hello <%= user.name.html_safe %>!</p>
在接下来的示例中,来自磁盘上文件的内容被直接插入到 HTML 内容中。这种方法有时用于从磁盘上的文件加载脚本内容,例如 Web 应用程序的扩展程序。在这些情况下,应注意确保加载的文件是可信的,并且文件不能被不受信任的用户修改。
<script>
<%= File.read(File.join(SCRIPT_DIR, "script.js")).html_safe %>
</script>
参考¶
OWASP: XSS Ruby on Rails 速查表.
维基百科: 跨站脚本.
通用弱点枚举: CWE-79.
通用弱点枚举: CWE-116.