გამოტოვებული ჩეკი, რომელიც შეიძლება ძვირი დაგიჯდეთ: 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ლასკის მოთხოვნა მდე Fლასკის მოთხოვნის ფორმა
ორივე flask.request მდე flask.request.form არასანდო შესვლის წერტილებია. მათ მიერ დაბრუნებული ყველა მნიშვნელობა პირდაპირ კლიენტისგან მოდის და პოტენციურად მტრულად უნდა იქნას განხილული.
ამ მონაცემების დადასტურების ან დეზინფექციის შეუძლებლობამ შეიძლება გამოიწვიოს უსაფრთხოების კრიტიკული პრობლემები, მათ შორის:
- SQL ინექცია
- ჯვარედინი სკრიპტირება (XSS)
- შაბლონის ინექცია
- Shell ბრძანების ინექცია
ეს რისკები მხოლოდ მონაცემთა ბაზებს ან წინა პანელის რენდერინგს არ ეხება; თავდამსხმელებმა ასევე შეიძლება გამოიყენონ შაბლონებში გამოყენებული ან ქვეპროცესებისთვის გადაცემული შეყვანის მონაცემები.
უსაფრთხო ფსევდოკოდის ნიმუშები:
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)
მაშინაც კი, თუ სინტაქსი უსაფრთხოდ გამოიყურება, შაბლონებში ან სისტემურ ბრძანებებში ნედლი ან შეუმოწმებელი მნიშვნელობების გამოყენება შეიძლება სერიოზულ ინექციურ ვექტორად იქცეს.
პრაქტიკული ინექციის ნაკადი (უსაფრთხო სიმულაცია)
აი, როგორ ვითარდება ინექციის ხარვეზი, როგორც წესი, გამოგონილი, უსაფრთხო სცენარის გამოყენებით:
- მომხმარებელი აპლიკაციას უგზავნის შემუშავებულ მოთხოვნის პარამეტრს.
- აპლიკაცია კითხულობს მნიშვნელობას გამოყენებით request.args.get() დადასტურების გარეშე.
- ეს მნიშვნელობა პირდაპირ გაერთიანებულია SQL მოთხოვნაში, შაბლონის სტრიქონში ან shell ბრძანებაში.
- სისტემა ასრულებს ამ ლოგიკას ინექციური შინაარსის შესახებ ინფორმაციის გარეშე.
ფსევდოკოდი (არასაიმედო, მხოლოდ ილუსტრაციისთვის):
# 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-ის მოთხოვნის ფორმას ვალიდაციის გარეშე.
მაგალითი გამოგონილი პაკეტებით:
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, ავტომატურმა დამოკიდებულების განახლებებმა შეიძლება ჩუმად შემოიტანოს სახიფათო მოთხოვნები. მიიღეთ ზარები ან დაუცველი შეყვანის დამუშავების ნიმუშები.
რამდენად სახიფათოა ფლაკონის მოთხოვნა გამოყენების ფურცლები წარსული კოდის მიმოხილვები
სწრაფი ტემპის მქონე გარემოში, პატარა, მაგრამ საშიში შეცდომები ხშირად შეუმჩნეველი რჩება, განსაკუთრებით მაშინ, როდესაც ცვლილება უვნებლად გამოიყურება.
მაგალითი 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"
ეს ნაბიჯი ხელს უწყობს არავალიდურის აღმოჩენას request.args.get() or request.form.get() ზარები წარმოებამდე.
ერთეული ტესტები სანიტარიის აღსასრულებლად:
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
როგორც თქვენი კოდის, ასევე მესამე მხარის დამოკიდებულებების სკანირება ხელს უწყობს არაუსაფრთხო requests.get-ის, flask request-ის და flask request ფორმის გამოყენების დაფიქსირებას, სანამ ის წარმოებაში მოხვდება.
ეს პრობლემა ფლაკის ფარგლებს სცდება
არაუსაფრთხო შეყვანის დამუშავება მხოლოდ Flask-ისთვის არ არის დამახასიათებელი, ის ყველა ვებ ჩარჩოში არსებობს. საბედნიეროდ, გამოსავალი თანმიმდევრულია: შეყვანის ადრეული და მკაცრი შემოწმება.
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, ყველა მოთხოვნის პარამეტრი პოტენციური ინექციის წერტილია, თუ სწორად არ არის დადასტურებული.
Xygeni-ს გამოყენება DevSecOps-ში დეტექტირებისთვის
DevSecOps გარემოში ხელით შეფასებები საკმარისი არ არის. ქსიგენი ავტომატიზირებს სახიფათო კოლბის მოთხოვნის, კოლბის მოთხოვნის ფორმის და requests.get usage-ის აღმოჩენის ფაქტორებს.
DevSecOps-ის პრაქტიკული გამოყენება:
- სტატიკური სკანირება: ნებისმიერს ანიშნებს request.args.get() გარეშე ტიპი=და flask მოთხოვნის ფორმის გამოძახებებს, რომლებსაც არ აქვთ დადასტურება.
- დამოკიდებულების ანალიზი: აკონტროლებს ბიბლიოთეკებს სახიფათო შაბლონების აღმოსაჩენად, რომლებიც შეიძლება გამოვლინდეს არაპირდაპირი გამოძახებების შედეგად.
- სახიფათო შერწყმების დაბლოკვა: CI/CD ვერ ხერხდება, თუ ახალი კოდი შემოიტანს სარისკო requests.get-ს ან ფორმაზე წვდომას გაუვალიდებელს.
- საბაზისო აღსრულება: აკონტროლებს ცვლილებებს, რათა უსაფრთხო ზარები არ გადაიქცეს სახიფათო ზარებად.
ამ შემოწმებების ავტომატიზაცია ამცირებს ადამიანური შეცდომების რისკს და უზრუნველყოფს უსაფრთხოების უწყვეტობას მიწოდების შენელების გარეშე.
ასე რომ, ვალიდაცია, დეზინფექცია, ავტომატიზაცია
აი, არსი: requests.get, flask request და flask request form ყველა ეს არის ნაგულისხმევად არასანდოისინი სიამოვნებით მოგაწვდიან მავნე მონაცემებს, თუ თქვენ არ მიიღებთ ზომებს.
თქვენი სამი წესი:
- დავამტკიცოთ შეყვანა ქასთინგისა და თეთრი სიების გამოყენებით.
- სანიტარიზაცია სანამ მონაცემები მგრძნობიარე ოპერაციებს შეეხება.
- ავტომატიზირება ამოწმებს თქვენს pipeline განლაგებამდე არაუსაფრთხო კოდის შესაჩერებლად.
ერთი სახიფათო flask მოთხოვნის დამმუშავებელი, flask მოთხოვნის ფორმის შეუმოწმებელი ველი ან დაუცველი requests.get ზარი შეიძლება საფრთხეს უქმნიდეს თქვენს აპლიკაციას. ყველა პარამეტრი მიიჩნიეთ პოტენციურად მავნედ და მიეცით თქვენს DevSecOps-ს ამის საშუალება. pipeline წესების დაცვა ყოველ ჯერზე.







