CodeQL 文档

反射型服务器端跨站脚本

ID: py/reflective-xss
Kind: path-problem
Security severity: 6.1
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-079
   - external/cwe/cwe-116
Query suites:
   - python-code-scanning.qls
   - python-security-extended.qls
   - python-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

在未对输入进行适当清理的情况下直接将用户输入(例如,HTTP 请求参数)写入网页,会导致跨站脚本漏洞。

建议

为了防止跨站脚本,请考虑在将用户输入写入页面之前对其进行转义。标准库提供了转义函数:对于 Python 3.2 及更高版本,可以使用 html.escape(),对于旧版本的 Python,可以使用 cgi.escape()。大多数框架也提供自己的转义函数,例如 flask.escape()

示例

以下示例是一个最小的 flask 应用程序,它展示了安全和不安全的方式将给定的姓名渲染回页面。第一个视图不安全,因为 first_name 未转义,导致页面容易受到跨站脚本攻击。第二个视图是安全的,因为 first_name 已转义,因此它不会受到跨站脚本攻击的威胁。

from flask import Flask, request, make_response, escape

app = Flask(__name__)

@app.route('/unsafe')
def unsafe():
    first_name = request.args.get('name', '')
    return make_response("Your name is " + first_name)

@app.route('/safe')
def safe():
    first_name = request.args.get('name', '')
    return make_response("Your name is " + escape(first_name))

参考资料

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