phpbb2 login auf fremder Website bleibt nicht gespeichert

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB2 oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
CosmoPhobia
Mitglied
Beiträge: 15
Registriert: 09.03.2008 22:41

phpbb2 login auf fremder Website bleibt nicht gespeichert

Beitrag von CosmoPhobia »

Hallo Community.

Ich habe 2 Fragen, von denen ich hoffe, sie hier beantwortet zu bekommen.

1.
Was sind die gravierenden Unterschiede zwischen phpbb2 und phpbb3. Sollte man auch Sicherheitsgründen phpbb3 nehmen ? Oder was bietet es für Vorteile ?

2.
Momentan nutze ich phpbb2 mit dieser Mod "phpbb Login auf fremder Website". Das Problem bei mir ist nur, dass der Login bei einer php Datei nicht gespeichert bleibt.
Hier erstmal der Code:

Code: Alles auswählen

<?php
if ( $userdata['session_logged_in'] ) 
{ 
include "forum/config.php";
	$connect = mysql_connect($dbhost, $dbname, $dbpass);
	mysql_select_db($dbname, $connect);
	
    $sql = "SELECT * FROM cars ORDER BY id DESC;";
	$result = mysql_query($sql) OR die(mysql_error());

    while($row = mysql_fetch_assoc($result)) 
	{
	$fahrzeug[$row[id]] = $row[kategorie];
	$preis[$row[id]] = $row[preis];
	$beschreibung[$row[id]] = $row[beschreibung];
    }
?>

<table>
 <tr>
  <td><u>Fahrzeuge</u></td></tr>
 <tr><form method="post" action="fuhrpark.php" name="fahrzeug_kaufen">
  <td><input type="text" size="2" name="menge_fahrzeug1"></td>
  <td width="150"><?php echo htmlentities($fahrzeug[1]); ?></td><td width="100"><?php echo $preis[1]; ?> EUR</td>
  <td><?php echo htmlentities($beschreibung[1]); ?></td></tr>
 <tr>
  <td><input type="text" size="2" name="menge_fahrzeug2"></td>
  <td width="150"><?php echo htmlentities($fahrzeug[2]); ?></td><td width="100"><?php echo $preis[2]; ?> EUR</td>
  <td><?php echo htmlentities($beschreibung[2]); ?></td></tr>
 <tr>
  <td><input type="text" size="2" name="menge_fahrzeug3"></td>
  <td width="150"><?php echo htmlentities($fahrzeug[3]); ?></td><td width="100"><?php echo $preis[3]; ?> EUR</td>
  <td><?php echo htmlentities($beschreibung[3]); ?></td></tr>
  <tr><td><input type="hidden" name="redirect" value="index.php?section=fuhrpark">
  <input type="submit" name="kaufen" value="Kaufen"></form></td></tr>
 </table>
<?php

$ergebnis1 = $_POST['menge_fahrzeug1'];
$ergebnis2 = $_POST['menge_fahrzeug2'];
$ergebnis3 = $_POST['menge_fahrzeug3'];

echo "$ergebnis1"."$ergebnis2"."$ergebnis3";
}
else
{
echo "Nicht eingeloggt";
}
 
?>
Das Problem hierbei ist also, wenn ich das Formular bestätige, kommt, obwohl ich eingeloggt bin, die else Schleife ganz unten. Warum das ? Gibt es eine Zeile, die ich in jeder externen php Datei oben hinschreiben muss ?

Danke für eure Hilfe schonmal im Voraus.
Gruß[/quote]
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Zu 1.

Was die Sicherheit angeht, hat keine von beiden Versionen der anderen etwas voraus, phpBB2 ist schon lange "im Amt" und deswegen von weitestgehend allen Sicherheitslücken befreit (weitestgehend weil man nie weiß was man übersehen hat bis es jemand ausnutzt oder man zufällig darüber stolpert). PhpBB3 gibt es auch schon ein bisschen und hat Security Audits (mindestens eines, es kann sein mehr) hinter sich die keine Probleme zeigten, außerdem werden beide noch weiterentwickelt/ausgebessert. Wenn du neu einsteigst, würde ich phpBB3 nehmen, wenn du schon ein phpBB2 hast brauchst du aber nicht umsteigen.

