Παραδείγματα σφαλμάτων: Rust, PHP, TypeScript και Python — DedSec Project
Παραδείγματα σφαλμάτων: Rust, PHP, TypeScript και Python Rust: αποτυχημένη μετατροπή Λανθασμένο παράδειγμα — ΜΗ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ Διορθωμένο παράδειγμα Αιτία σφάλματος και εξήγηση διόρθωσης…
Rust: αποτυχημένη μετατροπή
Λανθασμένο παράδειγμα — ΜΗ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ
let age: i32 = text.parse().unwrap();
Διορθωμένο παράδειγμα
let age: i32 = match text.parse() {
Ok(n) => n,
Err(_) => { eprintln!("invalid number"); return; }
};
Αιτία σφάλματος και εξήγηση διόρθωσης
Απόφυγε panic σε λάθος είσοδο· το παράδειγμα είναι τμήμα της main().
Η μετατροπή είναι επικύρωση, όχι βεβαιότητα
Το unwrap() σε κείμενο χρήστη προκαλεί panic όταν η μετατροπή αποτύχει. Επίστρεψε Result και ξεχώρισε τα λάθη σύνταξης από τους περιορισμούς της εφαρμογής. Ο τύπος u8 απορρίπτει αρνητικούς και τιμές πάνω από 255 πριν τον έλεγχο του επιχειρησιακού κανόνα.
fn parse_age(text: &str) -> Result<u8, String> {
let n: u8 = text.trim().parse()
.map_err(|_| "expected an unsigned integer".to_string())?;
if n > 120 { return Err("age outside accepted range".into()); }
Ok(n)
}
fn main() {
assert_eq!(parse_age("23"), Ok(23));
assert!(parse_age("abc").is_err());
assert!(parse_age("-1").is_err());
assert!(parse_age("121").is_err());
println!("PASS");
}
Αποθήκευσε ως age.rs και εκτέλεσε rustc age.rs -o age && ./age σε σύστημα με Rust. Τα assertions καλύπτουν κανονική είσοδο, γράμματα, αρνητική τιμή και αριθμό που παραβιάζει το επιτρεπτό όριο. Αν δεν έχεις Rust compiler, σημείωσε ότι ο έλεγχος εκτέλεσης εκκρεμεί αντί να δηλώσεις πως πέτυχε.
Ενσωμάτωση: ο caller πρέπει να χειρίζεται Ok(age) και Err(message) με σαφή απόκριση. Το unwrap_or(0) κρύβει λανθασμένη είσοδο εκτός αν το μηδέν είναι όντως έγκυρη εφεδρική τιμή.
PHP: έξοδος HTML
Λανθασμένο παράδειγμα — ΜΗ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ
echo $_GET["name"];
Διορθωμένο παράδειγμα
echo htmlspecialchars($_GET["name"] ?? "", ENT_QUOTES, "UTF-8");
Αιτία σφάλματος και εξήγηση διόρθωσης
Κάνε ασφαλή διαφυγή μη έμπιστου κειμένου πριν το HTML.
Κωδικοποίηση εξόδου ανά περιβάλλον (PHP 8)
Ο browser ερμηνεύει το HTML ως markup και όχι ως απλό κείμενο. Η απευθείας εμφάνιση μη έμπιστων τιμών μπορεί να δημιουργήσει στοιχεία ή attributes. Κάνε escaping στο σημείο εμφάνισης για το συγκεκριμένο περιβάλλον εξόδου.
<?php
function escapeHtml(string $value): string {
return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
$sample = '<strong>& "hello"</strong>';
$expected = '<strong>& "hello"</strong>';
if (escapeHtml($sample) !== $expected) {
throw new RuntimeException('escaping regression');
}
echo escapeHtml($sample), PHP_EOL;
Εκτέλεσε php html_lab.php. Το assertion ελέγχει γωνιακές αγκύλες, ampersand και διπλά εισαγωγικά. Σε web handler επαλήθευσε πρώτα is_string($_GET['name'] ?? ''), επειδή οι παράμετροι μπορεί να είναι arrays· έπειτα χρησιμοποίησε escapeHtml για HTML text ή quoted attribute. Το ENT_QUOTES καλύπτει και τα δύο είδη εισαγωγικών, ενώ το ENT_SUBSTITUTE χειρίζεται μη έγκυρα bytes. Το UTF-8 πρέπει να συμφωνεί με το charset της απόκρισης.
Όριο: το HTML escaping δεν είναι γενικός καθαρισμός δεδομένων. JavaScript strings, URLs, CSS και SQL χρειάζονται διαφορετικό χειρισμό. Για κείμενο στο DOM προτίμησε textContent και για SQL δεσμευμένες παραμέτρους.
TypeScript: παράκαμψη με any
Λανθασμένο παράδειγμα — ΜΗ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ
function double(x: any) { return x * 2; }
Διορθωμένο παράδειγμα
function double(x: number): number { return x * 2; }
Αιτία σφάλματος και εξήγηση διόρθωσης
Διατήρησε ουσιαστικούς τύπους ώστε ο μεταγλωττιστής να εντοπίζει λάθη.
Python: μη ασφαλής διαδρομή
Λανθασμένο παράδειγμα — ΜΗ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ
target = base / user_input
target.write_text("data")
Διορθωμένο παράδειγμα
target = (base / user_input).resolve()
if not target.is_relative_to(base.resolve()):
raise ValueError("outside permitted folder")
target.write_text("data", encoding="utf-8")
Αιτία σφάλματος και εξήγηση διόρθωσης
Έλεγξε ότι διαδρομές χρήστη μένουν εντός επιτρεπτού φακέλου (Python 3.9+).