[PHP/MySQL] Database "un-escaped" karakters?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 15:53
Ik heb een registratieformulier in elkaar gebouwd waar ik alle data die ik ophaal met $_POST escape met behulp van mysql_real_escape_string().

Nu is het zo dat als ik een nieuwe user registreer en daarna de username echo, ik hem netjes ge-escaped zie. Als ik echter in de users tabel in PHPMyAdmin kijk zie ik de data niet meer ge-escaped. Ook bij het echo'en van alles wat in deze tabel zit zie ik geen slashes meer.

Data ophalen en escapen doe ik hiermee:

PHP:
1
$username = mysql_real_escape_string($_POST['username']);


Bij het uitvoeren van mijn SQL query om de user aan te maken voer ik ook nog een echo uit van deze username. Bij de user '' ' \n \r 123 zie ik dus als output \'\' \' \\n \\r 123. In de database echter zie ik weer gewoon " ' \n \r 123 en ook als ik dit uitvoer zie ik dat:

PHP:
1
2
3
4
5
6
7
$username = mysql_query("SELECT username FROM Users");

while ($row = mysql_fetch_assoc($username)) {
    echo "<div class=\"username\">";
    echo $row['username'];
    echo "</div>";
}


Weet iemand waarom de backslashes verdwijnen na het inserten van de data? Magic quotes heb ik trouwens uitgeschakeld.

Acties:
  • 0 Henk 'm!

Verwijderd

Bedenk nog eens goed waarom je moet escapen om die string in de database te krijgen. Probeer dat eens aan ons en aan jezelf uit te leggen. Als je het goed weet uit te leggen, zul je ook begrijpen dat het niet nodig is om te unescapen.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:56

Creepy

Tactical Espionage Splatterer

Heb je enig idee wat escapen precies doet en betekent? In dit geval zorgt het ervoor dat je tekens die je normaal gesproken niet in een string kan gebruiken, toch in een string kan gebruiken. De \ gebruik je om mee te escapen en zorgt er dus alleen voor dat je het daarop volgende teken (bijvoorbeeld een ") ook daadwerkelijk in de string komt te staan (in het geheugen) i.p.v. de string af te sluiten. Precies zoals je in het voorbeeld gebruikt. In het geheugen staat die slash niet, maar daadwerkelijk de ". Daarom komt het ook zo in de database terecht en kan je het ook gewoon weer inlezen, bij het inlezen word ook daadwerkelijk de " in het geheugen geplaats en is het escapen van dit soort zaken in je datanase dus niet nodig. Je database un-escaped dus helemaal niet ;)

Bedenk vervolgens dat als je een string waarde mee wilt geven in een querystring er in de querystring zelf ook een begin " en eind " nodig is. Om ervoor te zorgen dat een " in de variabele die je mee wilt geven de querystring niet afsluit heb je dus de mysql_real_escape functie nodig zodat je zeker weet dat de variabele die je in je query gebruikt niet zomaar je query kan aanpassen waar dat niet mag (door de string af te sluiten met een " en vervolgens zelf SQL kan uitvoeren, aka je voorkomt SQL injectie).

[ Voor 33% gewijzigd door Creepy op 07-03-2010 15:51 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 15:53
Ah, dan heb ik het even verkeerd geïnterpreteerd.

Toen ik die code schreef dacht ik dat je karakters moest escapen zodat ze niet als zodanig gezien zou worden, waarna je stripslashes() moest gebruiken om de slashes weer weg te halen. Maar nu realiseer ik me inderdaad dat dat puur is zodat de string niet te vroeg wordt afgesloten :)

Dom dom dom |:(
Thanks iig :)