[PHP] functie geeft geen waarde terug

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Mijn mooie functie geeft geen waarde terug, terwijl ik geen fouten zie...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function geef_naam() {
    if(!empty($_SESSION['user_id'])) {
        $s_naam = mysql_query (" SELECT naam FROM leden WHERE id='".$_SESSION['user_id']."' ") or die ( mysql_error() );
        $f_naam = mysql_fetch_array($s_naam);
        $naam = $f_naam['naam'];
        return $naam;
    } elseif ( isset($_COOKIE['user_id']) ) {
        $s_naam = mysql_query (" SELECT naam FROM leden WHERE id='".$_COOKIE['user_id']."' ") or die ( mysql_error() );
        $f_naam = mysql_fetch_array($s_naam);
        $naam = $f_naam['naam'];
        return $naam;
    }
}


Uitleg: ofwel er is een sessie ofwel een cookie, ik weet zeker dat ik van de twee een waarde bevat doordat 1 altijd wel een ID terug geeft met :
PHP:
1
2
echo $_SESSION['user_id'];
echo $_COOKIE['user_id'];

Met
PHP:
1
echo $naam;

krijg ik geen waarde terug.
Waarom ?

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

omdat de rij met het opgegeven userid niet bestaat in je tabel? omdat het veld naam niet bestaat maar name heet ofzo (is onbewust heel snel gebeurd hoor)? omdat het veld id niet bestaat of anders heet? etc etc

doe na de query ook eens
PHP:
1
echo mysql_error();

[ Voor 3% gewijzigd door DataGhost op 21-02-2005 06:34 ]


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Deels opgelost:
PHP:
1
2
3
4
5
// Hiermee krijg ik niets terug:
echo $naam; 

// Maar hiermee krijg ik wel de naam:
echo geef_naam();

Waarom werkt die eerste manier niet ?
Komt het omdat $naam een lokale variabele is ?

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

verytallman schreef op maandag 21 februari 2005 @ 07:40:
Deels opgelost:
PHP:
1
2
3
4
5
// Hiermee krijg ik niets terug:
echo $naam; 

// Maar hiermee krijg ik wel de naam:
echo geef_naam();

Waarom werkt die eerste manier niet ?
Komt het omdat $naam een lokale variabele is ?
ik dacht dat je dat wel wist :/ $naam is alleen bekend binnen die functie, ik ging er dus automatisch vanuit dat je die echo van binnen uit die functie aanriep...
Een functie is eigenlijk een soort variabele, als je $naam buiten de functie wilt gebruiken moet je dus $naam = geef_naam(); doen :) dat is eigenlijk basiskennis... Ik zou je kunnen aanraden een goed boek over PHP te kopen/lenen en die even goed door te spitten

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 00:18
Ik zou maar eens wat over scopes en functies gaan lezen, dit is wel erg basic

|>


Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
PHP:
1
2
$f_naam = mysql_fetch_array($s_naam);
$naam = $f_naam['naam'];

Gaat natuurlijk ook niet werken. Gebruik mysql_fetch_assoc().

[ Voor 6% gewijzigd door SuperRembo op 21-02-2005 09:59 ]

| Toen / Nu


Acties:
  • 0 Henk 'm!

Verwijderd

SuperRembo schreef op maandag 21 februari 2005 @ 08:44:
PHP:
1
2
$f_naam = mysql_fetch_array($s_naam);
$naam = $f_naam['naam'];

Gaat natuurlijk ook niet werken. Gebruik mysql_fetch_assoc().
Dat gaat 'natuurlijk' wel werken:
The optional second argument result_type in mysql_fetch_array() is a constant and can take the following values: MYSQL_ASSOC, MYSQL_NUM, and MYSQL_BOTH. This feature was added in PHP 3.0.7. MYSQL_BOTH is the default for this argument.

By using MYSQL_BOTH, you'll get an array with both associative and number indices. Using MYSQL_ASSOC, you only get associative indices (as mysql_fetch_assoc() works), using MYSQL_NUM, you only get number indices (as mysql_fetch_row() works).

Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Aha, ik was in de veronderstelling dat MYSQL_NUM de default setting was.

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Misschien offtopic, maar het is wel even handig om je te realiseren dat dit een security risico oplevert:
PHP:
1
$s_naam = mysql_query (" SELECT naam FROM leden WHERE id='".$_COOKIE['user_id']."' ") or die ( mysql_error() );

Aangezien $_COOKIE door de gebruiker veranderd kan worden, heb je nu de mogelijkheid tot SQL injection gekregen. Escape dus de waarde van die cookie voor je hem gaat gebruiken. Dit geld overigens niet als magic_quotes_gpc aanstaat, maar ook dan vind ik het persoonlijk duidelijker om expliciet te escapen.

