Variabelen uitlezen php

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • robbert15
  • Registratie: September 2009
  • Laatst online: 19-02 22:36
Hallo,
Ik vroeg mij af of he mogelijk is om onbekende variabelen aan te roepen, bijvoorbeeld ik heb een bestand zoals:

<php
$variabele = ('Hoi')
$variabeletwee ('Doei')
?>

Nou staan deze variabelen natuurlijk vast en is het niet moeilijk om deze uit te lezen, namelijk door:

<?php
echo ('$variabele')
echo ('$variabeletwee')
?>

Maar als ik nou een bestand heb waarvan ik de variabelen niet weet zoals:

<?php
$??? = ('???')
$??? = ('???')
?>

Hoe kan ik dan toch die variabelen weergeven zonder dat ik ze weet?

Alvast bedankt ;)

Acties:
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 19:18
Hoe kun je iemand roepen zonder dat je z'n naam weet? :+

In normale omstandigheden, zal het weinig voorkomen dat je de naam van variabelen niet weet. 999 van de 1000 keer heb je namelijk geen variabele variabelen nodig.

'If variable variables are the answer, you're most likely asking the wrong question.'

Overigens hoef je als je een string in een variable zet, er geen haakjes om heen te zetten. Iets als het volgende zou voldoende moeten zijn.

PHP:
1
$variabele = 'Hiep hoi';

[ Voor 22% gewijzigd door dev10 op 20-04-2010 22:55 ]


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 23:49
Heb je misschien een voorbeeld waar de naam van een variabele variabel kan zijn? Ik kan me er niets bij voorstellen...

Overigens denk ik dat je er beter aan doet om gewoon te beginnen met een paar tutorials, je doet namelijk het allersimpelste binnen PHP al fout (namelijk het echo'en van variabelen).

Tip: er moet een semicolon ( ; ) achter elke actie, en waardes hoeven niet tussen haakjes.

Acties:
  • 0 Henk 'm!

  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 17-09 11:10
Ik denk dat de oplossing die jij zoekt, array's zijn.

Op Google kun je hier heel veel over vinden

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// Dit in je bestand, die je include
$arraynaam['var1'] = "hoi";
$arraynaam['var2'] = "hallo";
$arraynaam['var3'] = "goedendag";

// Dit in het script
include("bestandmetarray.php");
foreach ($arraynaam as $var => $val)
{
    echo $var . " bevat " . $val;
}

//of
echo $arraynaam['var2'];
?>


Of:
http://snippets.dzone.com/posts/show/1515

Voor de rest zou je toch echt moeten Googlen, dit zijn echt basics die 100% zeker op het internet staan.

[ Voor 17% gewijzigd door Exception op 20-04-2010 22:59 ]


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
dev10 schreef op dinsdag 20 april 2010 @ 22:52:
In normale omstandigheden, zal het weinig voorkomen dat je de naam van variabelen niet weet. 999 van de 1000 keer heb je namelijk geen variabele variabelen nodig.
Tenzij hij een draaiend script wil hacken ofzo.
'If variable variables are the answer, you're most likely asking the wrong question.'
Or you need a hash.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • bredend
  • Registratie: September 2001
  • Laatst online: 21:45
Wat ook nog kan is het PHP bestand als text inlezen en vervolgens gaat zoeken op woorden die beginnen met een $

Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

bredend schreef op dinsdag 20 april 2010 @ 22:59:
Wat ook nog kan is het PHP bestand als text inlezen en vervolgens gaat zoeken op woorden die beginnen met een $
Dan zou ik toch eerder de GLOBALS variabele uitlezen. Echter denk ik ook dat het beter is de betreffende variabelen in een eigen array te zetten.

On track


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

bredend schreef op dinsdag 20 april 2010 @ 22:59:
Wat ook nog kan is het PHP bestand als text inlezen en vervolgens gaat zoeken op woorden die beginnen met een $
Of "gewoon" get_defined_vars() gebruiken :+

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Avalaxy schreef op dinsdag 20 april 2010 @ 22:57:
Overigens denk ik dat je er beter aan doet om gewoon te beginnen met een paar tutorials, je doet namelijk het allersimpelste binnen PHP al fout (namelijk het echo'en van variabelen).
Bijj language constructs mag je ook de function syntax gebruiken hoor.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Grijze Vos schreef op woensdag 21 april 2010 @ 00:05:
[...]
Bijj language constructs mag je ook de function syntax gebruiken hoor.
Maar variabelen horen niet tussen enkele aanhalingstekens hoor :*

offtopic:
NMe is een zeurpiet O-)

[ Voor 11% gewijzigd door Patriot op 21-04-2010 03:46 ]


Acties:
  • 0 Henk 'm!

  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

Misschien wil je $_POST of $_GET uitlezen? Dat is het enige wat ik kan bedenken wat ook maar een klein beetje zou kunnen verklaren waarom je naar zoiets op zoek zou zijn ;)

