CodeQL 文档

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

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

直接将 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));
}

参考资料

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