Τι πραγματικά προστατεύει μια φόρμα: CAPTCHA, honeypot, χρονική παγίδα, CSRF
Οι περισσότερες φόρμες επικοινωνίας βασίζονται σε ένα μόνο τέχνασμα κατά του spam, και πολλά από αυτά τα τεχνάσματα σταματούν μόνο τα πιο απλά bots. Τι σταματά κάθε επίπεδο προστασίας, τι κοστίζει και ποιος συνδυασμός έχει νόημα.
Το spam μέσω φορμών επικοινωνίας σπάνια προέρχεται από άνθρωπο που πληκτρολογεί με το χέρι. Συνήθως πρόκειται για λογισμικό που βρίσκει φόρμες, συμπληρώνει κάθε πεδίο και στέλνει το αποτέλεσμα – χιλιάδες φορές. Υπάρχουν διάφορες άμυνες, και λειτουργούν σε πολύ διαφορετικά σημεία. Αν γνωρίζετε τι κάνει πραγματικά η καθεμία, αποφεύγετε δύο λάθη: μια φόρμα χωρίς πραγματική προστασία και μια φόρμα τόσο βαριά φρουρούμενη που οι πραγματικοί άνθρωποι τα παρατούν.
- Honeypot: απλά bots που συμπληρώνουν κάθε πεδίο
- Χρονική παγίδα: scripts που υποβάλλουν αμέσως μετά τη φόρτωση
- CAPTCHA: τον περισσότερο γενικό αυτοματισμό
- Token CSRF: αιτήματα που στέλνονται απευθείας στο endpoint
- Όριο ρυθμού: πλημμύρες από μία πηγή
- Proof-of-work: φθηνές μαζικές υποβολές, χωρίς παρακολούθηση ή γρίφους
- Έλεγχοι στον διακομιστή: ό,τι παρακάμπτει το πρόγραμμα περιήγησης
- Τα στοχευμένα bots το παρακάμπτουν· αν είναι κακώς κρυμμένο, οι αναγνώστες οθόνης το ανακοινώνουν
- Bots που περιμένουν· χωρίς υπογραφή στον διακομιστή πλαστογραφείται εύκολα
- Εμπόδιο για όλους, φραγμοί προσβασιμότητας, συχνά από τρίτους· υπάρχουν υπηρεσίες επίλυσης
- Τα bots που φορτώνουν πρώτα τη σελίδα λαμβάνουν και αυτά έγκυρο token
- Spam κατανεμημένο σε πολλές διευθύνσεις IP
- Ένας αποφασισμένος αποστολέας με υπολογιστική ισχύ· απαιτεί JavaScript
- Τίποτα από μόνοι τους – αλλά χωρίς αυτούς κάθε άλλο επίπεδο είναι διακοσμητικό
Honeypot και χρονική παγίδα: αόρατα φίλτρα
Ένα honeypot είναι ένα επιπλέον πεδίο που οι άνθρωποι δεν βλέπουν ποτέ, όπως ένα πεδίο με όνομα «website» κρυμμένο με CSS. Τα απλά bots συμπληρώνουν κάθε πεδίο, οπότε ένα συμπληρωμένο honeypot υποδηλώνει αυτοματισμό και ο διακομιστής μπορεί να απορρίψει αθόρυβα το μήνυμα. Τα bots που γράφτηκαν ειδικά για τον ιστότοπό σας ή εκείνα που αποδίδουν τη σελίδα όπως ένα πρόγραμμα περιήγησης το παρακάμπτουν. Κρύψτε το σωστά: ένα πεδίο που απλώς μετακινήθηκε εκτός οθόνης μπορεί να ανακοινωθεί από αναγνώστες οθόνης, να προσεγγιστεί με το πλήκτρο Tab ή να συμπληρωθεί από την αυτόματη συμπλήρωση. Χρησιμοποιήστε aria-hidden, tabindex -1 και autocomplete off, καθώς και μια ουδέτερη ετικέτα που ζητά από όποιον καταλήξει εκεί να το αφήσει κενό.
Μια χρονική παγίδα καταγράφει πότε παραδόθηκε η φόρμα και απορρίπτει υποβολές που φτάνουν απίθανα γρήγορα. Οι άνθρωποι χρειάζονται μερικά δευτερόλεπτα για να διαβάσουν και να πληκτρολογήσουν· πολλά scripts στέλνουν μέσα σε κλάσμα του δευτερολέπτου. Η χρονοσφραγίδα πρέπει να ελέγχεται στον διακομιστή και να προστατεύεται από παραποίηση, για παράδειγμα να είναι υπογεγραμμένη ή να διατηρείται στη συνεδρία – ένα απλό κρυφό πεδίο χρόνου απλώς ξαναγράφεται από το bot. Κρατήστε το όριο χαμηλό, αφού η αυτόματη συμπλήρωση κάνει και τους πραγματικούς ανθρώπους γρήγορους. Τα bots που απλώς περιμένουν περνούν: μια χρονική παγίδα είναι φίλτρο, όχι τείχος.
CAPTCHA: αποτελεσματικό, αλλά όχι δωρεάν
Ένα CAPTCHA ζητά απόδειξη ότι δεν δουλεύει κάποιο bot – από γρίφους με εικόνες έως ελέγχους που εκτελούνται στο παρασκήνιο· συνήθεις υπηρεσίες είναι τα reCAPTCHA, hCaptcha, Cloudflare Turnstile και Friendly Captcha. Σταματά τον περισσότερο γενικό αυτοματισμό, γι' αυτό είναι τόσο δημοφιλές. Όμως κάθε ορατός γρίφος είναι ένα εμπόδιο στο οποίο ορισμένοι επισκέπτες τα παρατούν, και οι περισσότερες υπηρεσίες φορτώνουν script τρίτου, κάτι που εγείρει ζητήματα απορρήτου και συγκατάθεσης. Ένα CAPTCHA βοηθά επίσης μόνο αν είναι σωστά ρυθμισμένο: ένα δημόσιο δοκιμαστικό site key, ένα widget χωρίς το script του ή ένα token που ο διακομιστής δεν επαληθεύει ποτέ μοιάζουν με προστασία, αλλά δεν είναι. Ένας δωρεάν έλεγχος στο formexposed.com επισημαίνει τέτοια σφάλματα από έξω.
Η προσβασιμότητα είναι μέρος αυτού του κόστους. Οι γρίφοι με εικόνες αποκλείουν τους τυφλούς και πολλούς ανθρώπους με χαμηλή όραση, οι ηχητικές εναλλακτικές δεν βοηθούν τους τυφλοκωφούς, και οι δύσκολες λογικές ασκήσεις επιβαρύνουν τους ανθρώπους με γνωστικές δυσκολίες. Το κριτήριο επιτυχίας 1.1.1 των WCAG 2.2 απαιτεί εναλλακτικό κείμενο που περιγράφει τον σκοπό του CAPTCHA και εναλλακτικές μορφές για διαφορετικές αισθήσεις. Οι έλεγχοι στο παρασκήνιο αποφεύγουν τα περισσότερα από αυτά, αλλά όταν κάτι τους φανεί ύποπτο, η εναλλακτική είναι συχνά πάλι ένας οπτικός γρίφος – δοκιμάστε αυτή τη διαδρομή με πληκτρολόγιο και αναγνώστη οθόνης.
Token CSRF: προστασία από πλαστογράφηση, όχι από spam
Ένα token CSRF είναι μια τυχαία τιμή που ο διακομιστής τοποθετεί στη φόρμα και περιμένει να του επιστραφεί. Σχεδιάστηκε κατά της πλαστογράφησης αιτημάτων μεταξύ ιστότοπων (cross-site request forgery), όπου ένας άλλος ιστότοπος κάνει το πρόγραμμα περιήγησης ενός επισκέπτη να στείλει ένα αίτημα που ο επισκέπτης δεν σκόπευε ποτέ να στείλει. Σε μια δημόσια φόρμα επικοινωνίας έχει μια παρενέργεια: τα bots που στέλνουν απευθείας στη διεύθυνση της φόρμας χωρίς να φορτώσουν τη σελίδα απορρίπτονται. Κάθε bot που ανακτά τη σελίδα και στέλνει πίσω το token περνά. Τα περισσότερα frameworks και πρόσθετα φορμών περιλαμβάνουν ούτως ή άλλως tokens CSRF – κρατήστε τα ενεργά, αλλά μην τα υπολογίζετε ως προστασία από spam.
Τι πρέπει να γίνεται στον διακομιστή
- Επικυρώστε ξανά κάθε πεδίο στον διακομιστή: υποχρεωτικά πεδία, μήκος, μορφή e-mail και καμία αλλαγή γραμμής σε πεδία που καταλήγουν σε κεφαλίδες αλληλογραφίας.
- Επαληθεύετε τα tokens CAPTCHA και proof-of-work σε κάθε υποβολή, μέσω της υπηρεσίας που τα εκδίδει ή στον δικό σας κώδικα, και απορρίπτετε tokens που επαναχρησιμοποιούνται.
- Περιορίστε τις υποβολές ανά διεύθυνση IP και χρονικό παράθυρο. Αυτό σταματά τις πλημμύρες από μία πηγή· το spam που κατανέμεται σε πολλές διευθύνσεις χρειάζεται άλλα επίπεδα.
- Εξετάστε το proof-of-work: πριν από την αποστολή, το πρόγραμμα περιήγησης λύνει μια μικρή υπολογιστική εργασία. Οι επισκέπτες δεν βλέπουν κανέναν γρίφο και τίποτα δεν παρακολουθείται, αλλά η μαζική υποβολή γίνεται ακριβή.
Ένας λογικός συνδυασμός: δύο ή τρία επίπεδα
- 1Ξεκινήστε με τα αόρατα επίπεδα: ένα προσβάσιμο honeypot και μια υπογεγραμμένη χρονική παγίδα, και τα δύο ελεγχόμενα στον διακομιστή.
- 2Προσθέστε όριο ρυθμού ανά διεύθυνση IP, ώστε μία μόνο πηγή να μην μπορεί να πλημμυρίσει τη φόρμα.
- 3Αν εξακολουθεί να περνά στοχευμένο spam, προσθέστε proof-of-work ή CAPTCHA – κατά προτίμηση ένα χωρίς ορατό γρίφο και με προσβάσιμη εναλλακτική.
- 4Κρατήστε το token CSRF που παρέχει το framework σας – ως μπόνους, όχι ως άμυνα.
- 5Δοκιμάστε το αποτέλεσμα ως επισκέπτης – μόνο με πληκτρολόγιο, με αναγνώστη οθόνης, σε κινητό – και ελέγξτε ότι τα πραγματικά μηνύματα εξακολουθούν να φτάνουν.
Σε πολλούς ιστότοπους, το honeypot, η χρονική παγίδα και το όριο ρυθμού μαζί αφαιρούν ήδη το μεγαλύτερο μέρος του γενικού spam χωρίς κανένα ορατό εμπόδιο· το CAPTCHA είναι η εφεδρεία για όταν αυτό δεν αρκεί. Στο WordPress, το δωρεάν πρόσθετο formexposed συνδυάζει honeypot, έλεγχο χρόνου και proof-of-work χωρίς να χρειάζεται τη Google. Για να δείτε τι δείχνει η φόρμα σας από έξω – ποια επίπεδα υπάρχουν, αν ένα CAPTCHA είναι αποτελεσματικά ρυθμισμένο – ένας δωρεάν έλεγχος στο formexposed.com χρειάζεται μόνο έναν τομέα, χωρίς λογαριασμό. Δεν μπορεί να δει τον κώδικα του διακομιστή σας, οπότε το μέρος του διακομιστή παραμένει δική σας δουλειά.