Acties:
  • 0 Henk 'm!

  • joostvanpinxten
  • Registratie: Maart 2007
  • Laatst online: 03-09 12:50
Avalaxy schreef op dinsdag 20 april 2010 @ 22:57:
Heb je misschien een voorbeeld waar de naam van een variabele variabel kan zijn? Ik kan me er niets bij voorstellen...
Misschien iets buiten de scope van wat de topicstart bedoelt:

PHP:
1
2
3
4
5
<?php
$a = 1;
$b =  'a';
echo $$b;
?>


geeft als resultaat 1 :-)
Zo kan je bijvoorbeeld ook van een $_GET een actie maken, zonder dat je weet welke actie dat precies is. Alhoewel je dan nog steeds moet checken of die actie dan wel bestaat. Op een manier wel een soort van array-based werken, maar iets als $$called_class->$called_method() kan in PHP wel degelijk nuttig zijn!

(Zie ook http://www.php.net/manual...iables.variable.php#97222 en example #1 op die pagina!)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je de naam van een variabele niet kent maar hem toch wil gebruiken dan ben je toch wel iets héél geks van plan. 8)7

Leg eens uit waar je dit maffe idee voor nodig hebt. 10 tegen 1 dat er een betere oplossing is dan het raden van variabelenamen. ;)
joostvanpinxten schreef op woensdag 21 april 2010 @ 00:13:
[...]


Misschien iets buiten de scope van wat de topicstart bedoelt:

PHP:
1
2
3
4
5
<?php
$a = 1;
$b =  'a';
echo $$b;
?>


geeft als resultaat 1 :-)
Zo kan je bijvoorbeeld ook van een $_GET een actie maken, zonder dat je weet welke actie dat precies is. Alhoewel je dan nog steeds moet checken of die actie dan wel bestaat. Op een manier wel een soort van array-based werken, maar iets als $$called_class->$called_method() kan in PHP wel degelijk nuttig zijn!

(Zie ook http://www.php.net/manual...iables.variable.php#97222 en example #1 op die pagina!)
Noem mij eens één voorbeeld waar dat én nuttig is, én geen slecht ontwerp. ;) Iets als $$called_class->$called_method() zul je doorgaans met een factory oplossen, niet met variabele variabelen. En je $_GET-voorbeeld is meteen wel heel erg vervelend omdat je door user input te combineren met variabele variabelen wel meteen erg veel hackmogelijkheden open zet waar je dan ineens weer tegen moet beveiligen...
Patriot schreef op woensdag 21 april 2010 @ 00:08:
[...]

Maar variabelen horen niet tussen apostrofs aanhalingstekens hoor :*
In elk geval niet tussen enkele aanhalingstekens nee. :P

offtopic:
Een apostrof is dat ding dat je gebruikt bij woorden als "zo'n" en " 's Hertogenbosch". Hetgeen waar jij het over hebt zijn aanhalingstekens, of gebruikelijker in de programmeerwereld: quotes. ;)

[ Voor 14% gewijzigd door NMe op 21-04-2010 00:57 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
NMe schreef op woensdag 21 april 2010 @ 00:55:

[...]

Noem mij eens één voorbeeld waar dat én nuttig is, én geen slecht ontwerp. ;) Iets als $$called_class->$called_method() zul je doorgaans met een factory oplossen, niet met variabele variabelen. En je $_GET-voorbeeld is meteen wel heel erg vervelend omdat je door user input te combineren met variabele variabelen wel meteen erg veel hackmogelijkheden open zet waar je dan ineens weer tegen moet beveiligen...
Blind PHP injection: een nieuw gat in de markt?

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
Vraag geen uitleg, waarschijnlijk uit luiigheid:is een hele tijd geleden gebeurt:
de constructie heb ik ingepland in een framework, als de setup nog niet doorlopen was, of nadat de gebruiker zich heeft aangemeld als er bepaalde fouten optreden,

