requests.get, sol·licitud de flascó, formulari de sol·licitud de flascó

Request.get a Flask: El vector d'injecció simple que potser us passareu per alt

Un xec perdut que et podria costar diners: Requests.get i el formulari de sol·licitud de Flask

Imagineu-vos això: un desenvolupador júnior treballa sota pressió per llançar una funcionalitat. Obre una aplicació Flask, afegeix una nova ruta, agafa un paràmetre de consulta i continua.

				
					# 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

				
			

A primera vista, aquest ús de sol·licitud Flask sembla correcte. Però ometeu-ho tipus=int i obres la porta a atacs d'injecció. Aquests són els tipus de riscos que passen desapercebuts per les revisions de codi perquè "només està obtenint valor".

On s'amaga el risc FSol·licitud de lask i FFormulari de sol·licitud de lask

Tots dos flask.request i flask.sol·licitud.formulari són punts d'entrada no fiables. Cada valor que retornen prové directament del client i s'ha de tractar com a potencialment hostil.

Si no es validen o sanegen aquestes dades, es poden produir problemes de seguretat greus, com ara:

Aquests riscos no només s'apliquen a les bases de dades o al renderitzat front-end; els atacants també poden explotar les entrades utilitzades a les plantilles o passades a subprocessos.

Patrons de pseudocodi segurs:

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


				
			

Preventius CI/CD aplicació:

				
					# 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)

				
			

Fins i tot si la sintaxi sembla segura, l'ús de valors en brut o no verificats en plantilles o ordres del sistema pot convertir-se en un vector d'injecció seriós.

Flux d'injecció pràctic (simulació segura)

Així és com es desenvolupa normalment un defecte d'injecció, utilitzant un escenari fictici i segur:

  1. Un usuari envia un paràmetre de consulta creat a l'aplicació.
  2. L'aplicació llegeix el valor mitjançant sol·licitud.arguments.obtenir() sense validació.
  3. Aquest valor es concatena directament en una consulta SQL, una cadena de plantilla o una ordre de shell.
  4. El sistema executa aquesta lògica sense ser conscient del contingut injectat.

Pseudocodi (insegur, només il·lustratiu):

				
					# 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

				
			

Traça de registre fictícia:

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

				
			

Tot i que aquest exemple utilitza marcadors de posició, reflecteix com petits errors en la gestió de l'entrada poden conduir a vulnerabilitats crítiques.

Les proves automatitzades poden passar per alt això perquè normalment proven tipus d'entrada vàlids, no tipus d'entrada incorrectes o malicioses.

Riscos ocults en les dependències que utilitzen Sol·licitud de matràs i Formulari de sol·licitud de flascó

El vostre codi pot ser net, però els paquets de tercers encara us poden fallar.
Alguns complements o biblioteques de Flask criden internament la sol·licitud de flask o el formulari de sol·licitud de flask sense validació.

Exemple amb paquets ficticis:

				
					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, les actualitzacions automatitzades de dependències poden introduir silenciosament requests.get no segures o patrons de gestió d'entrada vulnerables.

Com de perillós Sol·licitud de matràs Ressenyes d'ús Ressenyes de codi anteriors

En entorns accelerats, els errors petits però perillosos sovint passen desapercebuts, sobretot quan el canvi sembla inofensiu.

exemple pull request diferència:

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

				
			

Comentari del revisor:
"Sembla bé, només està obtenint un paràmetre."

Aquest tipus de descuit és comú a causa de:

  • Biaix cognitiu: els revisors poden assumir que request.args.get() és segur per defecte.
  • Pressió del temps: els controls de seguretat passen a un segon pla quan s'acosten els terminis.
  • Diferència de familiaritat: el canvi sembla menor, per la qual cosa no s'examina a fons.

Sense normes clares ni una aplicació automatitzada, aquests riscos subtils passen desapercebuts a la producció.

Prevenció que funciona

Per mitigar els riscos d'injecció, combineu la validació d'entrada, l'escaneig automatitzat i la cobertura de proves.

 Validació d'entrada amb càsting i llista blanca:

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

				
			

La conversió força el valor a un tipus segur, mentre que la llista blanca garanteix que només continuïn els valors coneguts com a vàlids.

Proves de seguretat d'aplicacions estàtiques (SAST) in CI/CD:

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

				
			

Aquest pas ajuda a detectar no validats sol·licitud.arguments.obtenir() or sol·licitud.formulari.obtenir() trucades abans que arribin a producció.

Proves unitàries per aplicar la higienització:

				
					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

				
			

Aquestes proves garanteixen que l'aplicació rebutgi de manera consistent les entrades mal formades o malicioses.

Integració amb DevSecOps Pipelines

Aplicació de middleware:

@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

				
			

Escanejant tant el vostre codi com les dependències de tercers ajuda a detectar les requests.get, flask request i l'ús del formulari de flask request no segures abans que arribi a la producció.

Aquest problema va més enllà del matràs

La gestió d'entrades no segura no és exclusiva de Flask, sinó que existeix en tots els frameworks web. Afortunadament, la solució és coherent: validar les entrades de manera anticipada i estricta.

Django (pseudocodi segur):

				
					# 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 (segura per disseny mitjançant pistes de tipus):

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

				
			

Tots dos exemples imposen el tipus i l'interval d'entrada, garantint que les dades entrants siguin fiables abans que arribin a la lògica sensible.

Tant si es tracta de Flask, Django o FastAPI, cada paràmetre de sol·licitud és un punt d'injecció potencial si no es valida correctament.

Ús de Xygeni per a la detecció en DevSecOps

En un entorn DevSecOps, les revisions manuals no són suficients. Xígeni automatitza la detecció de sol·licituds de flascons no segures, formularis de sol·licitud de flascons i ús de requests.get.

Aplicacions pràctiques de DevSecOps:

  1. Escaneigs estàtics: Marca qualsevol sol·licitud.arguments.obtenir() sense type=i les crides al formulari de sol·licitud de flascó que no tenen validació.
  2. Anàlisi de dependènciesSupervisa les biblioteques per detectar patrons no segurs que podrien aparèixer a través de crides indirectes.
  3. Bloqueig de fusions no segures: CI/CD falla si el codi nou introdueix requests.get arriscats o accés a formularis no validat.
  4. Aplicació de les normes de referència: Fa un seguiment dels canvis per evitar que les trucades segures es converteixin en trucades insegures.

L'automatització d'aquestes comprovacions redueix el risc d'error humà i manté la seguretat contínua sense alentir el lliurament.

Així doncs, Validar, Sanejar, Automatitzar

Aquí teniu la conclusió: requests.get, flask request i flask request form són tots no fiable per defecteUs lliuraran dades malicioses amb molt de gust si no feu res.

Les teves tres regles:

  • Validar entrades mitjançant càsting i llistes blanques.
  • Desinfectar abans que les dades toquin operacions sensibles.
  • Automatitzar xecs al vostre pipeline per aturar el codi insegur abans del desplegament.

Un únic gestor de sol·licituds de flask no segur, un camp de formulari de sol·licitud de flask no verificat o una crida requests.get no protegida pot comprometre la vostra aplicació. Tracteu tots els paràmetres com a potencialment hostils i deixeu que els vostres DevSecOps ho facin. pipeline fer complir les normes cada vegada.

sca-tools-software-composition-analyse-tools
Prioritzar, solucionar i protegir els riscos del programari
Obtén el teu compte gratuït.
No es requereix cap targeta de crèdit.

Assegura el desenvolupament i el lliurament del teu programari

amb el paquet de productes Xygeni