Contact formulier - captcha kan worden onderschept
Ik heb een contact formulier met een eenvoudige som-captcha (5+6=) waarbij de cijfers random zijn, op basis van mt_rand(). De uitkomst vd som zit ook als verborgen (hidden) veld in hetzelfde formulier, zodat mijn script kan vergelijken of bezoeker de juiste uitkomst heeft ingevuld. Uiteraard heb ik deze waarde gecodeerd erin staan, middels base64_encode(). Werkt prima.
Echter werd ik erop gewezen dat kwaadwillenden dit eenvoudig kunnen omzeilen, door de HTTP request te onderscheppen nadat op verzenden is gedrukt. Deze request bevat (oa) de ingetypte uitkomst én de gecodeerde uitkomst, en als die overeenkomen kan deze kwaadwillende eindeloos formulier inzendingen doen.
Hoe is dit op te lossen? Ik zou ipv een verborgen veld een sessie kunnen starten, maar is er ook een andere (eenvoudige) oplossing?
Groeten, Guido
Veel handiger en je hoeft geen invoervelden te maken die weer onnodig zijn.
Guido
Maar wat houdt je tegen om ReCaptcha te gebruiken?
Wat sessie betreft, ooit gelezen dat je de variabele die je in een cookie zet ook vrij eenvoudig kunt achterhalen?
Guido
Guido - op 14/09/2023 22:01:30:
Wil niet afhankelijk zijn van een derde partij.
Guido
Guido
héél goed :)
Je moet het dan ook niet in koekjes zetten.
$_SESSION['verwachtresultaat'] = $mijnberekening;
volstaat.
meer info https://www.w3schools.com/php/php_sessions.asp
Ikzelf gebruik ook een tekstvraag met een berekening. Niet altijd een optelling.
verder checkbox welke moet en/of niet mag aangevinkt zijn.
Wat betreft de vraag. Je kunt het beste HTTP verkeer versleutelen tot HTTPS, om de 'attack vector' te verkleinen. Test je site met https://internet.nl of het voldoet aan de hedendaagse standaarden.
En sessies zijn de meest voor de hand liggende oplossing. Maak daarbij gebruik van de kennis van OWASP.
Bij voorkeur gebruik ik geen sessies omdat gebruiker sessies kan blokkeren. Maar ik ga ervan uit dat vele websites dan sowieso niet correct functioneren.
Guido
Als je Google's recaptcha niet wilt gebruiken, dan begrijp ik dat. Maar er zit wel een mooi algoritme achter om spammers te weren. Ik wil geen marktetingpraatje houden, maar het aantal spammers was na correct gebruik van ReCatcha met 99% gedaald, en er zit CSRF-beveiliging in zodat requests enkel werken van je site, en niet vanaf een andere sites of bot(net) via bijv. cURL-scripts of Guzzle die een browser na willen doen.
CSRF-beveiliging is hoe je het ook effectief inbouwt altijd een must-have.
Gewijzigd op 15/09/2023 16:56:25 door - Ariën -
Guido - op 14/09/2023 22:31:25:
Wat sessie betreft, ooit gelezen dat je de variabele die je in een cookie zet ook vrij eenvoudig kunt achterhalen?
Je moet cookies dan ook instellen met het 'Secure' attribuut en het 'HttpOnly' attribuut. De eerste zorgt er voor dat een cookie alleen via HTTPS verstuurd wordt en de tweede dat JavaScript er niet bij kan.
Dus ik stel zelf geen bepaalde cookie in. Hoe voeg ik dat secure en httponly dan toe?
Guido
Waarom zou je geen HTTPS gebruiken?
Ja, of ik moet een extra check doen op type verbinding?
Guido
Dwing https af in .htaccess, of gebruik hsts in . htaccess.
Toch bedankt iedereen!
Guido
Guido - op 16/09/2023 15:36:18:
In mijn geval geen secure want er zijn mogelijk gebruikers zonder HTTPS.
Serieus? Het is 2023, HTTPS is de standaard anders word je site zo ongeveer geweigerd door moderne browsers. TLS-certificaten zijn zelfs gratis te krijgen via Let's Encrypt en te automatiseren via ACME.
Gebruikers anno nu zonder HTTPS zijn echte losers. Daar wil je je niet eens mee associëren.
Guido
Juist HTTPS forceren dus.
Guido - op 17/09/2023 16:16:54:
Daar gaat het niet om, de plugin kan door iemand zonder HTTPS geïnstalleerd worden en dat wil je ondersteunen. Daarom niets forceren.
HTTP op intranet zou nog kunnen, maar dat is meestal niet waar je Wordpress voor gebruikt.
Met HTTP kan iedereen alles onderscheppen, je hoeft maar mee te kijken naar het netwerkverkeer via Wireshark of een andere tool.
TLS is gewoon een absolute randvoorwaarde, zonder versleuteling begin je niets tegen onderscheppen door derden.