Door
Marco Eilander
op 29-09-2014 20:40
gewijzigd op 29-09-2014 20:53
3.672 views
Hallo,
ik heb de volgende php error, maar weet niet hoe ik het kan oplossen.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 'passwoord1'), (''' at line 1
Update ik weet inmiddels hoe het komt.
Mijn registratie pagina bugt, en krijg het niet in orde. Iemand had zich geregistreerd onder de naam : "Pietje Puk', 'passwoord1'), ('"
Helaas krijg ik het niet voor elkaar om ook gedeeltes te detecteren in gebruikersnamen.
Het is mij momenteel alleen gelukt om gebruikersnamen te detecteren die zich "(" of "?" noemen, maar niet "(&'karel?"
Als iemand mij daar bij kan helpen, zal erg fijn zijn.
Dit is wat ik momenteel gebruik:
//kijken of de gebruikersnaam is toegestaan
$badnames = array("bitch", "fuck", "cancer", ".net", ".nl", ".be", ".com", ".nu", ".tv", ".de", ".jp", ".ru", ".", "-", "_", "@", "?", "!","http","/","`","'",")","(","$","%","&");
if (in_array($gebruiker, $badnames)) {
$fm = 1;
$melding = 'This username is not allowed.';
}
if (preg_match('/'.$badnames.'/',$gebruiker)){
$fm = 1;
$melding = 'This username is not allowed.';
}
Bedankt Ivo P, al heeft het niks met mijn "huidige" probleem te maken.
Het gaat mij nu puur om de symbolen in gebruikersnamen, dat die niet meer gebruikt kunnen worden.
Bijvoorbeeld dit : Pietje Puk', 'passwoord1'), ('
maar mijn huidige symbolen check, werkt alleen als de volledige gebruikersnaam een ( of een ' is.
Betreft de registratie datum, daar valt niks van de filteren, ik gebruik het alleen op profielen, zodat iedereen kan zien, wanneer hij/zij zich had aangemeld.
Bedankt Ivo P, al heeft het niks met mijn "huidige" probleem te maken.
Het gaat mij nu puur om de symbolen in gebruikersnamen, dat die niet meer gebruikt kunnen worden.
Daar heeft het dus juist WEL mee te maken: escapen is het zorgen dat karakters of teksten die niet gebruikt kunnen worden, toch kunnen worden ingevoerd.
Het voorbeeld dat je geeft, heeft problemen omdat er een ' in de tekst staat.
Dat kan gaan om een vervelende user, maar ook om een naam waarin gewoon zo'n apostrof staat (Jeanne d'Arc) of het woord "foto's".
In een query voor de database Mysql escape je door voor een ' en \ te plaatsen.
En omdat het simpele Addslashes() van php daarin niet volledig goed functioneert, is er de functie mysqli_real_escape_string() (en wat verwante versies).
Andere databases, zoals Oracle hebben een andere escape methode
INSERT INTO ....VALUES ('foto''s')
zou het dan zijn.
Een teken dat het slecht doet op beeldschermen is <
Daarom maak je daarvan: < met htmlspecialchars().
Om gereserveerde woorden te kunnen gebruiken als kolomnaam kun je in Mysql `` gebruiken.
INSERT INTO `tabelnaam met spaties` (`column`, `is`, `not`, `allowed`) ....
Maargoed:
jouw probleem is simpel terug te brengen tot: gebruik een mysql-escape routine om die ' onschadelijk te maken.
----
over je datum:
je zegt nu dat je er niets mee gaat doen, maar ook niet:
"deze persoon is nu al 5 jaar lid van de site"
"nieuwe aanmeldingen deze week"
Omdat je dat met een stukje tekst toch niet op kunt vangen in een query, zou ik toch maar een kolom van het type Date of datetime gebruiken
?
Onbekende gebruiker
30-09-2014 15:26
- Aar - op 29/09/2014 23:23:43
Persoonlijk vind ik backticks zwaar overbodig...
Persoonlijk is geen verboden iets. Alles UI programma's samen met PHPmyadmin gebruiken backticks.
Niets mis mee toch?
behalve dan dat je grappen krijgt als tabelnamen met spaties, kolommen met verboden woorden.
SELECT `delete`, `from tabel2` FROM tabel2
krijgt een heel andere betekenis als je een keer de `` achterwege laat.
Er zijn duizende mogelijke kolom- en tabelnamen te verzinnen, en middels `` wil jij graag net die 50 verbode woorden in kunnen zetten (of die paar verboden tekens als % of spatie etc?
?
Onbekende gebruiker
30-09-2014 15:31
Dus als ik het goed begrijp? Beter zonder als met backticks? of juist andersom
<?php
mysql_query("INSERT INTO players(player_name,wachtwoord,join_date) VALUES('".mysql_real_escape_string($gebruiker)."','".mysql_real_escape_string(md5($ww))."','".mysql_real_escape_string($datum)."')");
?>
maar bestaat er niets simpels, als een array met niet toegestaande symbolen, die controleerd of het in de gebruikersnaam voorkomt? Stel dat het er wel in voorkomt, dat je dan een foutmelding krijgt, en dus niet kan registeren.
Wil je dan ook verbieden dan iemand in zijn tekst een ' gebruikt?
mysql_real_escape_string() voldoet om die ' onschadelijk te maken. Daarmee moet het voor jou klaar zijn.
PS:
md5() levert een string op die bestaat uit cijfers en de letters A-F. Daar kan dus in principe nooit een ' in voorkomen. escapen voegt daar niet heel veel toe, maar is ook niet schadelijk, mits inderdaad zo om net niet md5() aan de buitenkant staat.