CodeQL 文档

存储型跨站脚本

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

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

在未对值进行适当清理的情况下,直接将不受控制的存储值(例如数据库字段)写入网页,会导致跨站脚本漏洞。

这种漏洞也被称为 *存储型* 跨站脚本,以将其与其他类型的跨站脚本区分开来。

建议

为了防止存储型跨站脚本,请在使用不受控制的存储值创建 HTML 内容之前考虑转义。某些框架(如 Rails)默认情况下隐式执行此转义操作。

使用 html_saferaw 等方法时要小心。它们可以用于发出字符串而无需转义,并且仅在字符串已手动转义(例如,使用 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>

参考

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