$settings = $page->get_vars();
foreach( $settings as $key=>$value )
{
$$key = $value;
}

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

g4wx3 schreef op woensdag 21 april 2010 @ 01:39:
Vraag geen uitleg, waarschijnlijk uit luiigheid:is een hele tijd geleden gebeurt:
de constructie heb ik ingepland in een framework, als de setup nog niet doorlopen was, of nadat de gebruiker zich heeft aangemeld als er bepaalde fouten optreden,

$settings = $page->get_vars();
foreach( $settings as $key=>$value )
{
$$key = $value;
}
...en die kun je verkorten tot één regel.
PHP:
1
extract($page->get_vars());

;)

Waarmee ik overigens niet zeg dat het een goed idee is, maar goed. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • joostvanpinxten
  • Registratie: Maart 2007
  • Laatst online: 03-09 12:50
NMe schreef op woensdag 21 april 2010 @ 00:55:
[...]

Noem mij eens één voorbeeld waar dat én nuttig is, én geen slecht ontwerp. ;) Iets als $$called_class->$called_method() zul je doorgaans met een factory oplossen, niet met variabele variabelen. En je $_GET-voorbeeld is meteen wel heel erg vervelend omdat je door user input te combineren met variabele variabelen wel meteen erg veel hackmogelijkheden open zet waar je dan ineens weer tegen moet beveiligen...
simpele opzet: index.php?module=modulenaam&action=send

Dit kan je dan door een systeem af laten vangen, die alle modules geregistreerd heeft staan, op de een of andere manier. Naar mijn weten is dat géén slecht ontwerp. Voordeel hiervan is, dat je de modules gemakkelijk uit kan breiden. Met behulp van public en private methods is het dan makkelijk aangeven of iets wel of niet aanroepbaar mag zijn vanaf de "buitenwereld".

Hoe zou je dit op willen vangen met een factory?

En, ik zie trouwens een foutje: $called_class = new $classname(); moet er nog voorstaan (en dan een dollar-sign weg), maar dat doet er op zich niet zoveel toe.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

joostvanpinxten schreef op woensdag 21 april 2010 @ 01:58:
simpele opzet: index.php?module=modulenaam&action=send

Dit kan je dan door een systeem af laten vangen, die alle modules geregistreerd heeft staan, op de een of andere manier. Naar mijn weten is dat géén slecht ontwerp. Voordeel hiervan is, dat je de modules gemakkelijk uit kan breiden. Met behulp van public en private methods is het dan makkelijk aangeven of iets wel of niet aanroepbaar mag zijn vanaf de "buitenwereld".
Waar heb je de variabele variabelnamen in dit voorbeeld dan nodig :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
.oisyn schreef op woensdag 21 april 2010 @ 02:25:
[...]

Waar heb je de variabele variabelnamen in dit voorbeeld dan nodig :?
Wij gebruiken het om op een makkelijke manier controllers aan te maken en de juiste actie erop aan te roepen. Door middel van mod_rewrite wordt bijvoorbeeld http://applicatie/customer/view omgezet naar

PHP:
1
2
3
4
5
6
7
8
9
$controllername= $_GET['controllername'];  //bevat nu als waarde customer
$actionname = $_GET['actionname'];          //bevat nu als waarde view

//Check door middel van reflection of de controller bestaat
//Check door middel van reflection of de methode die aangeroepen gaat worden bestaat
//Voer rechten checks uit voor de gebruiker

$controller = new $controllername();
$controller->$actionname();


Dat is tot op heden de enige nuttige toepassing die ik hiervoor gezien heb, maar wel eentje die dan ook meteen verdomd handig is.

Het kan zijn dat ik het verkeerd begrijp, maar dat is denk ik ook wat joostvanpinxten ermee bedoelt.

