存储型跨站脚本¶
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
直接使用不受控制的存储值(例如,文件名)来创建 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);
});
});
参考资料¶
OWASP: XSS (跨站脚本) 防御手册.
OWASP 跨站脚本类型.
维基百科: 跨站脚本
常见漏洞枚举: CWE-79.
常见漏洞枚举: CWE-116.