[ Voor 6% gewijzigd door Gerco op 21-02-2005 10:12 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Zelfs waneer je de sqlinjection buiten beschouwing laat is het op deze manier mogelijk om de identiteit van elke willekeurige gebruiker aan te nemen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Janoz schreef op maandag 21 februari 2005 @ 10:25:
Zelfs waneer je de sqlinjection buiten beschouwing laat is het op deze manier mogelijk om de identiteit van elke sillekeurige gebruiker aan te nemen.
TS: topicje van gisteren (oid) over sessions ed: [rml][ PHP] Session lifetime[/rml] en dan vooral deze reply: [rml]crisp in "[ PHP] Session lifetime"[/rml] :) .

DM!


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Bedankt voor de reacties allemaal ten eerste.

Om eerst inhoudelijk op het topic in te gaan. Ik ben inderdaad nog niet zo ervaren met PHP.
Ik heb ook documentatie die ik doorneem maar sorry heb nog niet alles doorgelezen :P
De reden dat ik dacht dat ik de $naam gewoon kon aanroepen is omdat ik dat bij een andere functie ook deed en het daar wel werkte ! Ik zal de code even opzoeken:
PHP:
1
2
3
4
5
6
7
8
9
function geef_id() {
    if(!empty($_SESSION['user_id'])) {
        $user_id = $_SESSION['user_id'];
        return $user_id;
    } elseif ( isset($_COOKIE['user_id']) ) {
        $user_id = $_COOKIE['user_id'];
        return $user_id;
    }
}

$user_id kan ik nu gewoon meteen opvragen met:
PHP:
1
echo $user_id;

Terwijl dit bij $naam dus niet werkt.


Tweede punt; over de beveiliging:

Bij elke beveiligde pagina check ik (van sessie en cookie) of het opgeslagen ip overeenkomt met het ip van de gebruiker. Maar dat heeft misschien niets te maken met SQL injection risico's ?
Im moet "Escape dus de waarde van die cookie voor je hem gaat gebruiken" doen, heeft iemand daar iets meer info over hoe dat dan moet ?

Acties:
  • 0 Henk 'm!

Verwijderd

Rtfm :+ http://gathering.tweakers...ist_messages/741007#faq12
Daarmee voorkom je alleen maar sql-injection. Maar als ik nou gewoon even in mijn cookie het id verander, krijg ik gewoon informatie van een andere gebruiker.

[ Voor 1% gewijzigd door Verwijderd op 21-02-2005 16:04 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
verytallman schreef op maandag 21 februari 2005 @ 15:41:Ik zal de code even opzoeken:
PHP:
1
2
3
4
5
6
7
8
9
function geef_id() {
    if(!empty($_SESSION['user_id'])) {
        $user_id = $_SESSION['user_id'];
        return $user_id;
    } elseif ( isset($_COOKIE['user_id']) ) {
        $user_id = $_COOKIE['user_id'];
        return $user_id;
    }
}

$user_id kan ik nu gewoon meteen opvragen met:
PHP:
1
echo $user_id;
Het is onmogelijk dat jij op deze manier de waarde van $user_id opvraagt die in de functie geef_id() aan $user_id wordt toegekend. Waarschijnlijk ken je dan ergens anders, buiten functies om, een waarde toe aan $user_id.
Bij elke beveiligde pagina check ik (van sessie en cookie) of het opgeslagen ip overeenkomt met het ip van de gebruiker. Maar dat heeft misschien niets te maken met SQL injection risico's ?
Im moet "Escape dus de waarde van die cookie voor je hem gaat gebruiken" doen, heeft iemand daar iets meer info over hoe dat dan moet ?
Sla je dat ip ook op in de cookie? Als ik dan in een cookie mijn ip stop en een willekeurig $user_id kan ik me voordoen als iemand die ik niet ben. En dat lijkt me niet zo handig :)

Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
ludo schreef op maandag 21 februari 2005 @ 16:03:
[...]
Sla je dat ip ook op in de cookie? Als ik dan in een cookie mijn ip stop en een willekeurig $user_id kan ik me voordoen als iemand die ik niet ben. En dat lijkt me niet zo handig :)
Over de beveiliging:
De gegevens die in het cookie staan heb ik ook opgeslagen in een tabel, en die gegevens worden vergeleken met elkaar.
Dan heb ik toch genoeg beveiliging ?
Moet ik nu nog steeds kijken naar dat SQL injection risico?

Over die lokale variabele: het zou kunnen dat $user_id ergens anders gemaakt wordt een daardoor werkt.... maar daar weet/wist ik niets van dus ik dacht dat mijn functie zo gewoon werkte.

Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
verytallman schreef op maandag 21 februari 2005 @ 16:24:
[...]

