反射型服务器端跨站脚本¶
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
在未对输入进行适当清理的情况下直接将用户输入(例如,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))
参考资料¶
OWASP:XSS(跨站脚本)防御速查表.
维基百科:跨站脚本.
Python 库参考:html.escape().
通用弱点枚举:CWE-79.
通用弱点枚举:CWE-116.