PDA

Bekijk Volledige Versie : foutmelding bij insertcommando



Peter Das
20/02/19, 15:21
Ik heb een website gemaakt voor een hulpverlenende organisatie.
Een onderdeel van de site betreft een formulier waarbij gegevens met php naar een Mysql database worden weggeschreven.
Het formulier bestaat uit 26 velden waarvan er 9 van het soort textarea zijn.
Het formulier is getest en na goedgekeurd te zijn op de site gezet.
In de praktijk blijkt echter dat bij de textareavelden forse hoeveelheden tekst worden ingegeven.
de gebruikers van de site krijgen nu een syntax error bij de insert. Ik vermoeed dat dat komt door de grootte van de ingevoerde teksten.
De foutmelding is :
You have an error in your SQL syntax; check the manual that corresponds
to your MariaDB server version for the right syntax to use near 's.
','Dit doen wij eind 2020 met een interne- en externe audit.
Verantwoording ' at line 2

Heeft iemand een idee hoe ik hier verder mee kan gaan?

Peter

CT0
20/02/19, 15:40
Als je de query er bij zet dan kunnen we ff kijken wat dr aan schort ;-)

mastermind
20/02/19, 16:37
Als ik de foutmelding zie, denk ik eigenlijk meteen aan invoer die niet geescaped is. Hierdoor dus waarschijnljik ook meteen vatbaar voor SQL injectie.

vDong
22/02/19, 08:35
Doet me een beetje denken aan https://imgs.xkcd.com/comics/exploits_of_a_mom.png

MarkKapitein
22/02/19, 10:15
Ik zal je even een voorbeeld geven zodat wat mastermind ook vermoed is wat er gebeurd.

Stel dat iemand in een textarea een 's meegeeft zoals s'avonds. dan gebeurt het er het volgende zodra jij niet voldoende escaped.

je query even uitgaande van een simpele query met 1 insert
INSERT INTO messages (text1, VALUES('s'avonds was een mooie zonsondergang')

Je ziet nu dat er een enkele ' teveel staat in de query waardoor mysql al bezig is met het afsluiten van de query.

Het beste om dit tegen te gaan is te escapen. Dat kan je doen met een PDO met prepared statements die automatisch voor je escapen of het zelf doen.
mysql_real_escape_string (dat was de oude) mysqli_real_escape_string()

de query gaat dan als volgt je database in:

INSERT INTO messages (text1, VALUES('s\'avonds was een mooie zonsondergang')

Zodra jij dus een select doet dien je wel even de \ weer te verwijderen natuurlijk met een stripslashes() bv