Acties:
  • 0 Henk 'm!

  • joostvanpinxten
  • Registratie: Maart 2007
  • Laatst online: 03-09 12:50
Je hebt gelijk, dat zijn inderdaad gewone variabelen dan. Alleen heb je dan variabele classnamen en variabele methodnamen. Ik scheer dat hier (onterecht?) over één kam.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

st0p schreef op woensdag 21 april 2010 @ 09:43:
[...]


Wij gebruiken het om op een makkelijke manier controllers aan te maken en de juiste actie erop aan te roepen. Door middel van mod_rewrite wordt bijvoorbeeld http://applicatie/customer/view omgezet naar

PHP:
1
2
3
4
5
6
7
8
9
$controllername= $_GET['controllername'];  //bevat nu als waarde customer
$actionname = $_GET['actionname'];          //bevat nu als waarde view

//Check door middel van reflection of de controller bestaat
//Check door middel van reflection of de methode die aangeroepen gaat worden bestaat
//Voer rechten checks uit voor de gebruiker

$controller = new $controllername();
$controller->$actionname();


Dat is tot op heden de enige nuttige toepassing die ik hiervoor gezien heb, maar wel eentje die dan ook meteen verdomd handig is.

Het kan zijn dat ik het verkeerd begrijp, maar dat is denk ik ook wat joostvanpinxten ermee bedoelt.
Cool, dat is makkelijk. Er hoeft maar een klein bugje in de validatie te zitten en ik kan elke willekeurige methode van elke willekeurige class aanroepen.

Ach, security en defensief programmeren is sowieso nogal overrated natuurlijk ;).

[ Voor 3% gewijzigd door Janoz op 21-04-2010 10:17 ]

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!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 20:57

MueR

Admin Tweakers Discord

is niet lief

st0p schreef op woensdag 21 april 2010 @ 09:43:
Dat is tot op heden de enige nuttige toepassing die ik hiervoor gezien heb, maar wel eentje die dan ook meteen verdomd handig is.
Zoiets heb ik ook wel eens gebouwd. Daar was het inderdaad verdomd handig. Ik had alleen wel een erg beperkte set classes die kon worden aangeroepen, die vanuit de database kwamen. Toch een stukkie veiliger. Theoretisch had ik dat ook kunnen omschrijven dmv een switch op het type en dan de juiste classes hardcoden, of door een factory, wat het nog beter zou maken.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
Het voorbeeld wat ik geef is uiteraard versimpeld. Zo wordt moet de naam van de controller class eindigen op Controller, aan $controllername wordt dus standaard Controller toegevoegd. Het is dan inderdaad aan de programmeurs om verder geen classes te laten eindigen op Controller, maar ik reken op enige discipline in ons dev team.

Bugs in validatie zijn natuurlijk altijd een risico, maar het whitelist (standaard geen rechten, tenzij wij je expliciet rechten hebben gegeven) systeem wat we gebruiken werkt volgens onze unit tests volledig naar behoren. Ik denk eerlijk gezegd dat een complex switch statement oid om de juiste controllers aan te maken foutgevoeliger is dan de manier waarop wij ermee omgaan.

[edit]
Als ik dan security een risico zou moeten aanwijzen binnen de app waarovr ik het heb, dan is het cookie hijacking... Draait verder alleen intern, dus XSS en CSRF maak ik me niet zo'n zorgen over.

[ Voor 12% gewijzigd door st0p op 21-04-2010 10:40 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Een switch statement is eigenlijk de meest simpele vorm van een whitelist.

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!

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
Dat neemt niet weg dat het uitstekend dicht te timmeren is, en je voor een switch alleen maar een bak extra onnodige code gaat lopen bouwen, Wil je groepen alleen rechten geven op een specifieke methode van een contoller zonder dit database driven te checken? ik wens je viel spass met je switch statement, maar ik denk dat je eerder security bugs veroorzaakt dan de manier waarop wij het hier nu aangepakt hebben.

Dat wil niet zeggen dat deze methode zaligmakend of heilig is, specifieke rechten op specifieke dossiers zijn hiermee niet zo 123 af te dwingen, maar is gelukkig geen requirement :)

