Input fields beveiligen
Het is beter om gewoon $_POST en $_GET te gebruiken i.p.v. $_REQUEST aangezien waardes overschreven kunnen worden in de $_REQUEST array want dat is $_GET, $_POST en $_COOKIE in één. Ook wil je het liefts precies weten waar je data vandaan komt. Verder maak je de kans op CSRF ontzettend groot maakt.
Zoals je gemerkt hebt kun je de gebruiker nooit vertrouwen. Daarom kan je dus ook niet zomaar die data in een query stoppen. Het enige probleem voor de database is karakters zoals ' en " en nog wat onzin. Daar heb jij blijkbaar nu geen probleem mee. Het enige wat jij hoeft te doen om te zorgen dat er geen probleem met de database ontstaat is door gebruik te maken van mysql_real_escape_string, of prepared statements wat je bijvoorbeeld met pdo kan of gewoon simpel te typecasten (language.types.type-juggling) naar int, double, foat o.id. als het maar geen string is.
Jou problemen ontstaan als je de data van de gebruiker weer terug wilt laten zien aan een gebruiker. Html maakt een database niks uit. Dat zal hem een worst wezen. Daarom gaan we nu pas wat aan deze problemen doen. Ze komen nu pas bovendrijven, dus eerder proberen te verhelpen is ook onzin. Bovendien heeft het te maken met een specifieke implementatie. Want als we geen browser gebruiken, maar een console interface gebruiken, dan komen de problemen niet.
Het enige wat we hoeven te doen is een keuze te maken wat er met de data gaat gebeuren. Gaan we strip_tags doen en alle html weghalen. Of gaan we htmlentities doen zodat alles netjes op het scherm komt. Of gaan we een combinatie doen.
Zo simpel is het. Dit is alles. (Maar jammer genoeg is dit soms al te veel gevraagd, kijk maar naar blytes.)
Ik gebruik nu POSTS ipv Requests, wat bedoel je precies met "Ook wil je het liefts precies weten waar je data vandaan komt."?
mysql_real_escape_string wou ik gaan gebruiken wanneer alles goed gekeurd is, dus voordat het in de database wordt geplaatst. Ik gebruik nu strip_tags EN htmlentities maar ik zie zelf niet echt verschil.
Maar wat ik nou wil, is dat wanneer iemand een lees-/specialeteken invult er een error komt.
Nu komt in mijn database wel bv netjes "hoi" maar ik wil dat wanneer er zo'n teken gebruikt wordt, hij een waarschuwing geeft, dus ik wil voorkomen dat zulke tags niet eens de query bereiken :).
Wel heel bedankt voor de informatie! Is echt handig om te weten!
Gewijzigd op 25/01/2011 16:56:19 door Jay ---
Waarom wil je de melding geven dat er een bepaald teken in de tekst staat? Dat boeit de gebruiker toch totaal niet.
Je hoeft in principe alleen maar htmlentities te doen als je de data UIT de database haalt.
Het verschil is dat htmlentities alle mogelijke karakters omzet naar html karakters. strip_tags haalt alleen de VOLLEDIGE tags weg. Dat betekend dus dat als er iets als "> staat, dat dat niet goed wordt omgezet met strip_tags. Staat op php.net uitgelegd.
Eigenlijk gaat deze vraag niet over de database, maar over het valideren van een formulier.
Nu, wat moet er eigenlijk precies gebeuren?
Wat wil je dat er gebeurt wanneer een gebruiker iets invult wat je niet aanstaat?
Het formulier moet dan opnieuw getoond worden.
De gegevens die correct waren, moeten terug ingevuld worden.
Als er iets fout was, moet dat veld niet meer worden ingevuld, maar moet je ergens een berichtje krijgen.
Is dit wat je wil?
(Als dat lukt, kunnen we zien om ook te regelen dat bijvoorbeeld de submit knop wordt geblokkeerd totdat alles goed is ingevuld.)
Ik wil dat gewoon een naam in de database wordt opgeslagen, geen leestekens, geen cijfers, gewoon letters :)
"Waarom wil je de melding geven dat er een bepaald teken in de tekst staat? Dat boeit de gebruiker toch totaal niet."
Nee het is niet dat de gebruiker de tekens moet zien maar, de gebruiker moet zien dat er geen tekens zijn toegestaan wanneer hij dat wel invult.
@Kris
Nou mijn hoofdvraag was eigenlijk hoe ik het beste een input kon beveiligen.
"Ook wil ik dat wanneer er op de submit knop gedrukt is, hij controleert of het alleen uit letters bestaat."
Ik noemde het wel maar had het niet zo uitgebreid uitgelegd.
En ja klopt, het gaat meer over het valideren van een formulier ja.
Kris Peeters op 25/01/2011 17:17:03:
Het formulier moet dan opnieuw getoond worden.
De gegevens die correct waren, moeten terug ingevuld worden.
Als er iets fout was, moet dat veld niet meer worden ingevuld, maar moet je ergens een berichtje krijgen.
Is dit wat je wil?
(Als dat lukt, kunnen we zien om ook te regelen dat bijvoorbeeld de submit knop wordt geblokkeerd totdat alles goed is ingevuld.)
De gegevens die correct waren, moeten terug ingevuld worden.
Als er iets fout was, moet dat veld niet meer worden ingevuld, maar moet je ergens een berichtje krijgen.
Is dit wat je wil?
(Als dat lukt, kunnen we zien om ook te regelen dat bijvoorbeeld de submit knop wordt geblokkeerd totdat alles goed is ingevuld.)
Dat is precies wat ik wil ja! :)
Gewijzigd op 25/01/2011 20:54:32 door Jay ---