Zu 2.
Du hast - wenn das der vollständige Code ist - das was in der KB steht (KB:phpbb_seite) nicht vollständig umgesetzt. Die in der IF Schleife abgefragte Bedingung kann niemals erfüllt sein, weil die Variable nicht existiert, sie muss erst angelegt werden. Baue deinen Code lieber in die Vorlage ein. So wie das ist wäre der Code außerdem unsicher, wenn register_globals eingeschaltet ist, da dir dann jeder vorgaukeln kann, dass er eingeloggt ist indem er ein Array mit dem Namen userdata übergibt das den entsprechenden Inhalt enthält.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
CosmoPhobia
Mitglied
Beiträge: 15
Registriert: 09.03.2008 22:41

Beitrag von CosmoPhobia »

Hey, danke erstmal für deine Tips.
Die Datei, die ich in meinem 1. Beitrag geschrieben habe (ja das ist der vollständige Code), ist in eine index.php eingebunden, und in dieser habe ich alles nach den Vorlagen auf der KB gemacht. Die jetzige php-Datei habe ich dort lediglich per include eingefügt, und lasse diese über GET Parameter aufrufen. Ich habe schon versucht dort die Variable session_pagestart usw. einzufügen, aber dann spuckt er wieder einen Fehler aus, vonwegen session_pagestart wäre schon aktiv o.ä.

Mit Sicherheiten etc. kenne ich mich, wie man vllt sieht, nicht aus. Was müsste ich denn zu dem Code hinzufügen oder wie müsste ich ihne verändern, damit man über register_globals nicht mehr anders reinkommt ?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Verlink doch mal die andere Datei in der du das da einbindest, dann kann ich vielleicht mehr zu den Problemen sagen.

Generell sollte man niemals "einfach so" auf Variablen egal welcher Art zugreifen. Wenn man eine Datei einbindet per include, dann sollte man ganz oben in dieser Datei verhindern, dass die Datei direkt aufgerufen werden kann. Das geht z.b. durch Verwendung von dem hier:

Code: Alles auswählen

if(!defined('IN_PHPBB'))
{
die('Hacking Attempt!');
}
In jeder phpBB Datei die aufgerufen werden kann ist diese Konstante definiert und das behindert somit keinerlei berechtigte includes. Beim direkten Aufruf dagegen fehlt die Konstante und somit wird die Abarbeitung abgebrochen. Dadurch stellst du sicher, dass die Datei nur bearbeitet werden kann, wenn auch die entsprechenden Daten vorher geladen wurden. Wenn du in der anderen Datei die Standard-Daten einbindest, dann brauchst du allerdings auch nicht mehr den mysql_connect durchführen denn der sollte dann schon automatisch passieren (und du kannst mit $db->sql_query() oder auch mysql_query() zugreifen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
CosmoPhobia
Mitglied
Beiträge: 15
Registriert: 09.03.2008 22:41

Beitrag von CosmoPhobia »

Das mit dem Hacking attemp ist schonmal ein guter Hinweis.
Also, meine index sieht folgendermaßen aus:

Code: Alles auswählen

<?php 
error_reporting (E_ALL);
//Benötigte Dateien und Variablen von phpBB 
define('IN_PHPBB', true); 
$phpbb_root_path = '/Applications/xampp/xamppfiles/htdocs/test/forum/'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 


//Session auslesen und Benutzer-Informationen laden 
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 

    echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n";
    echo "         \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
    echo "<html>\n";
    echo "    <head>\n";
    echo "        <title>Meine Seite</title>\n";
    echo "        <link rel=\"stylesheet\" type=\"text/css\" href=\"page.css\" />\n";
    echo "        <meta http-equiv=\"Content-Type\"
                        content=\"text/html; charset=ISO-8859-1\" />\n";
    echo "    </head>\n";
    echo "    <body>\n";

    echo "        <div id=\"root\">\n"; // ganz oberer Div-Holder
    echo "            <div id=\"banner\">\n"; // banner
    include "menu.php";
    echo "            </div>\n";
    echo "            <div id=\"links\">\n"; // linkes Menu
    include "login.php";
    echo "            </div>\n";
    echo "            <div id=\"mitte\">\n"; // In der Mitte der Inhalt
    include "inhalt.php";
    echo "            </div>\n";
    echo "            <br style=\"clear:both;\" />\n"; // css-float beenden
    echo "       </div>\n";

    echo "    </body>\n";
    echo "</html>\n";



?>


Die inhalt.php, die dort includet wird, sieht so aus:

Code: Alles auswählen

<?php
    if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) {
        include $dateien[$_GET['section']];
    } else {
        include $dateien['startseite'];
    }
?>
Über einen GET Paramenter, die in der config.php definiert sind, greife ich also so auf die andere, oben bereits gepostete Datei zu, hier nochmal, mit define :wink: :

