CGI 脚本容易受到跨站脚本攻击¶
ID: cpp/cgi-xss
Kind: path-problem
Security severity: 6.1
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-079
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
直接将 HTTP 请求参数写回网页会导致跨站脚本漏洞。该数据在用户的网页浏览器中显示为属于一个网站,但它由用户浏览到的另一个网站提供。实际上,这种攻击允许一个网站在另一个网站中插入内容。
对于使用通用网关接口 (CGI) 实现的 Web 服务器,HTTP 参数通过 QUERY_STRING
环境变量提供。
建议¶
为了防范跨站脚本攻击,请考虑在将 HTTP 参数写回页面之前转义特殊字符。
示例¶
在以下示例中,bad_server
将参数直接写回用户将看到的 HTML 页面。 good_server
在写入 HTML 页面之前先转义所有 HTML 特殊字符。
void bad_server() {
char* query = getenv("QUERY_STRING");
puts("<p>Query results for ");
// BAD: Printing out an HTTP parameter with no escaping
puts(query);
puts("\n<p>\n");
puts(do_search(query));
}
void good_server() {
char* query = getenv("QUERY_STRING");
puts("<p>Query results for ");
// GOOD: Escape HTML characters before adding to a page
char* query_escaped = escape_html(query);
puts(query_escaped);
free(query_escaped);
puts("\n<p>\n");
puts(do_search(query));
}
参考资料¶
维基百科: Cross-site scripting.
IETF 工具: The Common Gateway Specification (CGI).
通用弱点枚举: CWE-79.