CodeQL 文档

存储型跨站脚本

ID: js/stored-xss
Kind: path-problem
Security severity: 7.8
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-079
   - external/cwe/cwe-116
Query suites:
   - javascript-code-scanning.qls
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

直接使用不受控制的存储值(例如,文件名)来创建 HTML 内容,而没有首先对输入进行适当清理,会导致跨站脚本漏洞。

这种漏洞也被称为存储型跨站脚本,以区别于其他类型的跨站脚本。

建议

为了防止跨站脚本攻击,请考虑在使用不受控制的存储值创建 HTML 内容之前使用上下文输出编码/转义,或者使用其他在参考资料中提到的解决方案之一。

示例

以下示例代码将文件名直接写入 HTTP 响应。如果攻击者可以随意选择磁盘上的文件名,这会导致网站容易受到跨站脚本攻击。

var express = require('express'),
    fs = require('fs');

express().get('/list-directory', function(req, res) {
    fs.readdir('/public', function (error, fileNames) {
        var list = '<ul>';
        fileNames.forEach(fileName => {
            // BAD: `fileName` can contain HTML elements
            list += '<li>' + fileName + '</li>';
        });
        list += '</ul>'
        res.send(list);
    });
});

清理文件名可以防止漏洞

var express = require('express'),
    fs = require('fs'),
    escape = require('escape-html');

express().get('/list-directory', function(req, res) {
    fs.readdir('/public', function (error, fileNames) {
        var list = '<ul>';
        fileNames.forEach(fileName => {
            // GOOD: escaped `fileName` can not contain HTML elements
            list += '<li>' + escape(fileName) + '</li>';
        });
        list += '</ul>'
        res.send(list);
    });
});

参考资料

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