[PHP] Define probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
Beste tweakers,

Ik ben al een tijdje bezig met een websitetje, daarvoor gebruikte ik eerst statische config files voor de user rechten. Deze is als volgt opgebouwd:
PHP:
1
2
3
4
5
6
define("VISITOR", 1 );
define("USER", 2 );
define("MODERATOR", 4 );
define("ADMIN", 64 );

define("ADMIN_VIEW_ADMIN_PANEL",                ADMIN );


Aan de hand van die gegevens zet de volgende functie het om in true or false
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function isUserAuthorized( $sectionlevel )
{

    // controleer of de sessie gegevens aanwezig zijn
    if( !isset( $_SESSION["slevel"] ) )
    {
        // de sessie gegevens zijn niet aanwezig
        return false;
    }
 
    // haal het gebruikersniveau op (in integer formaat)
    $userlevel = intval( $_SESSION["slevel"] );
 
    // ok, hier gebeurd de werkelijke magic ;-) We gebruiken de bitwise AND operator!
    // controleer of de gebruiker toegang heeft tot de sectie
    return ( $userlevel & $sectionlevel ) > 0 ;
}


Nu wou ik een stapje verder gaan, ik wou de gegevens dynamisch maken, gewoon voor de gebruiksvriendelijkheid. Nu is het plan om die gegevens uit de database te halen, maar om te testen of de functie ook met variabele werkt heb ik eerst het volgende gedaan
PHP:
1
2
3
$test1 = "ADMIN_VIEW_ADMIN_PANEL";
$test2 = ADMIN;
define($test1,$test2);


En dat werkte zoals het hoorde, alles werd nog steeds gecontroleerd. Maar toen ging ik de gegevens uit de database halen en ineens doet die het niet meer.

Wat heb ik gedaan, ik heb 2 variable's die gevuld zijn met de juiste informatie.
Dit resultaat van de variable krijg ik als ik deze echo
PHP:
1
2
$description = ADMIN_VIEW_ADMIN_PANEL
$section2['tbl_userright_definition'] = ADMIN


en ze staan als volgt in het script
PHP:
1
2
define("ADMIN", 64 );
define($section2['tbl_userright_definition'],$description);


En ik heb ook al gecontroleerd of ik userlevel 64 heb, en die heb ik. en toch krijg ik niet de toegang tot de pagina.

Iemand enig idee wat er fout gaat? Alvast bedankt!

[ Voor 1% gewijzigd door nickb90 op 14-01-2010 11:21 . Reden: Iets meer informatie ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Variabele constanten. Zie je de discrepantie in die twee woorden? ;)

Ik denk dat je dit helemaal niet zo moet willen doen. Sowieso moet je dan de constant-functie gebruiken bij elke plaats waar je een "constante" wil gebruiken.

'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!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

code:
1
define($section2['tbl_userright_definition'],$description);

Wat doet dit precies? Defineert dit nu het nummer 64 met de description? Als je dit soort zaken wilt gebruiken dan gebruik je geen defines. Voor het uitvoeren van de daadwerkelijk code worden alle defines 1 op 1 vervangen met hun waarde. Als jij dus doet:
PHP:
1
define(64, "omschrijving");

Dan wordt voor het uitvoeren van je PHP bestand alle voorkomens van 64 1 op 1 vervangen met "omschrijving", en dat is vast niet wat je wil ;) Als je zaken vanuit een database wilt laten, stop dat dan gewoon in een variabele en gebruik daar geen defines voor, daar zijn ze niet voor bedoeld en ze gedragen zich lang niet altijd als een variabele.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

Ik zal je even laten zien wat je doet:
PHP:
1
2
3
4
5
$description = ADMIN_VIEW_ADMIN_PANEL; // $description = 64
$section2['tbl_userright_definition'] = ADMIN; // $section2['tbl_userright_definition'] = 64

define($section2['tbl_userright_definition'],$description);
// define(64, 64);
Gefeliciteerd, je hebt zojuist de waarde van 64 gedefineerd.

Maar even serieus. Toevallig heb ik vorige week met collega NMe hier over lopen babbelen, puur ter vermaak en als gedachtenoefening. Uiteraard met het volledige besef dat het dynamisch aanmaken van constanten niet het meest briljante idee op aarde is. Dat PHP het uberhaupt toestaat is idioot.

Wat jij moet hebben is een token based systeem, of een bitmask.

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


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

MueR schreef op donderdag 14 januari 2010 @ 11:39:
Wat jij moet hebben is een token based systeem, of een bitmask.
Psst, hij gebruikt al een bitmask. Alleen is deze dynamische manier van daar betekenis aan geven niet de meest logische. :P
MueR schreef op donderdag 14 januari 2010 @ 11:39:
Toevallig heb ik vorige week met collega NMe hier over lopen babbelen, puur ter vermaak en als gedachtenoefening. Uiteraard met het volledige besef dat het dynamisch aanmaken van constanten niet het meest briljante idee op aarde is. Dat PHP het uberhaupt toestaat is idioot.

[ Voor 43% gewijzigd door NMe op 14-01-2010 11:50 ]

