requests.get, flask -request, flask request form

Request.get in Flask: ሊያመልጡት የሚችሉት ቀላል መርፌ ቬክተር

ዋጋ ሊያስከፍልዎት የሚችል የጠፋ ቼክ፡ Requests.get እና Flask Request Form

እስቲ አስቡት፦ አንድ ጁኒየር ገንቢ አንድን ባህሪ ለመላክ ጫና ውስጥ እየሠራ ነው። የፍላስክ መተግበሪያን ይከፍታሉ፣ አዲስ መንገድ ያክላሉ፣ የጥያቄ መለኪያ ይይዛሉ እና ይቀጥሉ።

				
					# 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

				
			

በመጀመሪያ ሲታይ፣ ይህ የፍላክስ ጥያቄ አጠቃቀም ጥሩ ይመስላል። ግን ችላ በሉት አይነት=int እና በሩን ትከፍታለህ የመርፌ ጥቃቶች። እነዚህ የኮድ ግምገማዎችን የሚያልፉ አደጋዎች ናቸው ምክንያቱም "ዋጋን ብቻ ስለሚያመጣ"።

አደጋው የሚደበቅበት ቦታ Fየላስት ጥያቄ ና Fየላስት የጥያቄ ቅጽ

ሁለቱም ፍላክስ.ጥያቄ ና ፍላስክ.ጥያቄ.ፎርም የማይታመኑ የመግቢያ ነጥቦች ናቸው። የሚያገኙት እያንዳንዱ እሴት በቀጥታ ከደንበኛው የሚመጣ ሲሆን እንደ ጠላት ሊቆጠር የሚችል ተደርጎ መታየት አለበት።

ይህንን መረጃ ማረጋገጥ ወይም ማጽዳት አለመቻል የሚከተሉትን ጨምሮ ወደ ወሳኝ የደህንነት ችግሮች ሊያመራ ይችላል፡

እነዚህ አደጋዎች ለመረጃ ቋቶች ወይም ለቅድመ-መጨረሻ አቀራረብ ብቻ የሚተገበሩ አይደሉም፤ አጥቂዎች በአብነት ውስጥ ጥቅም ላይ የዋሉ ግብዓቶችን ሊጠቀሙ ወይም ወደ ንዑስ ሂደቶች ሊተላለፉ ይችላሉ።

ደህንነቱ የተጠበቀ የውሸት ኮድ ቅጦች፡

				
					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. መተግበሪያው እሴቱን በመጠቀም ያነባል request.args.get() ያለ ማረጋገጫ።
  3. ያ እሴት በቀጥታ ከ SQL መጠይቅ፣ ከቴምፕል ስትሪንግ ወይም ከሼል ትዕዛዝ ጋር ይገናኛል።
  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

				
			

ምንም እንኳን ይህ ምሳሌ የቦታ መያዣዎችን የሚጠቀም ቢሆንም፣ በግብዓት አያያዝ ላይ ያሉ ትናንሽ ጉድለቶች እንዴት ወሳኝ ተጋላጭነቶችን ሊያስከትሉ እንደሚችሉ ያንፀባርቃል።

አውቶማቲክ ሙከራዎች ብዙውን ጊዜ የተበላሹ ወይም ተንኮል አዘል ያልሆኑትን ሳይሆን ትክክለኛ የግቤት አይነቶችን ስለሚፈትሹ ይህንን ሊያመልጡ ይችላሉ።

ጥገኝነት በሚያስፈልጋቸው ሰዎች ላይ የተደበቁ አደጋዎችን መጠቀም የፍላሽ ጥያቄ ና የፍላክ መጠየቂያ ቅጽ

ኮድዎ ንጹህ ሊሆን ይችላል፣ ነገር ግን የሶስተኛ ወገን ፓኬጆች አሁንም ሊያበላሹዎት ይችላሉ።
አንዳንድ የፍላክስ ተሰኪዎች ወይም ቤተ-መጻሕፍት ያለ ማረጋገጫ የፍላክስ ጥያቄ ወይም የፍላክስ ጥያቄ ቅጽን በውስጥ ይደውላሉ።

ምሳሌ ከምናባዊ ፓኬጆች ጋር፦

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

				
			

casting እሴቱን ደህንነቱ የተጠበቀ አይነት እንዲያደርግ ያስገድደዋል፣ ነገር ግን በተፈቀደላቸው ዝርዝር ውስጥ ማስቀመጥ የሚታወቁ ጥሩ እሴቶች ብቻ እንዲቀጥሉ ያረጋግጣል።

