bobby: PDO problem mit BIT-Werten und prepared Statements

Beitrag lesen

Moin,

MySQL hat eingebauten Support für Prepared Statements, du musst sie nicht emulieren.

habe ich auch schon bemerkt. Diesen Workaround hatte ich nur als möglichen Lösungsansatz in diversen Foren gelesen.

$rigths=1111111111111111111111111111111111111111111111111111111111111111;

Kann es sein, dass dein Integer hier überläuft, sprich größer als PHP_INT_MAX wird? Und bist

Das ist das Problem. MySQL kann 64bit für BIT-Datentyp. Mein PHP läuft auf 32 Bit und hat deshalb nen INT-Zahlenüberlauf. Deshalb lasse ich mir die Rechte als Zeichenkette zurückgeben aus der DB oder setze diese händisch als Zeichenkette. Also

$rigths="1111111111111111111111111111111111111111111111111111111111111111";

Dann übergebe ich die Zeichenkette an das MySQL und interpretiere diese über die BIN() Funktion von MySQL als eine Binäre Zahl. Das funktioniert wunderbar. Ich wollte die Rechtevergabe halt als Bitmaske machen, da mir MySQL mit 64 Bit doch genügend Spielraum lässt. So kann ich 64*64 Module behandeln. Sollte dies zu wenig sein, füge ich noch eine Rechteebene hinzu. (64x64x64)

PHP kennt ab 5.4 auch eine Literalschreibweise für Binärwerte: 0b10101010;

Gibt es da nicht auch den Überlauf wenn PHP auf 32 Bit läuft?

Nun ist das problem, dass die bitweise operation nur dann funktioniert, wenn die rechte entweder als Zahl oder als BitWert übergeben wurden.

Was hindert dich an der Übergabe einer Zahl, die deine Bitfolge repräsentiert?

Habe ich nun gemacht. Ich musste MySQL nur sagen, dass dies eine BIT-Folge ist (über die BIN()-Function)

Wenn ich die BIT-Folge direkt übergeben möchte, muss ich dieser ja ein " b' " voranstellen.

Ich könnte nun

$rigths=1111111111111111111111111111111111111111111111111111111111111111;
$queryVars->clause .= " AND (b'".$rights."  & mg.group = mg.group OR kta_modules.modulgroup=0)";

notieren, was aber höchst unsicher ist.

Nein, warum? Wenn du eine Zahl garantierst, kann da keine Unsicherheit in Form einer SQL-Injection auftreten.

Da ist wieder das Problem des Überlaufs (32bit zu 84 bit). Das hatte ich natürlich auch probiert.

Na und zu den restlichen Versuchen hast du ja alles gesagt.

Gruß Bobby

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)