Μια δημόσια φόρμα που δεν μιλά ποτέ με το ιδιωτικό δίκτυο παράγει παρ' όλα αυτά δεδομένα τα οποία το ιδιωτικό δίκτυο πρέπει να κρίνει. Η σήραγγα αλλάζει μόνο ποιος καλεί ποιον. Ό,τι ακολουθεί τη λήψη είναι απόφαση εισαγωγής και ανήκει στην ιδιωτική πλευρά. Αυτή η περιήγηση ακολουθεί μία υποβολή από το πρόγραμμα περιήγησης έως μια κατοχυρωμένη εσωτερική εγγραφή.

Ξεκινήστε εκεί όπου προσγειώνεται η υποβολή

Το πρόγραμμα περιήγησης δημοσιεύει σε ένα δημόσιο τελικό σημείο, το οποίο γράφει μια γραμμή σε ένα ελεγχόμενο αποθετήριο υποδοχής και δεν επιστρέφει τίποτε περισσότερο από μια επιβεβαίωση. Αυτό το αποθετήριο είναι το σημείο παράδοσης και θα πρέπει να είναι το μόνο όπου μπορεί να γράψει το δημόσιο επίπεδο. Κρατήστε εκεί το ακατέργαστο φορτίο αμετάβλητο, μαζί με τον χρόνο άφιξής του και ένα σταθερό αναγνωριστικό εγγραφής.

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

curl --silent --fail \
  --cert /etc/importer/client.crt --key /etc/importer/client.key \
  "https://intake.corp.internal/api/pending?limit=20" \
  -o /var/lib/importer/pending.json

Δώστε στον εισαγωγέα μόνο την εξουσία που χρειάζεται

Η δημόσια διεργασία ιστού και η ταυτότητα που γράφει στην εσωτερική εφαρμογή θα πρέπει να είναι δύο διαφορετικοί υποκείμενοι. Ένας δημόσιος διακομιστής δεν χρειάζεται εσωτερική διαχείριση μόνο και μόνο επειδή πρέπει να παραδώσει δεδομένα φόρμας, και ένας κοινός λογαριασμός για τις δύο πλευρές μετατρέπει οποιοδήποτε σφάλμα ιστού σε εσωτερική εγγραφή. Χορηγήστε στον εργάτη δικά του διαπιστευτήρια, περιορίστε τα στη μία λειτουργία εισαγωγής και καταγράψτε ποιος υποκείμενος εκτέλεσε κάθε εισαγωγή. Αυτός ο διαχωρισμός κάνει το όριο της σήραγγας ουσιαστικό και όχι διακοσμητικό.

Περιορίστε επίσης από ποια πηγή επιτρέπεται να διαβάζει ο εργάτης. Αν η υλοποίηση χρησιμοποιεί ουρά ή υπηρεσία μεταφοράς, η υπηρεσία αυτή διατηρεί τη δική της ταυτοποίηση και πολιτική πρόσβασης, επειδή το VPN δεν ταυτοποιεί τίποτε μέσα στο φορτίο.

Μια βραχύβια συνάρτηση δεν εξαιρείται από την ίδια εξέταση. Όσο εκτελείται, η θέση της στο δίκτυο και τα διαπιστευτήριά της εξακολουθούν να παρέχουν εξουσία, και μια συντομότερη διάρκεια ζωής απλώς στενεύει το παράθυρο. Η διάρκεια ζωής δεν υποκαθιστά την απόφαση για το ποιες λειτουργίες μπορεί να εκτελέσει η ταυτότητα.

Επικυρώστε πριν αλλάξει οτιδήποτε εσωτερικό

Τα πεδία των δημόσιων φορμών είναι κείμενο που ελέγχεται από τον επιτιθέμενο μέχρι να αποδειχθεί το αντίθετο, και οι οδηγίες του OWASP για την επικύρωση εισόδου κατατάσσουν τις ροές backend στις μη αξιόπιστες πηγές ακριβώς για αυτόν τον λόγο. Μια κρυπτογραφημένη μεταφορά λέει ότι τα byte έφτασαν άθικτα, όχι ότι περιγράφουν ένα επιτρεπτό αίτημα. Αναλύστε και επικυρώστε πριν από κάθε προνομιακό βήμα, ώστε μια κακή γραμμή να μη φτάσει ποτέ σε διαδρομή κώδικα που μπορεί να δράσει.

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

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

Κάντε ένα σημείο επανάληψης σε μία λειτουργία

Αν η εγγραφή submission-1042 αντληθεί δύο φορές επειδή χάθηκε η πρώτη επιβεβαίωση, ο εργάτης χρειάζεται έναν διαρκή τρόπο να αναγνωρίζει την εγγραφή πηγής και το κατοχυρωμένο αποτέλεσμά της. Ένα χρονοδιάγραμμα που εκτελεί την εργασία μία φορά δεν αποδεικνύει ότι κάθε γραμμή εφαρμόστηκε μία φορά. Η διπλή παράδοση είναι φυσιολογική, οπότε ο σχεδιασμός πρέπει να την απορροφά.

Χρησιμοποιήστε τον δικό του μηχανισμό συναλλαγών και χειρισμού διπλοτύπων της εσωτερικής εφαρμογής και κρατήστε το αναγνωριστικό πηγής, το αποτέλεσμα και την επιβεβαίωση σε μία συνεκτική ακολουθία. Επιβεβαιώστε μόνο αφού η επιδιωκόμενη λειτουργία κατοχυρωθεί ή ανατεθεί διαρκώς, και μη διαγράφετε ποτέ τη γραμμή υποδοχής μόνο επειδή έγινε λήψη των byte.

Έπειτα αποδείξτε το με τρία αρχεία δοκιμής· μια έγκυρη γραμμή, μια παραμορφωμένη γραμμή και το ίδιο ελεγχόμενο αναγνωριστικό πηγής παραδομένο δύο φορές. Κάθε ένα περνά από το ίδιο τελικό σημείο που χρησιμοποιεί ο εργάτης.

for f in fixtures/valid-submission.json fixtures/bad-date.json; do
  curl --silent --fail --cert /etc/importer/client.crt \
    -X POST --data @"$f" https://intake.corp.internal/api/records
done
curl --silent --fail --cert /etc/importer/client.crt \
  -X POST --data @fixtures/valid-submission.json https://intake.corp.internal/api/records

Οι δύο πρώτες γραμμές πρέπει να καταλήξουν σε διαφορετικές εσωτερικές καταστάσεις, και η τρίτη πρέπει να επιστρέψει το αναγνωριστικό που έχει ήδη κατοχυρωθεί για εκείνη την εγγραφή πηγής αντί να δημιουργήσει δεύτερο. Οτιδήποτε άλλο σημαίνει ότι η εισαγωγή δεν είναι ακόμη επαναλήψιμη.

Σχετικά άρθρα