request.get、flask-request、flask请求表单

Flask 中的 Request.get:你可能会错过的简单注入向量

错过检查可能会让你付出代价:Requests.get 和 Flask 请求表单

想象一下:一位初级开发人员正面临发布一项功能的压力。他们打开一个 Flask 应用,添加一条新路由,获取一个查询参数,然后继续下一步。

# Demonstrative example only — NOT executable, not exploitable
from flask import Flask, request
@app.route("/items")
def get_items():
    # Type casting avoids unsafe string injection
    item_id = request.args.get("id", type=int)
    # Safe usage: forces integer input, prevents injection

乍一看,这个 Flask 请求用法看起来不错。但是省略 类型=int 然后你打开门 注入攻击。 这些风险都会被代码审查忽略,因为“它只是获取一个值”。

风险隐藏在哪里 F请求 以及 Flask申请表

以上皆是 flask.request 以及 flask.request.form 是不受信任的入口点。它们返回的每个值都直接来自客户端,应被视为潜在的恶意行为。

未能验证或清理这些数据可能会导致严重的安全问题,包括:

这些风险不仅适用于数据库或前端渲染;攻击者还可能利用模板中使用的输入或传递给子进程的输入。

安全的伪代码模式:

python
# ⚠️ Educational example only — not functional
env_target = input("Enter deployment environment: ")
simulate_deploy(env_target)  # Simulated for demonstration

预防 CI/CD 执法:

# 1. Query parameter — Safe with casting
user_id = request.args.get("id", type=int)  # Enforces integer type

# 2. Form parameter — Safe with casting
username = request.form.get("username", type=str)  # Enforces string type

# 3. Template rendering safeguard
template_data = {"name": request.args.get("name", type=str)}  # Avoids untrusted HTML injection

# 4. Shell command safe handling
filename = request.args.get("file", type=str)
# Validate filename against known safe values before use in subprocess (not shown)

即使语法看起来安全,在模板或系统命令中使用原始或未经检查的值也可能成为严重的注入媒介。

实用注射流程(安全模拟)

以下是注入缺陷通常如何展开的(使用虚构的安全场景):

  1. 用户向应用程序发送精心设计的查询参数。
  2. 该应用程序使用以下方式读取值 请求.args.get() 沒有驗證。
  3. 该值直接连接到 SQL 查询、模板字符串或 shell 命令中。
  4. 系统执行该逻辑,但不知道注入的内容。

伪代码(不安全,仅供参考):

# Insecure example — do not run in production
user_id = request.args.get("id")  # Missing type casting, no validation
query = f"SELECT * FROM users WHERE id = {user_id}"  # Risk of injection

虚构的日志跟踪:

[INFO] Incoming request: /user?id=unexpected_input
[DEBUG] Parsed user_id: unexpected_input
[DEBUG] Constructed SQL: SELECT * FROM users WHERE id = unexpected_input

尽管这个例子使用了占位符,但它反映了输入处理中的小疏忽如何导致严重的漏洞。

自动化测试可能会错过这一点,因为它们通常测试有效的输入类型,而不是格式错误或恶意的输入类型。

依赖关系中的隐藏风险 Flask 请求 以及 Flask 申请表

您的代码可能很干净,但第三方软件包仍然可能会破坏您的代码。
一些 Flask 插件或库在内部调用 flask request 或 flask request form 时没有进行验证。

虚构包裹的示例:

python

# Insecure example — do not run in production
return AutoFormHandler.process()  # May use request.form.get() without validation

python

# Insecure example — do not run in production
query = build_query(request.args)  # May use request.args.get() without casting

In CI/CD,自动依赖更新可能会悄悄地引入不安全的请求、获取调用或易受攻击的输入处理模式。

多么不安全 Flask 请求 代码审查中的使用失误

在快节奏的环境中,细小但危险的错误常常被忽视,尤其是当变化看似无害时。

例如: pull request 差异:

# Insecure example — do not run in production
- user_id = request.args.get("id")
+ user_id = request.args.get("id")  # Still missing type casting

审稿人评论:
“看起来不错,它只是获取一个参数。”