Verder denk ik dat deze discussie behoorlijk offtopic begint te worden.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarschijnlijk hangt er een heel prutserig model aan vast, ben benieuwd naar de case van de TS. Overigens gok ik op een beginnerfout, de TS zet ook haakjes om declaraties en om echo's terwijl dit volledig overbodig is :?

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Janoz schreef op woensdag 21 april 2010 @ 10:14:
[...]

Cool, dat is makkelijk. Er hoeft maar een klein bugje in de validatie te zitten en ik kan elke willekeurige methode van elke willekeurige class aanroepen.

Ach, security en defensief programmeren is sowieso nogal overrated natuurlijk ;).
Als je de aan te roepen klasse en methode baseert op gebruikersinput loop je altijd het risico dat wanneer je iets in de validatie verkeerd doet, er klassen of methodes worden aangeroepen die niet aangeroepen horen te worden. Dat is niet inherent aan het gebruiken van variabele variabelen/klassen/methodes. Dat is inherent aan het principe waar je dan gebruik van maakt. Ik nodig je uit om een dergelijk systeem te verzinnen waardoor je door een fout van de programmeur niet iets kunt aanroepen wat niet de bedoeling was :S

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Patriot schreef op donderdag 22 april 2010 @ 01:22:
[...]

Als je de aan te roepen klasse en methode baseert op gebruikersinput loop je altijd het risico dat wanneer je iets in de validatie verkeerd doet, er klassen of methodes worden aangeroepen die niet aangeroepen horen te worden. Dat is niet inherent aan het gebruiken van variabele variabelen/klassen/methodes. Dat is inherent aan het principe waar je dan gebruik van maakt. Ik nodig je uit om een dergelijk systeem te verzinnen waardoor je door een fout van de programmeur niet iets kunt aanroepen wat niet de bedoeling was :S
Ik geloof dat je niet helemaal doorhebt dat je met een constructie als $$classname->$methodname() elk willekeurig stuk code kan aanroepen, mits de class en method bestaan, terwijl je op de meer gebruikelijke manier in elk geval een gelimiteerde set code hebt die een "hacker" kan uitvoeren. Ik heb liever dat een hacker mijn site defacet dan dat 'ie de hele server leeggooit omdat hij een deletefunctie kan aanroepen of iets dergelijks. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Patriot schreef op donderdag 22 april 2010 @ 01:22:
[...]


Als je de aan te roepen klasse en methode baseert op gebruikersinput loop je altijd het risico dat wanneer je iets in de validatie verkeerd doet, er klassen of methodes worden aangeroepen die niet aangeroepen horen te worden. Dat is niet inherent aan het gebruiken van variabele variabelen/klassen/methodes. Dat is inherent aan het principe waar je dan gebruik van maakt. Ik nodig je uit om een dergelijk systeem te verzinnen waardoor je door een fout van de programmeur niet iets kunt aanroepen wat niet de bedoeling was :S
simpel
PHP:
1
2
3
4
5
6
7
8
9
10
//..config
$controllerMap = Array();
$controllerMap['user'] = new UserControllerFacade();
$controllerMap['news'] = new NewsControllerFacade();


//..handling

$controllerClass = $controllerMap[$controllerFromInput];
$controllerClass->$actionFromInput();


Geen mogelijkheid om een methode aan te roepen op een class waarvoor je dat niet bedoeld.

Ik heb ze even controllerfacade genoemd om duidelijk te maken dat hierin ook echt enkel methoden staan die daadwerkelijk aangeroepen kunnen worden.

In de eerdere situatie is het ook mogelijk om elke willekeurige class aan te maken bij een fout. Ook bijvoorbeeld de MySQLi class. Het appenden van bijvoorbeeld controller is nog geen garantie. Eerder zijn er bugs geweest in php (weet niet meer of die er nog steeds zijn) waardoor je een geforceerd einde aan je string kon maken door een 0byte in je string op te nemen. Het zou best kunnen voorkomen dat het appenden in dat geval geen effect heeft.

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!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
D'r zijn genoeg beginnerswebsites op het internet die zo'n constructie en varianten daarop ten strengste afraden. Ik bedoel, zou je

PHP:
1
include ($_GET['page'] . '.php');


doen? Is effectief gezien hetzelfde systeem. Nee, zorg er altijd voor dat je een whitelist hebt met zaken die je mag aanroepen. Die kun je ook evt. per gebruiker dan aanmaken in een permissie systeem.

