GammaCyber

כתיבת קוד — שיעור 20

מסדי נתונים

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T2 · בסיסי250 נק'~18 דק'build
ולידציית Schema (סגנון Mongoose)
ממש validate(schema, doc) המחזיר רשימה ממוינת של שגיאות. schema ממפה שדה→{'type':'str'|'int'|'bool', 'required':bool}. עבור כל שדה: שדה חובה חסר → "missing:FIELD"; טיפוס שגוי → "type:FIELD". שדה במסמך שאינו ב-schema → "extra:FIELD" (הגנה מפני mass-assignment). שים לב: True/False אינם int תקין.
דוגמאות
validate(S, {'name':'x','age':5}) → []
validate(S, {'age':5}) → ['missing:name']
validate(S, {'name':'x','role':'admin'}) → ['extra:role']
פתרון-ייחוס ולידציית Schema (סגנון Mongoose) ›
def validate(schema: dict, doc: dict) -> list: errors = []; types = {'str': str, 'int': int, 'bool': bool} for f, rule in schema.items(): if f not in doc: if rule.get('required'): errors.append(f"missing:{f}") else: t = types[rule['type']]; val = doc[f] if t is int and isinstance(val, bool): errors.append(f"type:{f}") elif not isinstance(val, t): errors.append(f"type:{f}") for f in doc: if f not in schema: errors.append(f"extra:{f}") # מונע mass-assignment return sorted(errors)
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני400 נק'~25 דק'build
בניית שאילתה בטוחה (נגד SQL Injection)
ממש build_query(table, filters) המחזיר (sql, params) לשאילתת SELECT מפורמטרת. ערכי המשתמש חייבים להפוך ל-placeholders (?) ולעולם לא לשרשור למחרוזת — כך מונעים SQL injection. עמודות ממוינות לפי א"ב. מזהי טבלה/עמודה (שאי אפשר לפרמטר) חייבים לעבור ולידציה מול ^[A-Za-z_]\w*$; מזהה פסול → זרוק ValueError. ללא פילטרים → "SELECT * FROM table".
דוגמאות
build_query('users', {'id':5}) → ('SELECT * FROM users WHERE id = ?', [5])
build_query('users', {'name':'a','age':2}) → ('SELECT * FROM users WHERE age = ? AND name = ?', [2, 'a'])
פתרון-ייחוס בניית שאילתה בטוחה (נגד SQL Injection) ›
import re def build_query(table: str, filters: dict): ident = re.compile(r'^[A-Za-z_]\w*$') if not ident.match(table): raise ValueError("bad table") # מזהים לא ניתן לפרמטר cols = sorted(filters) for c in cols: if not ident.match(c): raise ValueError("bad column") if not cols: return (f"SELECT * FROM {table}", []) where = " AND ".join(f"{c} = ?" for c in cols) # ערכים = placeholders return (f"SELECT * FROM {table} WHERE {where}", [filters[c] for c in cols])
הפתרון נשמר מקומית אוטומטית.