正则表达式注入¶
ID: py/regex-injection
Kind: path-problem
Security severity: 7.5
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-730
- external/cwe/cwe-400
Query suites:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
使用未经清理的用户输入构建正则表达式很危险,因为恶意用户可能能够修改表达式的含义。特别地,这样的用户可能能够提供一个在最坏情况下需要指数时间才能处理的正则表达式片段,并利用它来执行拒绝服务攻击。
建议¶
在将用户输入嵌入正则表达式之前,使用清理函数(例如 re.escape
)转义在正则表达式的语法方面具有特殊含义的元字符。
示例¶
以下示例基于简单的 Flask Web 服务器环境。
以下示例显示了一个 HTTP 请求参数,该参数用于构建正则表达式,而没有先进行清理
from flask import request, Flask
import re
@app.route("/direct")
def direct():
unsafe_pattern = request.args["pattern"]
re.search(unsafe_pattern, "")
@app.route("/compile")
def compile():
unsafe_pattern = request.args["pattern"]
compiled_pattern = re.compile(unsafe_pattern)
compiled_pattern.search("")
相反,应该先清理请求参数,例如使用 re.escape
函数。这将确保用户无法插入在正则表达式中具有特殊含义的字符。
from flask import request, Flask
import re
@app.route("/direct")
def direct():
unsafe_pattern = request.args['pattern']
safe_pattern = re.escape(unsafe_pattern)
re.search(safe_pattern, "")
@app.route("/compile")
def compile():
unsafe_pattern = request.args['pattern']
safe_pattern = re.escape(unsafe_pattern)
compiled_pattern = re.compile(safe_pattern)
compiled_pattern.search("")
参考¶
OWASP:正则表达式拒绝服务 - ReDoS.
维基百科:ReDoS.
Python 文档:re.
SonarSource:RSPEC-2631.
通用弱点枚举:CWE-730.
通用弱点枚举:CWE-400.