这种疏忽很常见,因为:

  • 认知偏见:审阅者可能默认假设 request.args.get() 是安全的。
  • 时间压力:当最后期限临近时,安全检查就不再是首要任务。
  • 熟悉程度差异:这个变化看起来很小,所以没有受到深入的审查。

如果没有明确的规则或自动化的执行,这些微妙的风险就会悄无声息地渗入生产中。

有效的预防

为了降低注入的风险,请结合输入验证、自动扫描和测试覆盖率。

 使用强制转换和白名单进行输入验证:

user_id = request.args.get("id", type=int)
if user_id not in [1, 2, 3]:
    abort(400, "Invalid ID")

强制将值转换为安全类型,而白名单则确保只有已知的良好值才能继续进行。

静态应用程序安全测试(SAST)摄影作品通过 CI/CD:

name: Run SAST scan
  run: sast-tool --scan src/ --fail-on "request.args.get without type"

此步骤有助于检测未经验证的 请求.args.get() or 请求.表单.获取() 在投入生产之前打电话。

强制执行清理的单元测试:

def test_invalid_type(client):
    response = client.get("/items?id=abc")
    assert response.status_code == 400
These tests ensure the app rejects malformed or malicious input consistently.
Integrating Into DevSecOps Pipelines
Middleware enforcement:
@app.before_request

这些测试确保应用程序始终拒绝格式错误或恶意的输入。

集成到 DevSecOps Pipelines

中间件执行:

@app.before_request

def sanitize_input():
    if "id" in request.args and not request.args.get("id", type=int):
        abort(400, "Invalid ID")
Pre-commit hook:

bash
if grep -R "request.args.get(" . | grep -v "type="; then
    echo "Unsafe request.args.get detected — please add type casting."
    exit 1
fi

扫描您的代码和第三方依赖项 帮助在进入生产之前捕获不安全的请求。获取、烧瓶请求和烧瓶请求表单的使用情况。

这个问题不仅仅局限于 Flask

不安全的输入处理并非 Flask 独有,它存在于所有 Web 框架中。幸运的是,解决方案是一致的:尽早并严格地验证输入。

Django(安全伪代码):

# Enforces integer type and applies whitelist
user_id = int(request.GET.get("id", "0"))
if user_id not in [1, 2, 3]:
    return HttpResponseBadRequest()

FastAPI(使用类型提示设计,安全可靠):

from fastapi import Query
@app.get("/items")
def read_items(id: int = Query(..., ge=1, le=3)):
    return {"id": id}

这两个示例都强制输入类型和范围,确保传入的数据在到达敏感逻辑之前是可信的。

无论是 Flask、Django 还是 FastAPI,如果没有正确验证,每个请求参数都是一个潜在的注入点。

在 DevSecOps 中使用 Xygeni 进行检测

在 DevSecOps 环境中,手动审查是不够的。 西吉尼 自动检测不安全的 Flask 请求、Flask 请求表单和 Requests.get 使用情况。

实际的 DevSecOps 应用:

  1. 静态扫描:标记任何 请求.args.get() 也完全不需要 类型=,并且 Flask 请求表单调用缺少验证。
  2. 依赖关系分析:监控库中可能通过间接调用出现的不安全模式。
  3. 阻止不安全的合并: CI/CD 如果新代码引入了有风险的 request.get 或未经验证的表单访问,则会失败。
  4. 基线执行:跟踪变化以防止安全调用退化为不安全调用。

自动执行这些检查可以降低人为错误的风险, 保持安全性持续,且不会减慢交付速度。

因此,验证、净化、自动化

底线是这样的:requests.get、flask request 和 flask request form 都是 默认不受信任。除非你采取行动,否则他们会很乐意传递恶意数据。

你的三条规则:

  • 验证 使用转换和白名单的输入。
  • 消毒 在数据接触敏感操作之前。
  • 自动化 检查你的 pipeline 在部署之前停止不安全的代码。

一个不安全的 Flask 请求处理程序、一个未经检查的 Flask 请求表单字段或一个未受保护的 Requests.get 调用都可能危及你的应用程序。将每个参数都视为潜在的恶意参数,并让你的 DevSecOps pipeline 每次都执行规则。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件