Cek Terlepas Yang Boleh Mengorbankan Anda: Borang Permintaan Requests.get dan Flask
Bayangkan ini: seorang pembangun junior sedang bekerja di bawah tekanan untuk menghantar ciri. Mereka membuka aplikasi Flask, menambah laluan baharu, mengambil parameter pertanyaan dan teruskan.
# 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
Pada pandangan pertama, penggunaan permintaan Flask ini kelihatan baik. Tetapi abaikan jenis=int dan kau buka pintu untuk serangan suntikan. Ini adalah jenis risiko yang terlepas daripada semakan kod kerana "ia hanya mengambil nilai."
Di Mana Risiko Tersembunyi FPermintaan lask dan FBorang Permintaan lask
Kedua-dua permintaan kelalang dan borang.permintaan.kelalang adalah titik masuk yang tidak dipercayai. Setiap nilai yang mereka kembalikan datang terus daripada klien dan harus dianggap sebagai berpotensi bermusuhan.
Kegagalan untuk mengesahkan atau membersihkan data ini boleh menyebabkan masalah keselamatan kritikal, termasuk:
- Suntikan SQL
- Skrip silang tapak (XSS)
- Suntikan templat
- Suntikan arahan Shell
Risiko ini bukan sahaja terpakai pada pangkalan data atau pemaparan bahagian hadapan; penyerang juga boleh mengeksploitasi input yang digunakan dalam templat atau dihantar ke subproses.
Corak pseudo-kod yang selamat:
python
# ⚠️ Educational example only — not functional
env_target = input("Enter deployment environment: ")
simulate_deploy(env_target) # Simulated for demonstration
Pencegahan CI/CD penguatkuasaan:
# 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)
Walaupun sintaks kelihatan selamat, penggunaan nilai mentah atau tidak ditanda dalam templat atau arahan sistem boleh menjadi vektor suntikan yang serius.
Aliran Suntikan Praktikal (Simulasi Selamat)
Beginilah cara kecacatan suntikan biasanya berlaku, menggunakan senario fiksyen dan selamat:
- Pengguna menghantar parameter pertanyaan yang direka bentuk kepada aplikasi.
- Aplikasi membaca nilai menggunakan permintaan.args.get() tanpa pengesahan.
- Nilai tersebut digabungkan terus ke dalam pertanyaan SQL, rentetan templat atau arahan shell.
- Sistem ini melaksanakan logik itu, tanpa menyedari kandungan yang disuntik.
Pseudokod (tidak selamat, ilustrasi sahaja):
# 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
Jejak log fiksyen:
[INFO] Incoming request: /user?id=unexpected_input
[DEBUG] Parsed user_id: unexpected_input
[DEBUG] Constructed SQL: SELECT * FROM users WHERE id = unexpected_input
Walaupun contoh ini menggunakan ruang letak, ia mencerminkan bagaimana kesilapan kecil dalam pengendalian input boleh menyebabkan kelemahan kritikal.
Ujian automatik mungkin terlepas pandang perkara ini kerana ia biasanya menguji jenis input yang sah, bukan yang salah bentuk atau berniat jahat.
Risiko Tersembunyi dalam Kebergantungan Menggunakan Permintaan Kelalang dan Borang Permintaan Kelalang
Kod anda mungkin bersih, tetapi pakej pihak ketiga masih boleh merosakkan anda.
Sesetengah plugin atau pustaka Flask secara dalaman memanggil permintaan flask atau borang permintaan flask tanpa pengesahan.
Contoh dengan pakej fiksyen:
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, kemas kini kebergantungan automatik boleh memperkenalkan permintaan yang tidak selamat secara senyap. dapatkan panggilan atau corak pengendalian input yang terdedah.
Betapa Tidak Selamatnya Permintaan Kelalang Ulasan Kod Lepas Slip Penggunaan
Dalam persekitaran yang pantas, kesilapan kecil tetapi berbahaya sering tidak disedari, terutamanya apabila perubahan itu kelihatan tidak berbahaya.
Contoh pull request perbezaan:
# Insecure example — do not run in production
- user_id = request.args.get("id")
+ user_id = request.args.get("id") # Still missing type casting
Komen pengulas:
"Nampak baik, cuma parameternya sedang dibetulkan."
Kecuaian seperti ini adalah perkara biasa kerana:
- Bias kognitif: pengulas mungkin menganggap request.args.get() selamat secara lalai.
- Tekanan masa: pemeriksaan keselamatan diketepikan apabila tarikh akhir semakin hampir.
- Keakraban yang berbeza: perubahan itu kelihatan kecil, jadi ia tidak mendapat penelitian yang mendalam.
Tanpa peraturan yang jelas atau penguatkuasaan automatik, risiko-risiko halus ini akan tergelincir ke dalam pengeluaran tanpa disedari.
Pencegahan Yang Berkesan
Untuk mengurangkan risiko suntikan, gabungkan pengesahan input, pengimbasan automatik dan liputan ujian.
Pengesahan input dengan pemilihan dan senarai putih:
user_id = request.args.get("id", type=int)
if user_id not in [1, 2, 3]:
abort(400, "Invalid ID")
Casting memaksa nilai kepada jenis yang selamat, manakala senarai putih memastikan hanya nilai yang diketahui baik diteruskan.
Pengujian Keselamatan Aplikasi Statik (SAST) dalam CI/CD:
name: Run SAST scan
run: sast-tool --scan src/ --fail-on "request.args.get without type"
Langkah ini membantu mengesan data yang tidak disahkan permintaan.args.get() or permintaan.borang.dapatkan() panggilan sebelum ia sampai ke pengeluaran.
Ujian unit untuk menguatkuasakan sanitasi:
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
Ujian ini memastikan aplikasi menolak input yang salah bentuk atau berniat jahat secara konsisten.
Integrasi Ke Dalam DevSecOps Pipelines
Penguatkuasaan perisian tengah:
@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
Mengimbas kedua-dua kod anda dan kebergantungan pihak ketiga membantu mengesan permintaan yang tidak selamat. Dapatkan, permintaan kelalang dan penggunaan borang permintaan kelalang sebelum ia sampai ke pengeluaran.
Masalah Ini Melangkaui Kelalang
Pengendalian input yang tidak selamat bukanlah sesuatu yang unik kepada Flask, ia wujud merentasi rangka kerja web. Mujurlah, penyelesaiannya konsisten: sahkan input lebih awal dan ketat.
Django (pseudokod selamat):
# 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 (selamat mengikut reka bentuk menggunakan petunjuk jenis):
from fastapi import Query
@app.get("/items")
def read_items(id: int = Query(..., ge=1, le=3)):
return {"id": id}
Kedua-dua contoh menguatkuasakan jenis dan julat input, memastikan data masuk dipercayai sebelum ia mencapai logik sensitif.
Sama ada Flask, Django atau FastAPI, setiap parameter permintaan merupakan titik suntikan yang berpotensi jika tidak disahkan dengan betul.
Menggunakan Xygeni untuk Pengesanan dalam DevSecOps
Dalam persekitaran DevSecOps, semakan manual tidak mencukupi. Xygeni mengautomasikan pengesanan permintaan kelalang yang tidak selamat, borang permintaan kelalang dan permintaan.get penggunaan.
Aplikasi DevSecOps yang praktikal:
- Imbasan statik: Menandakan mana-mana permintaan.args.get() tanpa jenis=, dan panggilan borang permintaan kelalang yang kekurangan pengesahan.
- Analisis kebergantungan: Memantau pustaka untuk corak tidak selamat yang boleh muncul melalui panggilan tidak langsung.
- Menyekat penggabungan yang tidak selamat: CI/CD gagal jika kod baharu memperkenalkan permintaan berisiko. dapatkan atau akses borang yang tidak disahkan.
- Penguatkuasaan asas: Menjejaki perubahan untuk mengelakkan panggilan selamat daripada menjadi tidak selamat.
Mengautomasikan pemeriksaan ini mengurangkan risiko ralat manusia dan memastikan keselamatan berterusan tanpa memperlahankan penghantaran.
Jadi, Sahkan, Sanitasi, Automatikkan
Inilah kesimpulannya: requests.get, flask request dan flask request form semuanya tidak dipercayai secara lalaiMereka dengan senang hati akan menghantar data berniat jahat melainkan anda mengambil tindakan.
Tiga peraturan anda:
- mengesahkan input menggunakan pemilihan dan senarai putih.
- Sanitize sebelum data menyentuh operasi sensitif.
- Automate cek dalam anda pipeline untuk menghentikan kod yang tidak selamat sebelum penggunaan.
Pengendali permintaan kelalang tunggal yang tidak selamat, medan borang permintaan kelalang yang tidak ditanda atau panggilan requests.get yang tidak dijaga boleh menjejaskan aplikasi anda. Anggap setiap parameter sebagai berpotensi bermusuhan dan biarkan DevSecOps anda pipeline menguatkuasakan peraturan setiap masa.