Effectief gezien bestaat dat ook al in de aangehaalde voorbeeldcode, bij het controleren op permissies van gebruikers. Echter daar is het gevaar dat, zodra je vergeet om één controller of actie niet aanroepbaar te maken, je een security risk hebt.

Een goeie security is andersom - niemand mag niks, tenzij anders aangegeven.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dus iedereen mag een beetje? :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 00:17
Janoz schreef op donderdag 22 april 2010 @ 13:26:
[...]
simpel
PHP:
1
2
3
4
5
6
7
8
9
10
//..config
$controllerMap = Array();
$controllerMap['user'] = new UserControllerFacade();
$controllerMap['news'] = new NewsControllerFacade();


//..handling

$controllerClass = $controllerMap[$controllerFromInput];
$controllerClass->$actionFromInput();
Mja, nadeel hiervan is dat je al je controllers moet instantieren - voor elk request. Als het om afschermen gaat heb je in PHP zat mogelijkheden die netter (en beter) zijn dan class names checken. Op z'n simpel:
PHP:
1
2
3
4
5
6
7
8
9
10
abstract class Controller {
  abstract public function doStuff($action);
}

$controllerClass = $_GET['controller'];

if(is_subclass_of($controllerClass,'Controller')) {
  $controller = new $controllerClass();
  $controller->doStuff($_GET['action']);
}

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

dan doe je de (al eerder aangehaalde) switch
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
//..config 
function getController($name) {
  switch ($name) {
    case 'user':
      return  new UserControllerFacade(); 
    case 'news':
      return new NewsControllerFacade();
    default:
      return someOtherDefaultControllerFacade();
}


//..handling 

$controllerClass = getController($controllerFromInput); 
$controllerClass->$actionFromInput(); 
?>


Maar goed, jouw versie was sowieso al een stuk veiliger dan degene waarop ik in eerste instantie reageerde aangezien in jouw implementatie enkel de 'doStuff' methode aangeroepen kan worden en niet elke willekeurige methode.

[ Voor 20% gewijzigd door Janoz op 22-04-2010 21:14 ]

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!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Superenthousiast topic, maar de topicstarter durft hier voorlopig niet meer te komen. :P De vraag van de ts was nog niet volkomen helder, dus vrij grote kans dat hij iig hier nog weinig aan heeft. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Voutloos schreef op donderdag 22 april 2010 @ 21:17:
Superenthousiast topic, maar de topicstarter durft hier voorlopig niet meer te komen. :P De vraag van de ts was nog niet volkomen helder, dus vrij grote kans dat hij iig hier nog weinig aan heeft. ;)
Tsja, er wordt hem om uitleg gevraagd. Als hij vervolgens in zijn eigen topic niet aanwezig blijft kunnen wij er verder ook weinig aan doen natuurlijk. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

NMe schreef op donderdag 22 april 2010 @ 01:33:
[...]

Ik geloof dat je niet helemaal doorhebt dat je met een constructie als $$classname->$methodname() elk willekeurig stuk code kan aanroepen, mits de class en method bestaan, terwijl je op de meer gebruikelijke manier in elk geval een gelimiteerde set code hebt die een "hacker" kan uitvoeren.
:') nofi, maar zo dom ben ik nou ook weer niet hoor. Het ging om een fout tijdens de validatie van een string vs. de fout bij een andere constructie. Wellicht is het risico bij een implementatie van variabele classnames groter, maar dat kun je niet met zekerheid zeggen als je niet weet wat de specifieke implementatie is.

Janoz vind dit blijkbaar een enorm veel veiligere oplossing omdat je daar blijkbaar geen fouten kan maken, maar je kunt wel fouten maken als je de string valideert. Ik vond (en vind nog steeds) dat dat wel meeviel, je kunt bij het schrijven van die switchstatement ook domme fouten maken. Natuurlijk is een foutje bij de beveiliging waarschijnlijker, maar in mijn ogen niet substantieel veiliger om te doen alsof het het verschil maakt tussen een systeem waar iedereen binnenwandelt en een systeem waar niemand iets mee kan doen wat niet voorzien was.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20:31
st0p schreef op woensdag 21 april 2010 @ 10:35:
Het voorbeeld wat ik geef is uiteraard versimpeld. Zo wordt moet de naam van de controller class eindigen op Controller, aan $controllername wordt dus standaard Controller toegevoegd. Het is dan inderdaad aan de programmeurs om verder geen classes te laten eindigen op Controller, maar ik reken op enige discipline in ons dev team.
Ik heb in het verleden ook een dergelijke constructie gebruikt, ook met controllers met een variabele naam, maar dat deed ik dan als volgt:

