DedSec Project

Validation — DedSec Project

Επικύρωση — έλεγχοι σε κάθε σημείο εισόδου Διαφορά ανάλυσης και επικύρωσης Η ανάλυση κειμένου απαντά αν μπορεί να μετατραπεί μία είσοδος σε τιμή. Η επικύρωση ελέγχει αν αυτή η τιμή…

Επικύρωση — έλεγχοι σε κάθε σημείο εισόδου

Διαφορά ανάλυσης και επικύρωσης

Η ανάλυση κειμένου απαντά αν μπορεί να μετατραπεί μία είσοδος σε τιμή. Η επικύρωση ελέγχει αν αυτή η τιμή επιτρέπεται σε συγκεκριμένη λειτουργία. Μία θύρα δικτύου πρέπει να είναι ακέραιος από 1 έως 65535, αλλά η εσωτερική συνάρτηση δεν πρέπει να δέχεται αυτόματα boolean, string ή float. Στο περιβάλλον εντολών μπορούμε να ορίσουμε ξεχωριστό κανόνα για δεκαδικό κείμενο ASCII χωρίς αρχικά μηδενικά και να το μετατρέπουμε σε ελεγμένο ακέραιο.

Εκτελέσιμο εργαστήριο Python 3

Αποθήκευσε ως validate_lab.py και εκτέλεσε python3 validate_lab.py. Ο αναλυτής περιορίζει το κείμενο σε ASCII 0–9 αντί να βασίζεται στην str.isdigit, η οποία αναγνωρίζει και ορισμένα μη λατινικά ψηφία. Τόσο η εσωτερική συνάρτηση όσο και το όριο εξωτερικής εισόδου διαθέτουν ανεξάρτητες δοκιμές απόρριψης.

import re

def validate_port(value):
    if type(value) is not int or not 1 <= value <= 65535:
        raise ValueError('port must be integer 1..65535')
    return value

def parse_cli_port(raw):
    if not isinstance(raw, str) or not re.fullmatch(r'[1-9][0-9]{0,4}', raw):
        raise ValueError('ASCII decimal port with no leading zero required')
    return validate_port(int(raw))

assert validate_port(443) == 443
assert parse_cli_port('443') == 443
assert parse_cli_port('65535') == 65535
for wrong in (0, 65536, '443', True, 3.14):
    try: validate_port(wrong)
    except ValueError: pass
    else: raise AssertionError(f'invalid core value accepted: {wrong!r}')
for wrong in ('0', '65536', '0443', '+443', '-1', '٤٤٣', '443 ', '', None):
    try: parse_cli_port(wrong)
    except ValueError: pass
    else: raise AssertionError(f'invalid CLI text accepted: {wrong!r}')
print('PASS validation: internal type, untrusted ASCII CLI, bounds')

Γιατί χωρίζουμε τους κανόνες

Η validate_port δέχεται ακέραιες τιμές, αλλά απορρίπτει το True: στην Python η bool κληρονομεί από int, παρότι το True δεν είναι ουσιαστικά αριθμός θύρας. Η parse_cli_port εφαρμόζει πρώτα κανόνα χαρακτήρων, οπότε τα '+443', '0443', κενά και αραβοϊνδικά ψηφία δεν περνούν. Στη συνέχεια μετατρέπει σε ακέραιο και αναθέτει τον έλεγχο ορίων στον κοινό validator. Μία δήλωση τύπου δεν αρκεί για αυτόν τον έλεγχο κατά την εκτέλεση. Η απόφαση για Unicode ψηφία, αρχικά μηδενικά ή πρόσημα πρέπει να είναι συνειδητή, ειδικά σε διεθνοποιημένες εφαρμογές.

Διερευνήσεις

  1. Εξήγησε γιατί η θύρα 0 μπορεί να ζητά αυτόματη επιλογή ελεύθερης θύρας σε ορισμένα API, αλλά δεν αποτελεί συνηθισμένη θύρα προορισμού.
  2. Σύγκρινε raw.isdigit με το συγκεκριμένο ASCII pattern χρησιμοποιώντας '٤٤٣'. Κατάγραψε πώς θα άλλαζε ο σχεδιασμός για διεθνή είσοδο.
  3. Δοκίμασε 65535 έναντι 65536, True έναντι 1 και '0443' έναντι '443' και εξήγησε τα διαφορετικά αποτελέσματα.
  4. Πρόσθεσε JSON boundary και φρόντισε να χρησιμοποιεί τον ίδιο εσωτερικό έλεγχο αντί να ορίζει ξανά διαφορετικά όρια.

Παραδοτέα: PASS, πέντε απορριπτέες εσωτερικές τιμές, εννέα άκυρα κείμενα και σαφής πολιτική εισόδου.