preg_match i.c.m. mysql_real_escape
Ik wil graag een formulier controleren, in dit geval een achternaam.
Hierin mogen alleen letters,verbindingsstreepje en apostrof voorkomen.
Alles lukt, behalve de apostrof. Deze wordt namelijk door de mysql_real_escape omgezet.
Kan ik de regex zodanig aanpassen dat de mysql_real_escape geen invloed heeft op deze uitwerking?
Hierin mogen alleen letters,verbindingsstreepje en apostrof voorkomen.
Alles lukt, behalve de apostrof. Deze wordt namelijk door de mysql_real_escape omgezet.
Kan ik de regex zodanig aanpassen dat de mysql_real_escape geen invloed heeft op deze uitwerking?
Gewijzigd op 06/12/2010 20:41:09 door Peter van den Dungen
Zonder code is het glazen bol kijken.
Bij deze:
De $achternaam_post is het resultaat van de real_escape...($_POST[achternaam])
Code (php)
1
2
3
4
5
2
3
4
5
<?php
if (!isset($_POST['datum_reg'])){$achternaam_post = "";}
if (!preg_match( '~^[\w\d\' -]+$~', $achternaam_post))
{$achternaam_error = 1;}
?>
if (!isset($_POST['datum_reg'])){$achternaam_post = "";}
if (!preg_match( '~^[\w\d\' -]+$~', $achternaam_post))
{$achternaam_error = 1;}
?>
De $achternaam_post is het resultaat van de real_escape...($_POST[achternaam])
Gewijzigd op 06/12/2010 20:32:54 door Peter van den Dungen
Ik wil nu niet zeggen dat je dom bent of zo.
Maar als ik het goed heb is mysql_real_escape string een beveiliging tegen mysql-injection. Dus bij het invoegen van gegevens in de database. Maar omdat jij ze er hier uit haalt lijkt het me niet nodig de mysql_real_escape functie te gaan gebruiken?
Of heb ik het verkeerd?
Maar als ik het goed heb is mysql_real_escape string een beveiliging tegen mysql-injection. Dus bij het invoegen van gegevens in de database. Maar omdat jij ze er hier uit haalt lijkt het me niet nodig de mysql_real_escape functie te gaan gebruiken?
Of heb ik het verkeerd?
Hoe kom je erbij dat ik iets uit de database haal?
Er vindt een validatie plaats, pas nadat deze is afgerond wordt er naar mijn database geschreven.
De eerste taak is toch het opvangen van mogelijk schadelijke invoer?
Er vindt een validatie plaats, pas nadat deze is afgerond wordt er naar mijn database geschreven.
De eerste taak is toch het opvangen van mogelijk schadelijke invoer?
De code die je geeft is goed te gebruiken. Daarna moet je in je query gewoon mysql_real_escape_string gebruiken over $achternaam_post heen, aangezien er door de toegelaten ' een sql-injectie/error zou kunnen optreden als je dat niet doet.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
if (!isset($_POST['datum_reg'])){$achternaam_post = "";}
if (!preg_match( '~^[\w\d\' -]+$~', $achternaam_post))
{$achternaam_error = 1;}
//....
mysql_query("INSERT INTO iets(achternaam,....) VALUES('".mysql_real_escape_string($achternaam_post)."',....)");
?>
if (!isset($_POST['datum_reg'])){$achternaam_post = "";}
if (!preg_match( '~^[\w\d\' -]+$~', $achternaam_post))
{$achternaam_error = 1;}
//....
mysql_query("INSERT INTO iets(achternaam,....) VALUES('".mysql_real_escape_string($achternaam_post)."',....)");
?>
Gewijzigd op 07/12/2010 10:05:04 door Marco van Oort
Misschien is het uit mijn eerste bericht niet goed overgekomen, maar de real_escape_string is reeds aan het begin toegepast. Dus de $achternaam_post is al de real_escape van $_POST['achternaam'] die ik ontvang. Maar bij de validatie wordt bijvoorbeeld van 't Zand afgekeurd omdat er een apostrof in zit. Als ik de real_escape_string weghaal bij de $_POST dan wordt de achternaam wel goedgekeurd.
Toevoeging op 07/12/2010 11:57:12:
Wat is nu eigenlijk gebruikelijk?
- De $_POST meteen onschadelijk maken met mysql_real_escape en verder werken met de nieuwe string?
- Of werken met de $_POST en pas bij het wegschrijven naar de database de mysql_real_escape toepassen?
Toevoeging op 07/12/2010 11:57:12:
Wat is nu eigenlijk gebruikelijk?
- De $_POST meteen onschadelijk maken met mysql_real_escape en verder werken met de nieuwe string?
- Of werken met de $_POST en pas bij het wegschrijven naar de database de mysql_real_escape toepassen?
Het tweede is in ieder geval het handigst, dus waarschijnlijk ook het meest gebruikelijk. Je moet je indenken, mysql_real_escape_string() zorgt er voor dat een waarde zo aangepast wordt, dat hij veilig te gebruiken is, als waarde, in een sql-query. Als je deze functie voor de verdere verwerking uitvoert, krijg je twee problemen:
- dit probleem, regular expressions worden lastiger
- bewerkingen aan de string kunnen zelf sql-injections/errors opleveren, als je ze niet goed toepast.
Conclusie: mysql_real_escape_string() is de laatste stap voordat een waarde in een query wordt gebruikt. (Op 1 uitzondering na misschien, dat zijn getallen. Daar kun je wellicht beter intval() of (int) voor gebruiken)
- dit probleem, regular expressions worden lastiger
- bewerkingen aan de string kunnen zelf sql-injections/errors opleveren, als je ze niet goed toepast.
Conclusie: mysql_real_escape_string() is de laatste stap voordat een waarde in een query wordt gebruikt. (Op 1 uitzondering na misschien, dat zijn getallen. Daar kun je wellicht beter intval() of (int) voor gebruiken)
Okee bedankt! Ik heb de real_escape_string (als functie) gebruikt bij het plaatsen van de gegevens in de tabel. Nu heb ik inderdaad geen problemen met de apostrof.




