Seite 1 von 1

phpbb2 login auf fremder Website bleibt nicht gespeichert

Verfasst: 09.03.2008 22:47
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]

Verfasst: 09.03.2008 23:37
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.

Verfasst: 10.03.2008 09:10
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 ?

Verfasst: 10.03.2008 20:07
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.

Verfasst: 10.03.2008 23:26
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:

Verfasst: 12.03.2008 15:04
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.

Verfasst: 15.03.2008 11:34
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 ?

Verfasst: 15.03.2008 18:19
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.

Verfasst: 16.03.2008 14:04
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 ?

Verfasst: 16.03.2008 14:25
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.)