'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!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

NMe schreef op donderdag 14 januari 2010 @ 11:44:
[...]

Psst, hij gebruikt al een bitmask. Alleen is deze dynamische manier van daar betekenis aan geven niet de meest logische. :P
Klopt. Hij gebruikt het bitmask alleen verkeerd om. Hij zegt per pagina welk accessniveau er in mag, wat dus niet hendig is wanneer hij plotseling besluit een groep aan te maken die weer een private page moet kunnen hebben. Permissies in deze wil je eigenlijk op de groep leggen, hence token based. Maar als je echt een bitmask wil gebruiken, zet dan iig de bitmask op de groep, niet op een page. If ($level > 2) is nou niet echt de meest ideale oplossing.

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


Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
Wat een snelle reactie's en van allemaal mods. Dan moet het niveau van antwoorden wel hoog zijn ;)

Ik denk dat het nu wel duidelijk is dat de manier waarop ik werk niet de beste methode is :P Zoals jullie eigenlijk allemaal zeggen is het niet het meest briljante idee hoe ik wil werken maar het leek me wel de meest gebruiksvriendelijke manier. en voor mezelf de meest makkelijke manier. Echter blijkt het toch niet zo gebruiksvriendelijk te zijn als gehoopt.

Gezien de problemen waar ik tegenaan loop ga ik is nadenken hoe ik het dan wil doen, bij het oude systeem blijven of dan toch maar is helemaal opnieuw beginnen en een veel efficiëntere manier te verzinnen om dergelijke actie's te controleren. Mede omdat deze manier een hoop onnodig geheugen wegneemt van de webserver (ik heb momenteel 58 sectie's die gedefinieerd worden).

Ik wil jullie allen bedanken om me weer even wakker te schudden en het duidelijk uitleggen van mijn manier van werken niet echt de beste is.

Nogmaals bedankt voor de snelle reactie's

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

Als je een echt gebruiksvriendelijke manier wil, ga je naar tokens en rollen toe. Wat leest nou makkelijker?
PHP:
1
2
3
4
5
if (isAuthorized(ADMIN_VIEW_ADMIN_PANEL)) // is userlevel >= 64?
  doStuff();
// of 
if (hasToken('acp_view_admin_panel'))
  doStuff();

Daarbij moet je bij de eerste manier wel constant onthouden welke niveaus nou ook weer wat waren. Bij token based systemen maakt het niet uit, iemand heeft een token of niet, ongeacht niveau.

Token based systemen zijn relatief simpel te maken. Je hebt een tabel Token nodig, en een koppeltabel UserToken. Als je het goed opzet kan je zelfs zorgen dat niet-toegewezen tokens automagisch bij een user terecht komen (user 1 ofzo :p). Je kan vrijwel oneindig nieuwe tokens aanmaken, eventueel alles netjes onderbrengen in diverse rollen om het voor jezelf wat makkelijker te maken om alles toe te wijzen.

[ Voor 33% gewijzigd door MueR op 14-01-2010 11:59 ]

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


Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
ik heb zelf nog nooit van een token based systeem gehoord (*schaam schaam*), ik zal me daar ook is in verdiepen. Zal ook is kijken wat de extra mogelijkheden zijn nu ik toch met een database wil werken.

Ik moet me toch verder verdiepen in dingen, waardoor dingen efficiënter worden. Maar dat token based ga ik me echt is in verdiepen, ziet er wel goed uit :) bedankt!

Edit
Ik heb bijvoorbeeld even snel wat nieuws gemaakt, dat werkt, maar wat vinden jullie ervan?

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
function isUserAuthorized( $sectionlevel )
{
    global $mysqli;
    // Dan de bepaalde sectie uit de database halen
    $sql = "SELECT
                        tbl_userright_id
            FROM
                        tbl_userright
            WHERE
                        tbl_userright_definition = '".$sectionlevel."'";
    $section = $mysqli->query($sql);
    $section2 = $section->fetch_assoc();

    // En dan gaan we kijken of het userlevel van de gebruiker toegang heeft tot die pagina
    $sql = "SELECT
                        tbl_userlevel_id
            FROM
                        kpl_userlevelid_userrightid
            WHERE
                        tbl_userright_id = ".$section2['tbl_userright_id']."
                AND
                        tbl_userlevel_id = ".$_SESSION['slevel']."";
    $authorized = $mysqli->query($sql);
    if($mysqli->affected_rows == 1){
        return true;
    }
    else    {
        return false;
    }

}


De beveiliging zit er nog niet in maar kben ook nog nieuw met mysqli, maar het gaat even om het idee achter het script

edit2:
$mysqli->affected_rows toegevoegd

