DedSec Project

Αρχεία και διαδρομές — DedSec Project

Αρχεία και διαδρομές Υπολόγισε τις διαδρομές από γνωστή βάση, όχι από τον τυχαίο τρέχοντα φάκελο. Μην αντικαθιστάς προσωπικά αρχεία. Για αποθήκευση, χρησιμοποίησε προσωρινό αρχείο και…

Υπολόγισε τις διαδρομές από γνωστή βάση, όχι από τον τυχαίο τρέχοντα φάκελο. Μην αντικαθιστάς προσωπικά αρχεία. Για αποθήκευση, χρησιμοποίησε προσωρινό αρχείο και αντικατάσταση μετά από επιτυχία.

Λυμένο παράδειγμα

from pathlib import Path
p = Path("notes.txt")
if not p.exists():
    p.write_text("first note\n", encoding="utf-8")
print(p.read_text(encoding="utf-8"))

Άσκηση

Άλλαξε το παράδειγμα ώστε να προσθέτει νέα γραμμή χωρίς διαγραφή.

Λύση / υπόδειξη

Άνοιξε με mode="a" και encoding="utf-8".

Το path εξαρτάται από το περιβάλλον

Το Path("data.json") είναι σχετικό με το τρέχον working directory, όχι αυτόματα με τη θέση του script. Για bundled δεδομένα προτίμησε Path(__file__).resolve().parent / "data.json". Για εγγράψιμα αρχεία διάλεξε συγκεκριμένο φάκελο χρήστη. Μην τοποθετείς μυστικά στο source tree.

from pathlib import Path
root=Path(__file__).resolve().parent
candidate=(root/"fixtures"/"sample.txt").resolve()
if not candidate.is_relative_to(root):
    raise ValueError("outside workspace")

Η σύγκριση paths δεν λύνει όλες τις symlink races· είναι αρχικός έλεγχος, όχι ολοκληρωμένο sandbox. Το κοινόχρηστο Android storage ίσως δεν επιτρέπει εκτέλεση. Φύλασσε scripts στο private $HOME του Termux και χρησιμοποίησε το ~/storage για μεταφορά.

Άσκηση: εκτέλεσε το ίδιο script από δύο working directories και απόδειξε ότι ανοίγει το ίδιο bundled αρχείο.

Όρια filesystem σε προσωρινό χώρο

from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
    target = Path(directory) / "δοκιμή.txt"
    target.write_text("line\n", encoding="utf-8")
    assert target.read_text(encoding="utf-8") == "line\n"
    assert target.is_file()

Κράτησε κάθε δοκιμή σε προσωρινό κατάλογο. Σύγκρινε ανάγνωση ανύπαρκτου αρχείου με read_text επάνω σε κατάλογο: οι αστοχίες δεν είναι ίδιες. Για σχετικές διαδρομές από μη έμπιστη είσοδο, κάνε resolve κάτω από επιτρεπόμενη ρίζα και έλεγξε με Path.is_relative_to. Αν symlink μπορεί να αλλάξει ανάμεσα στον έλεγχο και στο άνοιγμα, υπάρχει race condition. Ως δεύτερη άσκηση γράψε προσωρινό αρχείο στον ίδιο κατάλογο και χρησιμοποίησε replace. Εξήγησε γιατί το atomic rename από μόνο του δεν εγγυάται ανθεκτικότητα σε διακοπή ρεύματος. Πηγή: https://docs.python.org/3/library/pathlib.html