Seite 1 von 1

Hilfestellung für request_var()

Verfasst: 05.05.2015 22:39
von Kirein
Hallo Miteinander,

Ich habe gerade freudig das Board meiner Star Citizen Organisation von 3.0.13 auf 3.1.4 geupdatet.
Mit erschrecken stellte ich nun aber leider fest das meine Session Nutzung die ich für eine Interne Datenbank dieser Star Citizen Organisation nutze nicht mehr funktioniert.

Leider ist mein PHP bei weitem nicht so gut wie ich es mir wünschen würde und so versteh ich leider nur Bahnhof wenn ich auf phpbb.com oder .de nach "request_var()" oder ähnlichen Suche um mein Problem selbst zu lösen.

Ich wäre mehr als Dankbar wenn sich einer von euch vielleicht die wenigen Minuten nimmt um einen kleinen Codeschnipsel von mir in eine für 3.1.x funktionierende Form umschreiben könnte. Ich möchte ungern einen Rollback machen müssen deshalb. Aber alleine komme ich aus diesem Sandloch nicht mehr raus.

Die folgende Abfrage nutze ich um die Foren User ID des aktuell in diesem Browser angemeldeten Benutzers auszulesen. Darauf baue ich dann weitere Abfragen auf, aber sobald ich wieder den aktuell angemeldeten Nutzer auslesen kann sollte alles wie gewohnt gehen. Leider ist mein Script dem "Verlust" der super globals zum Opfer gefallen.
Illegal use of $_COOKIE. You must use the request class or request_var() to access input data. Found in /..../webseiten/fc/internal/authorization.php on line 18. This error message was generated by deactivated_super_global.
Hier nun der Code Schnipsel.

Code: Alles auswählen

/* Login Check*/
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : '../forum/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);

$user->session_begin();
$auth->acl($user->data);
$user->setup();

if ($user->data['user_id'] == ANONYMOUS) { $sessioncheck = FALSE; }
else { $sessioncheck = TRUE; }
$logoutid = $user->data['session_id'];


// Cookie Daten
<Anderer Code>
$user_id = $user->data['user_id'];

Mit besten Grüßen
Christian 'Kirein' R.

Re: Nutzung der phpBB Session mit phpBB 3.1.x

Verfasst: 05.05.2015 23:03
von Elsensee
Es gibt ein globales Objekt $request, welches glücklicherweise ein Objekt der Request-Klasse ist, wie es von dir in der Fehlermeldung erwartet wird. ;)

Statt also:

Code: Alles auswählen

$id = $_COOKIE['the_id']; 
benutzt du:

Code: Alles auswählen

$id = $request->variable('the_id', 0, false, \phpbb\request\request_interface::COOKIE); 
Eigentlich ist der Code viel kürzer, aber du willst ja einen Cookie auslesen. :P
Du hast es vielleicht schon erkannt, aber the_id ist hierbei der Name des Cookies.
Was du vermutlich nicht erkannt hast, ist der zweite Parameter - eine 0.
Die 0 ist der Standard-Wert und gibt auch den Typ an. In diesem Fall soll der Wert vom Typ integer sein. Ist der Wert eigentlich vom Typ string musst du halt einen String reingeben, aber IDs sind für mich eigentlich integer, deswegen nahm ich das einfach so an.
Gibt es den Cookie also nicht, wird auf 0 zurückgefallen.. Gibt es den Cookie, aber der Wert ist vom Typ String, obwohl er das eigentlich nicht sein sollte, wird der Wert in einen Integer umgewandelt.

Es sind die kleinen Dinge, die den Code sicherer machen können. :)

Re: Nutzung der phpBB Session mit phpBB 3.1.x

Verfasst: 05.05.2015 23:15
von Kirein
HI Elsensee,

Danke schonmal für deine Hilfe, aber ich habe wenige Minuten bevor ich deine Antwort gesehen habe verstanden das mein Problem viel tiefgreifender ist.
Ich verwende auf der Seite mehrmals $_Cookie, $_Get und $_Post. Das wird ein viel größerer Spaß als ich "erhofft" hatte denn es scheint, soweit ich das verstehe ja am

Code: Alles auswählen

define('IN_PHPBB', true); 
zu liegen.

Sehe ich das richtig das auf jeder Seite (also alle) wo diese Zeile Eingebunden ist ich keinen direkten Zugriff mehr auf $_Cookie, $_Get und $_Post habe. Heisst ich darf den gesamten Bereich umschreiben und für jede dieser Variablen ein "Request" machen. - richtig?

Kann mir bitte noch jemand erklären wofür das false in der zeile steht?

Code: Alles auswählen

$id = $request->variable('the_id', 0, false, \phpbb\request\request_interface::COOKIE); 
Mit besten Grüßen
Christian 'Kirein' R.


PS:
Das meiste habe ich bereits wieder zum laufen bekommen. Nur die ganzen $_POST's dauern etwas länger ;) Danke!

Re: Nutzung der phpBB Session mit phpBB 3.1.x

Verfasst: 06.05.2015 10:41
von gn#36
Nein, das define sorgt nur dafür, dass phpBB in den eingebundenen Dateien (include) weiß, dass die Einbindung seine Richtigkeit hat und nicht irgend ein Hacker versucht, die Datei direkt aufzurufen und sein Schindluder damit zu treiben. Die Abschaltung der Superglobalen erfolgt erst in einem der includes dahinter.

Aber dass die Superglobalen nicht mehr funktionieren ist in der Tat beabsichtigt. Das ist ja auch in phpBB 3.0 schon nicht gerne gesehen. request_var sollte noch funktionieren, ist aber auch unerwünscht und wird über kurz oder lang nicht mehr funktionieren und sollte daher idealerweise auch durch $request ersetzt werden.

Für die meisten Variablen kommst du aber einfach per $request->variable('name', standardwert) an die Daten. Bei Strings brauchst du ggf. noch einen dritten Parameter true, um Sonderzeichen zu erlauben (das ist auch die Antwort auf deine Frage zu dem false, das ist nur für Strings wichtig). Für eine Funktionsbeschreibung siehe unsere Xref für phpBB 3.1.x. Für $_SERVER gibt es eine eigene Methode: $request->server('VARIABLE', standardwert). Selbiges gilt für hochgeladene Dateien.

Re: Nutzung der phpBB Session mit phpBB 3.1.x

Verfasst: 06.05.2015 21:59
von Kirein
Ok, und wiedereinmal stecke ich in einer Sackgasse.

Wie mache ich den Request für ein Array?
Vorher sah mein Code so aus:

Code: Alles auswählen

$PurposeID = implode(", ", $_POST['addship_purpose']);
Die Post variable bzw das Array (addship_purpose[]) stammt aus einem Multi-Select Feld mit Werten aus einer DB Spalte mit Integer Werten.
Habs schon Kraft meiner unwissenheit in diversen Formen versucht aus dem $request->variable mein Array in der Form wie aus $_POST zu erhalten aber leider vergebens, am Implode erhalte ich immer die Fehlermeldung eines Falschen Datenwerts (weil vermutlich kein Array geliefert wird)

Schonmal vielen Dank, auch wenn es mittlerweile um viel mehr als eine Session geht. Ich versuche mal das Thema umzubennen.

Re: Hilfestellung für request_var()

Verfasst: 09.05.2015 00:21
von gn#36
Datentyp eines Arrays ist array(), wobei du aber auch noch den Datentyp des Inhalts des Arrays mit angeben musst, weshalb du z.B. array('') oder was ähnliches benutzen kannst.

Also z.B. $request->variable('name',array(''), true);