php error - weet niet wat en hoe

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Pagina: 1 2 volgende »

Marco Eilander

Marco Eilander

29/09/2014 20:40:08
Quote Anchor link
Hallo,

ik heb de volgende php error, maar weet niet hoe ik het kan oplossen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
1
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.';
}
Gewijzigd op 29/09/2014 20:53:50 door Marco Eilander
 
PHP hulp

PHP hulp

20/04/2024 09:22:14
 
- Ariën  -
Beheerder

- Ariën -

29/09/2014 20:47:59
Quote Anchor link
Zou je a.u.b voortaan relevante code willen tonen, i.p.v. > 2600 regels aan die bijna niemand zal lezen?
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 -
 
Marco Eilander

Marco Eilander

29/09/2014 20:54:33
Quote Anchor link
Hallo aar,
Ik zat momenteel net in "bewerk" mode. ;)
 
Obelix Idefix

Obelix Idefix

29/09/2014 21:20:18
Quote Anchor link
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.
 
Marco Eilander

Marco Eilander

29/09/2014 21:49:23
Quote Anchor link
Obelix en Idefix op 29/09/2014 21:20:18:
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
 
Obelix Idefix

Obelix Idefix

29/09/2014 22:02:44
Quote Anchor link
Laat je code eens zien (van je query).
 
Ivo P

Ivo P

29/09/2014 22:31:14
Quote Anchor link
Je mist dus gewoon ergens mysqli_real_escape_string

Http://wiki.pfz.nl/sql-injectie
 
Marco Eilander

Marco Eilander

29/09/2014 23:15:51
Quote Anchor link
Obelix en Idefix op 29/09/2014 22:02:44:
Laat je code eens zien (van je query).


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>';
}

}

?>
Gewijzigd op 29/09/2014 23:17:06 door Marco Eilander
 

29/09/2014 23:20:32
Quote Anchor link
Je gebruikt geen backticks en met dubbele quotes hoef je geen punten te gebruiken
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$query
= "SELECT * FROM `players` WHERE `player_name`= '{$gebruiker}'";

?>


Ook zou je deze regel kunnen vervangen door

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL=http://www.unonu.net/rsrpg/">';

header('Location: http://www.unonu.net/rsrpg/');
?>
Gewijzigd op 29/09/2014 23:22:21 door
 
- Ariën  -
Beheerder

- Ariën -

29/09/2014 23:23:43
Quote Anchor link
Persoonlijk vind ik backticks zwaar overbodig...
 
Ivo P

Ivo P

30/09/2014 14:29:07
Quote Anchor link
het is geen php-error, maar een mysql-error.

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')
 
Marco Eilander

Marco Eilander

30/09/2014 15:07:30
Quote Anchor link
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.
 
Ivo P

Ivo P

30/09/2014 15:18:11
Quote Anchor link
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.


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: &lt; 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
 

30/09/2014 15:26:00
Quote Anchor link
- 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?
 
Ivo P

Ivo P

30/09/2014 15:26:39
Quote Anchor link
Rickert Bombaklats op 30/09/2014 15:26:00:

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
 

30/09/2014 15:31:33
Quote Anchor link
Dus als ik het goed begrijp? Beter zonder als met backticks? of juist andersom
 
- SanThe -

- SanThe -

30/09/2014 15:32:23
Quote Anchor link
Nooit backticks gebruiken.
 

30/09/2014 15:34:59
Quote Anchor link
Zelf schrijf ik ze niet, het framework met active record class handelt alles voor me af :P
Maar voor zover ik wist moesten ze er gewoon bij.
 
Ivo P

Ivo P

30/09/2014 15:53:24
Quote Anchor link
ze moeten er alleen bij als je zelf een probleem hebt veroorzaakt door verkeerde tabel- of kolomnamen te kiezen.
 
Marco Eilander

Marco Eilander

30/09/2014 16:24:09
Quote Anchor link
Ik heb nu dit :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)."')");
?>


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
 
Ivo P

Ivo P

30/09/2014 16:28:28
Quote Anchor link
waarom zou hij niet mogen registreren?

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.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.