Code: Alles auswählen

<?php
if(!defined('IN_PHPBB')) 
{ 
die('Hacking Attempt!'); 
}

if ( $userdata['session_logged_in'] ) 
{ 
include "forum/config.php";
	$connect = mysql_connect($dbhost, $dbname, $dbpass);
	mysql_select_db($dbname, $connect);
	
    $sql = "SELECT * FROM cars ORDER BY id DESC;";
	$result = mysql_query($sql) OR die(mysql_error());

    while($row = mysql_fetch_assoc($result)) 
	{
	$fahrzeug[$row[id]] = $row[kategorie];
	$preis[$row[id]] = $row[preis];
	$beschreibung[$row[id]] = $row[beschreibung];
    }
?>
<form method="post" action="fuhrpark.php" name="fahrzeug_kaufen">
<table>
 <tr>
  <td><u>Fahrzeuge</u></td></tr>
 <tr>
  <td><input type="text" size="2" name="menge_fahrzeug1"></td>
  <td width="150"><?php echo htmlentities($fahrzeug[1]); ?></td><td width="100"><?php echo $preis[1]; ?> EUR</td>
  <td><?php echo htmlentities($beschreibung[1]); ?></td></tr>
 <tr>
  <td><input type="text" size="2" name="menge_fahrzeug2"></td>
  <td width="150"><?php echo htmlentities($fahrzeug[2]); ?></td><td width="100"><?php echo $preis[2]; ?> EUR</td>
  <td><?php echo htmlentities($beschreibung[2]); ?></td></tr>
 <tr>
  <td><input type="text" size="2" name="menge_fahrzeug3"></td>
  <td width="150"><?php echo htmlentities($fahrzeug[3]); ?></td><td width="100"><?php echo $preis[3]; ?> EUR</td>
  <td><?php echo htmlentities($beschreibung[3]); ?></td></tr>
  <tr><td><input type="hidden" name="redirect" value="index.php?section=fuhrpark">
  <input type="submit" name="kaufen" value="Kaufen"></form></td></tr>
 </table>
 </form>
<?php

$ergebnis1 = $_POST['menge_fahrzeug1'];
$ergebnis2 = $_POST['menge_fahrzeug2'];
$ergebnis3 = $_POST['menge_fahrzeug3'];

echo "$ergebnis1"."$ergebnis2"."$ergebnis3";
}
else
{
echo "Nicht eingeloggt";
}
 
?>
Hoffe, das kann dir weiterhelfen mir zu helfen :grin:
CosmoPhobia
Mitglied
Beiträge: 15
Registriert: 09.03.2008 22:41

Beitrag von CosmoPhobia »

Keine Lösung oder Ansatz einer Lösung meines Problems ?
Ich habe es jetzt erstmal so gemacht, das ich jede php-Seite komplett neu aufbauen lasse, nur halt bei der neuen seite die include ändere, die dann nen anderen Inhalt darstellt.
Ich weiß aber nicht, ob das wirklich die beste Lösung ist. Ich habe nämlich ab und zu, also nur sporadisch, ein echo doppelt stehen...

Aber zum testen gehts erstmal, schön wäre es nur, wenn ich auf Dauer eine gute Lösung habe.
CosmoPhobia
Mitglied
Beiträge: 15
Registriert: 09.03.2008 22:41

Beitrag von CosmoPhobia »

Hier schaut mal, dass ist der Code wie ich ihn aktuell verwende. Hier mal meine index.php:

Code: Alles auswählen

<?php 
error_reporting (E_ALL);
//Benötigte Dateien und Variablen von phpBB 
define('IN_PHPBB', true); 
$phpbb_root_path = '/Applications/xampp/xamppfiles/htdocs/test/forum/'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . 'config.'.$phpEx);
 

//Session auslesen und Benutzer-Informationen laden 
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 

    echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n";
    echo "         \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
    echo "<html>\n";
    echo "    <head>\n";
    echo "        <title>Meine Seite</title>\n";
    echo "        <link rel=\"stylesheet\" type=\"text/css\" href=\"page.css\" />\n";
    echo "        <meta http-equiv=\"Content-Type\"
                        content=\"text/html; charset=ISO-8859-1\" />\n";
    echo "    </head>\n";
    echo "    <body>\n";

    echo "        <div id=\"root\">\n"; // ganz oberer Div-Holder
    echo "            <div id=\"banner\">\n"; // banner
    include "menu.php";
    echo "            </div>\n";
    echo "            <div id=\"links\">\n"; // linkes Menu
    include "login.php";
    echo "            </div>\n";
    echo "            <div id=\"mitte\">\n"; // In der Mitte der Inhalt
    include "start.php";
    echo "            </div>\n";
    echo "            <br style=\"clear:both;\" />\n"; // css-float beenden
    echo "       </div>\n";

    echo "    </body>\n";
    echo "</html>\n";