[ Voor 65% gewijzigd door nickb90 op 14-01-2010 12:15 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Creepy schreef op donderdag 14 januari 2010 @ 11:38:
code:
1
define($section2['tbl_userright_definition'],$description);

Wat doet dit precies? Defineert dit nu het nummer 64 met de description? Als je dit soort zaken wilt gebruiken dan gebruik je geen defines. Voor het uitvoeren van de daadwerkelijk code worden alle defines 1 op 1 vervangen met hun waarde. Als jij dus doet:
PHP:
1
define(64, "omschrijving");

Dan wordt voor het uitvoeren van je PHP bestand alle voorkomens van 64 1 op 1 vervangen met "omschrijving", en dat is vast niet wat je wil ;)
Dit is ook helemaal niet hoe het werkt. Defines in PHP werken niet als een soort preprocessor zoals in C++ (waar je overigens ook geen nummers kunt herdefinieren). Hij werkt slechts met identifiers, en daar "64" geen geldige identifier is zal die ook niet standaard gesubstitueerd worden (en moet je constant("64") gebruiken). Maar ook iets als "if" kun je niet herdefiniëren. De enige dingen die daadwerkelijk gereplaced worden zijn identifiers die geen keywords zijn en niet beginnen met een $, en het resultaat zal altijd evalueren naar een waarde (dus iets als define("bla", "for") en dan bla($i = 0; $i < 10; $i++) zal ook niet werken)

[ Voor 14% gewijzigd door .oisyn op 14-01-2010 12:31 ]

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!

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

NMe

Quia Ego Sic Dico.

Waarom zeg je eerst dat je je eens gaat verdiepen in tokens en gebruik je vervolgens alsnog een incrementeel rechtensysteem? :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!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
NMe schreef op donderdag 14 januari 2010 @ 12:33:
Waarom zeg je eerst dat je je eens gaat verdiepen in tokens en gebruik je vervolgens alsnog een incrementeel rechtensysteem? :P
ik ga me nog verdiepen ;) vroeg me alleen af of dit even als tijdelijke oplossing kan dienen. Als ik me ergens in ga verdiepen duurt het altijd even voordat ik het idee door heb :P

moet eerst nog een goede tutorial o.i.d. vinden, maar het gaat er iig wel komen :) als ik jullie zo hoor dan moet het wel een stuk beter zijn :P

[ Voor 14% gewijzigd door nickb90 op 14-01-2010 13:01 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

Stel, ik heb in mn database staan dat ik deze tokens heb:
[list]• acp_access-panel
• acp_user-management_create-user
• acp_user-management_ban-user
Dan zet ik die toch gewoon in een array, waarbij ik alleen maar in mn code hoef te kijken of $token wel in $userTokens zit?

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


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

nickb90 schreef op donderdag 14 januari 2010 @ 12:47:
[...]

moet eerst nog een goede tutorial o.i.d. vinden, maar het gaat er iig wel komen :) als ik jullie zo hoor dan moet het wel een stuk beter zijn :P
Niet per se hoor. Tokens zijn al snel goed bij een breed scala aan toepassingen, maar afhankelijk van je probleem is een simpel bitmaskje of juist een compleet ACL-systeem mogelijk beter. ;)

Wat tokens betreft:
  • Tabel voor users
  • Tabel voor user groups
  • Tabel voor tokens
  • Koppeltabel tussen users en user groups
  • Koppeltabel tussen user groups en tokens
Vervolgens een class maken die in de constructor alle tokens ophaalt die een user volgens zijn groups heeft, en die token names in een array zetten. Dan nog een functie maken die kijkt of een doorgegeven string in dat array voorkomt. Zo ja: toegang. Zo nee: geen toegang. Eventueel kun je nog een regeltje toevoegen aan de HasToken-functie die voordat hij false returnt ook nog even een nieuwe token toevoegt aan de database als die token nog niet bestond, zodat je bij uitbreidingen van je systeem alleen maar even naar de nieuwe pagina toe hoeft te browsen om vervolgens rechten ervoor te kunnen zetten. :)

'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!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

NMe schreef op donderdag 14 januari 2010 @ 13:28:
Eventueel kun je nog een regeltje toevoegen aan de HasToken-functie die voordat hij false returnt ook nog even een nieuwe token toevoegt aan de database als die token nog niet bestond, zodat je bij uitbreidingen van je systeem alleen maar even naar de nieuwe pagina toe hoeft te browsen om vervolgens rechten ervoor te kunnen zetten. :)
En als je lui bent: Zorg dat deze automatisch worden toegewezen aan een superuser. Dit is een hardcoded userid of groupid ;)

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


Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
@NMe,

Bedankt voor de duidelijke uitleg, op internet wordt het niet zo duidelijk uitgelegd vind ik persoonlijk, maar jou uitleg is helder en duidelijk ;)

Ik ga morgen er even mee verder klooien, is kijken of ik er dan een mooi systeempje mee kan maken ;) nu eerst weer even huiswerken xD

Normaals allemaal heel erg bedankt ^^ leerzaam ochtendtje geweest zo! thanks!

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

nickb90 schreef op donderdag 14 januari 2010 @ 13:57:
@NMe,

Bedankt voor de duidelijke uitleg, op internet wordt het niet zo duidelijk uitgelegd vind ik persoonlijk, maar jou uitleg is helder en duidelijk ;)
De uitleg is er ook op internet wel, maar je zoekresultaten worden geheid nogal vervuild door security tokens. Ik weet uit ervaring hoe lastig het kan zijn hier info over te vinden. :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.

Pagina: 1