php error - weet niet wat en hoe
ik heb de volgende php error, maar weet niet hoe ik het kan oplossen.
Code (php)
1
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
//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.';
}
$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.';
}
Gewijzigd op 29/09/2014 20:53:50 door Marco Eilander
Dat maakt je topic ook meteen een stuk overzichtelijker. Ik heb je code voor nu even ingeknipt.
Alvast bedankt!
Gewijzigd op 29/09/2014 20:53:49 door - Ariën -
Ik zat momenteel net in "bewerk" mode. ;)
Marco Eilander op 29/09/2014 20:40:08:
Mijn registratie pagina bugt, en krijg het niet in orde. Iemand had zich geregistreerd onder de naam : "Pietje Puk', 'passwoord1'), ('"
Hoezo bugt? Je hebt kennelijk je beveiliging bij het wegschrijven naar de database niet goed voor elkaar.
Obelix en Idefix op 29/09/2014 21:20:18:
Hoezo bugt? Je hebt kennelijk je beveiliging bij het wegschrijven naar de database niet goed voor elkaar.
Marco Eilander op 29/09/2014 20:40:08:
Mijn registratie pagina bugt, en krijg het niet in orde. Iemand had zich geregistreerd onder de naam : "Pietje Puk', 'passwoord1'), ('"
Hoezo bugt? Je hebt kennelijk je beveiliging bij het wegschrijven naar de database niet goed voor elkaar.
Ja klopt. Ik zat ook al te zoeken hoe ik het anders kan doen, maar kom enkel alleen maar uit om hele strings te controleren i.p.v. gedeeltes. Als jij een oplossing weet, zal ik het erg fijn vinden. :)
Gewijzigd op 29/09/2014 21:50:01 door Marco Eilander
Laat je code eens zien (van je query).
Obelix en Idefix op 29/09/2014 22:02:44:
Laat je code eens zien (van je query).
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
if(isset($_POST['registeren'])){
//connectie naar de database
require_once('config/config.php');
//posts omzetten in variables + beveiligen
$gebruiker = mysql_real_escape_string($_POST['username']);
$ww = mysql_real_escape_string($_POST['pwd']);
//kijken of alle variables tekst vatten
if(empty($gebruiker)){
$fm = 1;
$melding = 'Please fill in your username';
}
if(empty($ww)){
$fm = 1;
$melding = 'Please fill in your password.';
}
//kijken of de gebruikersnaam is toegestaan
$badnames = array("bitch", "fuck", "cancer", ".net", ".nl", ".be", ".com", ".nu", ".tv", ".de", ".jp", ".ru", ".", "-", "_", "@", "?", "!", "(", ")","'", "&", "`");
if (in_array($gebruiker, $badnames)) {
$fm = 1;
$melding = 'This username is not allowed.';
}
//controleren of de gebruiker al bestaat
$check_gebruiker = mysql_query("SELECT * FROM players WHERE player_name = '".$gebruiker."'");
if(mysql_num_rows($check_gebruiker) >= 1){
$fm = 1;
$melding = 'Username is already in use.';
}
if(empty($fm)){
$datum = date('H:i d-m-Y');
mysql_query("INSERT INTO players(player_name,wachtwoord,join_date) VALUES('".$gebruiker."','".md5($ww)."','".$datum."')");
echo '<div class="goed">Your account is succesfully registered!</div>';
echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL=http://www.unonu.net/rsrpg/">';
}else{
echo '<div class="fout">'.$melding.'</div>';
}
}
?>
if(isset($_POST['registeren'])){
//connectie naar de database
require_once('config/config.php');
//posts omzetten in variables + beveiligen
$gebruiker = mysql_real_escape_string($_POST['username']);
$ww = mysql_real_escape_string($_POST['pwd']);
//kijken of alle variables tekst vatten
if(empty($gebruiker)){
$fm = 1;
$melding = 'Please fill in your username';
}
if(empty($ww)){
$fm = 1;
$melding = 'Please fill in your password.';
}
//kijken of de gebruikersnaam is toegestaan
$badnames = array("bitch", "fuck", "cancer", ".net", ".nl", ".be", ".com", ".nu", ".tv", ".de", ".jp", ".ru", ".", "-", "_", "@", "?", "!", "(", ")","'", "&", "`");
if (in_array($gebruiker, $badnames)) {
$fm = 1;
$melding = 'This username is not allowed.';
}
//controleren of de gebruiker al bestaat
$check_gebruiker = mysql_query("SELECT * FROM players WHERE player_name = '".$gebruiker."'");
if(mysql_num_rows($check_gebruiker) >= 1){
$fm = 1;
$melding = 'Username is already in use.';
}
if(empty($fm)){
$datum = date('H:i d-m-Y');
mysql_query("INSERT INTO players(player_name,wachtwoord,join_date) VALUES('".$gebruiker."','".md5($ww)."','".$datum."')");
echo '<div class="goed">Your account is succesfully registered!</div>';
echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL=http://www.unonu.net/rsrpg/">';
}else{
echo '<div class="fout">'.$melding.'</div>';
}
}
?>
Gewijzigd op 29/09/2014 23:17:06 door Marco Eilander
Ook zou je deze regel kunnen vervangen door
Code (php)
Persoonlijk vind ik backticks zwaar overbodig...
daarnaast: http://wiki.pfz.nl/escapen
Er zijn verschillende soorten van escapen, maar gebruik die methode, die je nodig hebt en WAAR je hem nodig hebt.
Je moet de invoer escapen bij de query's.
Doe dat dan ook daar en niet even handig bovenaan je script.
a) je vergeet dat ooit in de toekomst een keertje
b) je kunt $gebruiker nu niet meer voor iets anders gebruiken, bijvoorbeeld weergeven op scherm
c) je kunt met $ww ook niets meer doen..
a) ok, jij niet natuurlijk, maar iemand anders zou het zo maar kunnen vergeten.
b) -
c) je doet ongemerkt kennelijk toch nog wat met je wachtwoord: md5($ww)
$ww is echter niet meer per se gelijk aan het ingevoerde ww. Bijvoorbeeld "foto's" is nu "foto\'s" geworden en de md5-hash daarvan is echt heel anders...
los daarvan:
$datum = date('H:i d-m-Y')
daar kun je echt in een database helemaal niets mee: sorteren werkt niet, filteren niet
statisieken als "hoeveel aanmeldingen op woensdagen?" gaan niet.
Gebruik een kolom van het type DATETIME en zet daar met NOW() de huidige tijd in
of desnoods met php: date('Y-m-d H:i')
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.
Marco Eilander op 30/09/2014 15:07:30:
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.
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
- 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?
Rickert Bombaklats op 30/09/2014 15:26:00:
Niets mis mee toch?
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?
Gewijzigd op 30/09/2014 15:29:51 door Ivo P
Dus als ik het goed begrijp? Beter zonder als met backticks? of juist andersom
Nooit backticks gebruiken.
Maar voor zover ik wist moesten ze er gewoon bij.
ze moeten er alleen bij als je zelf een probleem hebt veroorzaakt door verkeerde tabel- of kolomnamen te kiezen.
Code (php)
1
2
3
2
3
<?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)."')");
?>
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.
Gewijzigd op 30/09/2014 16:24:47 door Marco Eilander
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.