?>


Wenn ich jetzt im Menü auf einen Link klicke, lädt er z.b. die Datei blabla.php, die wiederum genauso aufgebaut ist, aber den include start.php habe ich in dem neuen Dokument auf z.b. blabla.php geändert. Ist das so sinnvoll ?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Hm da habe ich wohl irgendwo eine Mail übersehen...

Spontan habe ich da jetzt keinen groben Fehler drin gesehen. Du solltest zwar das if(defined('IN_PHPBB')) auch noch in der inhalt.php einbauen, aber mit diesen beiden Zeilen:

Code: Alles auswählen

//Session auslesen und Benutzer-Informationen laden
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata); 
sollte eigentlich auch $userdata vernünftig gestartet sein. Bist du denn wenn du die Seite aufrufst über Cookies eingeloggt, oder über die Session-ID in der Adresszeile?
Bau mal ein

Code: Alles auswählen

print_r($userdata);
in deiner eingebundenen Datei ein. Das nochmalige Verbinden mit der Datenbank ist denke ich wirklich überflüssig, da das von den Forum-Includes schon erledigt wird (du kannst dann auch die mysql Funktionen benutzen wenn du möchtest, das wird nur deshalb im Forum nicht gemacht, weil dadurch Probleme entstehen könnten was die Datenbankkompatibilität angeht (man bräuchte für jeden Datenbanktyp einen kompletten Satz Dateien).

Die Frage wäre natürlich auch, ob etwas schädliches in den Includes vorher passiert, ist mir durchaus schon mal passiert dass ich irgendwo etwas wie

Code: Alles auswählen

$userdata = array();
drin hatte und mich dann gewundert habe, warum solche Abfragen plötzlich nicht mehr funktionieren. Es gibt ja auch Standardfunktionen die versuchen vor register_globals zu schützen und erst mal grundsätzlich alle Globalen Variablen entfernen, wenn das nach der Initialisierung der Forumsdaten passiert sind die Daten natürlich weg.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
CosmoPhobia
Mitglied
Beiträge: 15
Registriert: 09.03.2008 22:41

Beitrag von CosmoPhobia »

Vielen Dank für deinen Beitrag. Ich werde das mal ausprobieren.
Aber eine Frage bleibt vorerst noch.

Ich habe jetzt 2 verschiedene Lösung für den Aufbau meine Seite gepostet.
Die Lösung, mit der ich jetzt gerade arbeite, ist die, die ich im Post vom 15.03. 11:34 beschrieben habe beschrieben habe. Spricht irgendetwas gegen diese Lösung ? Sollte ich lieber meine erste Lösung mit den GET-Parametern nutzen, wenn ja warum ?

Ich weiß nicht, die 2. Lösung finde ich einfacher...
Welche Meinung hast du dazu ?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Solange du niemals auf die Idee kommst sowas zu machen:

Code: Alles auswählen

include($_GET['parameter']);
ist es eigentlich egal welche Methode du verwendest. Ob du jetzt verschiedene Dateien verwendest die dann andere Includes vornehmen oder ob du das per GET Übergibst und dann in einem Array prüfst ob die Datei möglich ist, ist eigentlich egal. Zweiteres hat den Vorteil, dass du nicht so viele Dateien mit immer dem gleichen Inhalt herumliegen hast, allerdings könntest du das prinzipiell auch ganz genau andersherum lösen: In deinen Dateien für den Inhalt sorgen (in Variablen platziert) und dann eine Zentrale Datei von allen anderen aus nutzen die dann diese Variablen an vordefinierten Stellen und vordefiniert formatiert ausgibt, letztlich so wie bei einem Templatesystem (du kannst auch das phpBB Template System nutzen). Das hat dann den klaren Vorteil dass du nicht direkt alle Dateien ändern musst wenn du nur irgendwo was am Layout ändern willst. Es gibt bei allen Methoden Vor- und Nachteile, nur den direkten Include von vom User stammenden Daten oder die Ausgabe derselben solltest du grundsätzlich niemals machen. (Und auch nicht in SQL Befehlen direkt nutzen etc.)
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „phpBB 2.0: Mod-Bastelstube“