PHP:
1
2
3
4
if( $controllername instanceof controllerInterface ){
  $controller = new $controllername(); 
}
//en iets vergelijkbaars met de aan te roepen action/method


Dit lijkt me eerlijk gezegd al bijna even goed dichtgetimmerd als een whitelist en tegelijk een stuk flexibeler. Het komt zelfs behoorlijk dicht bij het idee van een whitelist, want ook in dit geval heb je (intern in php) een limitatieve lijst met klassen die voldoen.
Janoz schreef op woensdag 21 april 2010 @ 10:14:
[...]

Cool, dat is makkelijk. Er hoeft maar een klein bugje in de validatie te zitten en ik kan elke willekeurige methode van elke willekeurige class aanroepen.

Ach, security en defensief programmeren is sowieso nogal overrated natuurlijk ;).
Als je met php werk, dan werk je waarschijnlijk met user input en hoe je het ook went of keert, user input moet je wantrouwen. Bij controllers kun je het probleem oplossen met een whitelist, met tekstinput kan dat al niet meer. Je zult op een gegeven moment toch afhankelijk zijn van beveiligingsmethoden die betrouwbare en onbetrouwbare input van elkaar scheiden. Niks aan te doen, dat is inherent aan programmeren met PHP.

[ Voor 4% gewijzigd door doeternietoe op 23-04-2010 12:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

As stated before: je stelt de verkeerde vraag.

Wat wil je? Als je geinclude file instellingen zijn weet je waarschijlijk de namen van de variabelen, als niet alles perse genoemd hoeft de zijn, gebruik de isset() constructie, of gebruik een .ini bestand .i.p.v. php code.
Of maak 1 variabele met alles erin $settings[] met key-value pairs, of een string $settings = "blabla\nblabla", of maak een object ervan, of....
nouja, genoeg opties, maar je vraag lijkt niet op iets zinnigs te duiden, wat wilde je nou feitelijk bereiken en waarom dacht je dat dit de weg was om te gaan?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Volgens mij durft de TS niet meer te reageren, wel jammer want ik ben nog steeds erg benieuwd naar wat het idee was...

Acties:
  • 0 Henk 'm!

  • robbert15
  • Registratie: September 2009
  • Laatst online: 19-02 22:36
Sorry had het erg druk de laatste tijd, daarom kon ik niet reageren.

Het idee erachter was om te kijken hoe goed de beveiligingen van sommige van mijn websites zijn en te kijken of deze via de file include functie niet uit te lezen zijn in een php scriptje.

(Oja en de haakjes in het voorbeeld komen omdat ik het gewend ben zo te doen, ik weet dat het zonder kan maar zo is het mij aangeleerd ;) )

En heel erg bedankt voor de vele reacies mensen ;)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als een ander een uitvoerbare file op je server krijgt heb je denk ik een veel groter probleem dan dat ze eventueel je scripts kunnen bekijken.

[ Voor 6% gewijzigd door Cartman! op 24-04-2010 19:18 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 20:57

MueR

Admin Tweakers Discord

is niet lief

robbert15 schreef op zaterdag 24 april 2010 @ 17:44:
ik weet dat het zonder kan maar zo is het mij aangeleerd ;)
Dan vraag ik me serieus af wat voor programmeur jou dit heeft aangeleerd. Die haakjes bij het assignen van variabelen worden eigenlijk alleen gebruikt in ternary operators. Ik kan me ook geen enkel boek oid herinneren wat het zo aanleert.

Oh ja, verder met Cartman

[ Voor 3% gewijzigd door MueR op 24-04-2010 23:00 ]

Anyone who gets in between me and my morning coffee should be insecure.

Pagina: 1