የማይንቀሳቀስ የመተግበሪያ ደህንነት ሙከራ (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

				
			

የእርስዎን ኮድ እና የሶስተኛ ወገን ጥገኞችን በመቃኘት ላይ ደህንነቱ ያልተጠበቀ ጥያቄዎችን ለማግኘት፣ የፍላሽ ጥያቄ እና የፍላሽ ጥያቄ ቅጽ ከመምጣቱ በፊት ለመጠቀም ይረዳል።

ይህ ችግር ከፍላስክ አልፎ ይሄዳል

ደህንነቱ ያልተጠበቀ የግቤት አያያዝ ለፍላስክ ብቻ የተወሰነ አይደለም፤ በድር ማዕቀፎች ውስጥ ይገኛል። እንደ እድል ሆኖ፣ መፍትሄው ወጥነት ያለው ነው፡ ግብዓቶችን ቀደም ብሎ እና በጥብቅ ያረጋግጡ።

ጃንጎ (ደህንነቱ የተጠበቀ የውሸት ኮድ):

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

				
			

ፈጣን ኤፒአይ (በዲዛይን አይነት ፍንጮችን በመጠቀም ደህንነቱ የተጠበቀ)

				
					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 አካባቢ፣ በእጅ የሚሰጡ ግምገማዎች በቂ አይደሉም። ዚጌኒ ደህንነቱ ያልተጠበቀ የፍላሽ ጥያቄ፣ የፍላሽ ጥያቄ ቅጽ እና የጥያቄዎች አጠቃቀምን በራስ-ሰር ያዘጋጃል።

ተግባራዊ የDevSecOps መተግበሪያዎች፡

  1. የማይንቀሳቀሱ ቅኝቶች: ማንኛውንም ይጠቁማል request.args.get() ያለ አይነት=እና የፍላሽ ጥያቄ ቅጽ ጥሪዎች ማረጋገጫ የሌላቸው።
  2. የጥገኝነት ትንተና፦ በተዘዋዋሪ ጥሪዎች ሊታዩ የሚችሉ ደህንነታቸው ያልተጠበቁ ቅጦችን ቤተ-መጽሐፍትን ይቆጣጠራል።
  3. ደህንነታቸው ያልተጠበቁ ውህዶችን ማገድ: CI/CD አዲስ ኮድ አደገኛ ጥያቄዎችን ካስተዋወቀ አይሳካም። ያግኙ ወይም ያልተረጋገጠ የቅጽ መዳረሻ።
  4. መሰረታዊ ማስፈጸሚያ፦ ደህንነታቸው የተጠበቀ ጥሪዎች ወደ ደህንነታቸው ያልተጠበቁ እንዳይሆኑ ለማድረግ የተደረጉ ለውጦችን ይከታተላል።

እነዚህን ቼኮች በራስ-ሰር ማድረግ የሰውን ስህተት የመጋለጥ እድልን ይቀንሳል እና አቅርቦትን ሳያዘገዩ ደህንነትን ቀጣይነት ባለው መልኩ ያቆያል።

ስለዚህ፣ አረጋግጥ፣ አጽዳ፣ አውቶማቲክ አድርግ

ዋናው ነጥብ ይኸውና፡ requests.get፣ flask request እና flask request ፎርም ሁሉም ናቸው። በነባሪነት የማይታመንእርምጃ ካልወሰዱ በስተቀር ተንኮል አዘል መረጃዎችን በደስታ ያደርሳሉ።

ሶስት ህጎችህ፡-

  • ማረጋገጫ ግብዓቶች ቀረጻ እና የነጭ ዝርዝሮችን በመጠቀም።
  • ንጽሕና ውሂቡ ሚስጥራዊ የሆኑ ስራዎችን ከመንካቱ በፊት።
  • ራስ-ሰር ቼኮች በአንተ ውስጥ pipeline ከማሰማራቱ በፊት ደህንነቱ የተጠበቀ ኮድን ለማስቆም።

አንድ ደህንነቱ ያልተጠበቀ የፍላሽ ጥያቄ ተቆጣጣሪ፣ ያልተመረጠ የፍላሽ ጥያቄ ቅጽ መስክ ወይም ያልተጠበቀ የጥያቄዎች ማግኘያ ጥሪ መተግበሪያዎን ሊያበላሽ ይችላል። እያንዳንዱን መለኪያ እንደ ጠላት ሊቆጥሩት ይችላሉ፣ እና የእርስዎን DevSecOps ይፍቀዱለት። pipeline ደንቦቹን በየጊዜው ተግባራዊ ማድረግ።

sca-tools-software-composition-analyse-tools
የሶፍትዌር አደጋዎችዎን ቅድሚያ ይስጡ፣ ያስተካክሉ እና ይጠብቁ
ነፃ መለያ ያግኙ።
ምንም ዱቤ ካርድ አያስፈልግም።

የሶፍትዌርዎን ልማት እና አቅርቦት ደህንነት ይጠብቁ

ከ Xygeni Product Suite ጋር