Over de beveiliging:
De gegevens die in het cookie staan heb ik ook opgeslagen in een tabel, en die gegevens worden vergeleken met elkaar.
Dan heb ik toch genoeg beveiliging ?
Ik weet niet precies welke gegevens jij in het cookie opslaat en op welke manier, maar je moet op je harde schijf maar eens opzoeken waar je browser de cookies opslaat. Als je zo'n cookie in een simpele texteditor opent zul je zien dat je de gegevens die daar instaan zo kunt lezen. Stel dat jij inlogt op je eigen website, er wordt dan een cookie gemaakt met bijvoorbeeld je user_id en je user_ip. Als een kwaadwillend iemand nou achter jouw ip komt (niet zo moeilijk) én jouw user_id (waarschijnlijk ook niet zo moeilijk) kan deze de gegevens in een cookie zetten en naar jouw website gaan, zonder dat hij in hoeft te loggen...
Moet ik nu nog steeds kijken naar dat SQL injection risico?
SQL injections zijn weer hele andere dingen, waar je zeker even naar moet kijken als je dat nog niet gedaan hebt. Een kwaadwillende gebruiker zou in dat cookie een stukje SQL code op kunnen slaan i.p.v. een ip, bijvoorbeeld: 'DROP databaseNaam;' (iets ingewikkelder dan dit zal het moeten zijn, maar het is even een voorbeeld ;) ). Als jij de waarde van $_COOKIE['ip'] dan in je query stopt en die vervolgens uitvoert kan het gebeuren dat je hele database verdwijnt. Dat zal je waarschijnlijk niet leuk vinden ;)
Over die lokale variabele: het zou kunnen dat $user_id ergens anders gemaakt wordt een daardoor werkt.... maar daar weet/wist ik niets van dus ik dacht dat mijn functie zo gewoon werkte.
Als je nog wilt weten waarom je die variabelen niet zo aan kan spreken moet je op php.net maar eens zoeken naar 'variable scope'. Er is trouwens een manier om er voor te zorgen dat je wél echo $naam zou kunnen doen, namelijk met behulp van globals (ook te vinden bij variable scope op php.net). Maar probeer dit zoveel mogelijk te vermijden! Je haalt dan namelijk de structuur van je programma volledig onderuit en het wordt heel moeilijk om te overzien welke variabelen waar gewijzigd worden.

Acties:
  • 0 Henk 'm!

Verwijderd

verytallman schreef op maandag 21 februari 2005 @ 15:41:
PHP:
1
2
3
4
5
6
7
8
9
function geef_id() {
    if(!empty($_SESSION['user_id'])) {
        $user_id = $_SESSION['user_id'];
        return $user_id;
    } elseif ( isset($_COOKIE['user_id']) ) {
        $user_id = $_COOKIE['user_id'];
        return $user_id;
    }
}

$user_id kan ik nu gewoon meteen opvragen met:
PHP:
1
echo $user_id;

Terwijl dit bij $naam dus niet werkt.
Ik weet niet precies hoe je de functie aanroept. Maar misschien doe je wel dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function geef_id() {
    if(!empty($_SESSION['user_id'])) {
        $user_id = $_SESSION['user_id'];
        return $user_id;
    } elseif ( isset($_COOKIE['user_id']) ) {
        $user_id = $_COOKIE['user_id'];
        return $user_id;
    }
}

$user_id = geef_id();
echo $user_id;

Dan is het natuurlijk logisch dat hij dat wel pakt. Maar ik neem aan dat je dat zo niet doet.
Kijk gewoon nog even de manual op php.net door, en dan kom je er wel achter hoe het precies werkt.En dan haal je snel genoeg je fout eruit. :)

Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Het functie-verhaal is me nu helemaal duidelijk, merci.

Volgens mij is mijn login wel veilig, omdat :

In het cookie staat: het ID, IP en een random md5 string.(die wordt bij login aangemaakt)
Het ID, IP en random md5 string staan ook in een tabel in de database.
Op elke beveiligde pagina wordt gecontroleerd of de gegevens uit het cookie overeenkomen met die in de database.

Het ID in combinatie met IP zou nog te achterhalen zijn, maar die random string zeker niet.

Safe toch ? Maar dit heeft zeker niets te maken met het gevaar van SQL injection ? Daar snap ik nog geen bal van...

Acties:
  • 0 Henk 'm!

  • ixi
  • Registratie: December 2001
  • Laatst online: 27-08 23:59

ixi


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
verytallman schreef op maandag 21 februari 2005 @ 15:41:
Bedankt voor de reacties allemaal ten eerste.

Om eerst inhoudelijk op het topic in te gaan. Ik ben inderdaad nog niet zo ervaren met PHP.
Ik heb ook documentatie die ik doorneem maar sorry heb nog niet alles doorgelezen :P
De reden dat ik dacht dat ik de $naam gewoon kon aanroepen is omdat ik dat bij een andere functie ook deed en het daar wel werkte ! Ik zal de code even opzoeken:
PHP:
1
...

$user_id kan ik nu gewoon meteen opvragen met:
PHP:
1
echo $user_id;

Terwijl dit bij $naam dus niet werkt.
Ik denk dat je register globals aan hebt staan in je PHP instellingen. Die zou ik sowieso uitzetten omdat dit - zeker als je niet 100% bewust bent van de risico's - tot nogal wat veiligheidsproblemen kan leiden.

Regeren is vooruitschuiven

Pagina: 1