GammaCyber

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

File I/O ב-C

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

T3 · בינוני400 נק'~25 דק'algorithmic
מניעת Path Traversal
ממש safe_resolve(base, user_path) שמאחד base עם נתיב שסיפק משתמש, מנרמל אותו (מטפל ב-'..' ו-'.'), ומחזיר את הנתיב המנורמל *רק אם* הוא נשאר בתוך base. ניסיון מילוט (../../etc/passwd או נתיב מוחלט) → None. זו הגנת ה-Path Traversal הקלאסית.
דוגמאות
safe_resolve('/srv/www', 'index.html') → '/srv/www/index.html'
safe_resolve('/srv/www', '../../etc/passwd') → None
פתרון-ייחוס מניעת Path Traversal ›
import posixpath def safe_resolve(base: str, user_path: str): base = posixpath.normpath(base) full = posixpath.normpath(posixpath.join(base, user_path)) # מנרמל '..' ו-'.' if full == base or full.startswith(base + '/'): return full return None # ניסיון מילוט
הפתרון נשמר מקומית אוטומטית.
T2 · בסיסי200 נק'~12 דק'algorithmic
חישוב מיקום fseek
ממש resolve_seek(size, ops) המדמה סדרת fseek. המיקום מתחיל ב-0. כל op הוא (whence, offset): 'SET' מוחלט מתחילת הקובץ, 'CUR' יחסי למיקום הנוכחי, 'END' יחסי לסוף (size+offset). החזר את המיקום הסופי.
דוגמאות
resolve_seek(100, [('SET',10),('CUR',5),('END',-1)]) → 99
resolve_seek(100, [('END',0)]) → 100
פתרון-ייחוס חישוב מיקום fseek ›
def resolve_seek(size: int, ops: list) -> int: pos = 0 for whence, off in ops: if whence == 'SET': pos = off # מתחילת הקובץ elif whence == 'CUR': pos += off # יחסית למיקום elif whence == 'END': pos = size + off # מסוף הקובץ return pos
הפתרון נשמר מקומית אוטומטית.