PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Großes PHP-Problem


darph
2005-10-01, 01:57:30
Ich bastel gerade die Recheverwaltung zusammen.

Hier mal der relevante Auszug aus der Userklasse:


<?php
define("PERMISSION_NONE", 0x0001); // Don't touch. Don't look. Banned usernames par example.
define("PERMISSION_GUEST", 0x0002); // Guests may look, but not intefere
define("PERMISSION_POST", 0x0004); // Write entries/articles/posts
define("PERMISSION_COMMENT", 0x0008); // Write comments on published entries
define("PERMISSION_EDIT", 0x0010); // Edit entries and comments
define("PERMISSION_ADMIN", 0x0020); // Administrate the plock


class User
{
private $permission = PERMISSION_GUEST;

public function addPermission($myPermission)
{
if (User::isPermission($myPermission))
{
$this->permission |= $myPermission;
return TRUE;
}
return FALSE;
}

public function stripPermission($myPermission)
{
if (User::isPermission($myPermission))
{
$this->permission &= $myPermission;
return TRUE;
}
return FALSE;
}

public function isPermission($myPermission)
{
return ( ($myPermission & (PERMISSION_NONE | PERMISSION_GUEST
| PERMISSION_POST | PERMISSION_COMMENT
| PERMISSION_EDIT | PERMISSION_ADMIN)) == $myPermission);
}

BenutzerRecht wird aus einer Datenbank ausgelesen.

So.

Jetzt hab ich für jedes "Recht" eine Checkbox. Diese überprüfe ich wie folgt:


if ($_POST["perm_none"] == "set") {
echo("+");
$user->addPermission(PERMISSION_NONE);
} else {
echo("-");
$user->stripPermission(PERMISSION_NONE);
}

So. Das mache ich für jedes Recht und führe dann eine update() Methode aus, die das ganze in die Datenbank prügelt.


Wenn ich jetzt überall einen Haken hin mache, dann geht das auch.

Nehmen wir also an, wir haben einen User, der alle Rechte hat (also auch gebannt ist, aber egal).

Dann gehe ich hin und entziehe dem User die Adminrechte.

Ergebnis:
Er hat keine Rechte, außer dem Adminrecht.

Warum?

huha
2005-10-01, 02:03:39
Bei STRIP_PERMISSION muß der Input vor der Verarbeitung invertiert werden, weil du ja mit einem AND arbeitest.

Beispiel:


Rechte:
101101
Entziehen:
001000

AND-Gatter:
101101
001000
-------
001000

...womit du genau das Gegenteil dessen erreicht hast, was du gern hättest ;)

Invertieren des Inputs:
110111

und nun:

AND-Gatter:
101101
110111
--------
100101



-huha

Kinman
2005-10-01, 03:29:34
was ich net check is:
aus der isPermission Funktion bekommst du ja keinen ja/nein Wert zurück (sondern je nach Permission eine andere Bitmask), verwendest sie aber trotzdem in der if Abfrage.
Oder täusch ich mich.

mfg Kinman

darph
2005-10-01, 03:38:04
was ich net check is:
aus der isPermission Funktion bekommst du ja keinen ja/nein wert zurück, verwendest sie aber trotzdem in der if abfrage.
Oder täusch ich mich.

mfg Kinman
Öhm... doch.

Ich gebe true oder false zurück, wenn es eine Erlaubnis ist. Damit ich man einfach addPermission(12342689128347) ausführen kann.

Kinman
2005-10-01, 03:40:38
achso, ich depp hab == $myPermission überlesen :(

Sephiroth
2005-10-01, 14:11:53
Ich bastel gerade die Recheverwaltung zusammen.

Hier mal der relevante Auszug aus der Userklasse:


<?php
define("PERMISSION_NONE", 0x0001); // Don't touch. Don't look. Banned usernames par example.
define("PERMISSION_GUEST", 0x0002); // Guests may look, but not intefere
define("PERMISSION_POST", 0x0004); // Write entries/articles/posts
define("PERMISSION_COMMENT", 0x0008); // Write comments on published entries
define("PERMISSION_EDIT", 0x0010); // Edit entries and comments
define("PERMISSION_ADMIN", 0x0020); // Administrate the plock


class User
{
private $permission = PERMISSION_GUEST;

public function addPermission($myPermission)
{
if (User::isPermission($myPermission))
{
$this->permission |= $myPermission;
return TRUE;
}
return FALSE;
}

public function stripPermission($myPermission)
{
if (User::isPermission($myPermission))
{
$this->permission &= $myPermission;
return TRUE;
}
return FALSE;
}

public function isPermission($myPermission)
{
return ( ($myPermission & (PERMISSION_NONE | PERMISSION_GUEST
| PERMISSION_POST | PERMISSION_COMMENT
| PERMISSION_EDIT | PERMISSION_ADMIN)) == $myPermission);
}

BenutzerRecht wird aus einer Datenbank ausgelesen.

So.

Jetzt hab ich für jedes "Recht" eine Checkbox. Diese überprüfe ich wie folgt:


if ($_POST["perm_none"] == "set") {
echo("+");
$user->addPermission(PERMISSION_NONE);
} else {
echo("-");
$user->stripPermission(PERMISSION_NONE);
}

So. Das mache ich für jedes Recht und führe dann eine update() Methode aus, die das ganze in die Datenbank prügelt.


Wenn ich jetzt überall einen Haken hin mache, dann geht das auch.

Nehmen wir also an, wir haben einen User, der alle Rechte hat (also auch gebannt ist, aber egal).

Dann gehe ich hin und entziehe dem User die Adminrechte.

Ergebnis:
Er hat keine Rechte, außer dem Adminrecht.

Warum?
OK, ich dachte zuerst das liegt an deinem Forumal, liegt aber an stripPerm()

bei deinem Beispiel (bei allem ein Haken) sieht das dann ja so aus:

111111 &= 100000

und du erhälst als Ergebnis (zurecht!) 100000 wieder. Du mußt ein XOR (^) nehmen!
& heißt es wird/werden das Bit/die Bits gesetzt, die bei $a und $b gesezt sind - das ist bei diesem Fall ja hier nur das höchstwertigste Bit und somit kommst du wieder auf deine Admin-Permission 100000.
Bei XOR (^) kommst du eben auf 011111, so wie du es dir gedacht hast.