DedSec Project

Γλωσσάρι: injection, interfaces και interpreters — DedSec Project

Γλωσσάρι: injection, interfaces και interpreters Injection Σημασία και περιορισμοί Injection υπάρχει όταν μη έμπιστα δεδομένα ερμηνεύονται ως εντολές ή σύνταξη αντί να παραμένουν data. SQL…

Injection

Σημασία και περιορισμοί

Injection υπάρχει όταν μη έμπιστα δεδομένα ερμηνεύονται ως εντολές ή σύνταξη αντί να παραμένουν data. SQL concatenation, shell execution και HTML interpolation έχουν διαφορετικά trust boundaries. Το escaping ενός context δεν προστατεύει άλλο.

Πρακτικό παράδειγμα

import sqlite3
c = sqlite3.connect(':memory:')
c.execute('CREATE TABLE users(name TEXT)')
c.execute('INSERT INTO users VALUES (?)', ('Ada',))
assert c.execute('SELECT * FROM users WHERE name=?', ("' OR 1=1 --",)).fetchall() == []
c.close()

Άσκηση και παγίδα

Σύγκρινε bound SQL parameters με string concatenation μόνο σε προσωρινή τοπική DB. Εξήγησε γιατί τα SQL identifiers χρειάζονται allowlist και τα subprocess args arrays με shell=False.

Επιπλέον πηγή: https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html

Interface

Σημασία και περιορισμοί

Interface περιγράφει πράξεις που μπορεί να καλέσει κάποιος χωρίς να γνωρίζει implementation. Το σωστό contract περιέχει εισόδους, αποτελέσματα, errors και side effects. Δύο implementations με ίδια ονόματα μεθόδων δεν είναι απαραίτητα συμβατές.

Πρακτικό παράδειγμα

from typing import Protocol
class Store(Protocol):
    def get(self, key: str) -> str | None: ...
class MemoryStore:
    def __init__(self): self.data = {'x':'ok'}
    def get(self, key): return self.data.get(key)
assert MemoryStore().get('x') == 'ok'

Άσκηση και παγίδα

Φτιάξε δεύτερο Store που διαβάζει προσωρινό αρχείο και έλεγξε ίδια συμπεριφορά για missing keys. Τα Protocol annotations δεν προσφέρουν πλήρη runtime validation.

Επιπλέον πηγή: https://docs.python.org/3/library/typing.html#typing.Protocol

Interpreter

Σημασία και περιορισμοί

Interpreter εκτελεί πρόγραμμα ή ενδιάμεση αναπαράσταση, συχνά αξιολογώντας εντολές κατά την εκτέλεση. Η CPython πρώτα μετατρέπει source σε bytecode· το 'interpreted' δεν σημαίνει ότι δεν υπάρχει compile phase.

Πρακτικό παράδειγμα

import dis
def add(a, b): return a + b
assert add(2,3) == 5
dis.dis(add)  # shows bytecode for the current interpreter

Άσκηση και παγίδα

Σύγκρινε python -m py_compile example.py με εκτέλεση script. Syntax compile μπορεί να περάσει ενώ runtime branch έχει division by zero. Το bytecode/dis output διαφέρει ανά Python version.

Επιπλέον πηγή: https://docs.python.org/3/library/dis.html

Invariant

Έννοια και όρια

Ιδιότητα που διατηρείται μετά από κάθε επιτρεπτή πράξη. Αν μία χρέωση επιτρέπεται μόνο με επαρκές υπόλοιπο, το balance >= 0 παραμένει αληθές. Δεν αρκεί ένας αρχικός έλεγχος.

Πρακτικό δείγμα

def debit(balance, amount):
    if not 0 <= amount <= balance: raise ValueError('bad debit')
    return balance-amount
assert debit(10,3)==7

Οδηγούμενη διερεύνηση

Δοκίμασε χρέωση 0, 10 και 11 από υπόλοιπο 10. Απόδειξε ότι κάθε έγκυρη πράξη διατηρεί μη αρνητικό αποτέλεσμα και ότι η άκυρη απορρίπτεται.

Πρακτική απόδειξη του invariant

Στα prefix sums πριν την επανάληψη i το total είναι το άθροισμα των προηγούμενων τιμών. Αρχικά μηδέν, διατηρείται με πρόσθεση και στον τερματισμό έχουμε συμπεριλάβει όλες τις τιμές.

def prefix(items):
    total, result = 0, []
    for i, value in enumerate(items):
        assert total == sum(items[:i])
        total += value
        result.append(total)
    return result
assert prefix([2,-1,4]) == [2,1,5]
assert prefix([]) == []

Βάλε το assert μετά την ενημέρωση και παρατήρησε το σφάλμα. Τα Python assertions μπορεί να απενεργοποιηθούν σε optimized execution· δεν υποκαθιστούν validation.