Door SirDiceNooit enige input vertrouwen die een client (browser) naar de server stuurt. Alles, maar dan ook alles, controleren op geldigheid en conformiteit aan de server kant.
Niet filteren op wat je niet wilt hebben maar filter op wat je wel accepteert en verwijder de rest.
Daarbij niet vergeten om ook Cross Site Request Forgery aanvallen te voorkomen die gebruikt kunnen worden om (distributed) brute force aanvallen uit te voeren:
- genereer een lange random ID die gecheckt wordt bij het verwerken van de formulier info
- gebruikt POST i.p.v. GET, zodat er geen links van kunnen rondslingeren op het Internet
- controleer de http referer (is niet full proof, maar nietsvermoedende slachtoffers kunnen niet bijdragen aan een brute force aanval)
Geen validatie aan de client kant uitvoeren:
- niet vertrouwen op hidden input velden
- niet vertrouwen op de maximale lengte van input velden
- geen berekeningen door de client laten uitvoeren
Geen zelfgefabriceerde hash / encryptie algoritmen gebruiken.
Indien het een niet-publiekelijk systeem betreft en je hebt genoeg rekenkracht en opslag, zou je misschien woordenboeken kunnen gebruiken om woorden te verbieden. Er zijn genoeg woordenboeken op Internet te vinden.
Zet de webserver in een DMZ en je authenticatie server (bijvoorbeeld RADIUS) in een ander segment.
Test: [url=http://security.zarco.nl]security.zarco.nl[/url]