PHP-Code vor include parsen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aufruf
auslese
benutzer
code
datei
datum
http
information
nutzen
problem
realisieren
sagen
server
system
test
url
verbindung
versuchen
verwaltung
zugreifen
-
Hallo,
ich versuche mich gerade an einem Benutzerlogin. Dabei soll sich ein Benutzer bei einem meiner Systeme einloggen und dann ebenfalls auf dem anderen angemeldet sein.
Da die zwei Systeme über unterschiedliche Domains laufen, kann ich nicht auf Cookies zugreifen, die von dem jeweils anderen System gesetzt wurden. Kein Problem dachte ich mir: Ich mache einfach eine zentrale Verwaltung der Logins, die in jedem Fall (egal wo man sich einloggt) die Cookies setzt und frage dann bei den beiden Systemen immer in dieser Verwaltung an, ob der Benutzer angemeldet ist.
Dies wollte ich mit einem einfachen Include eines Skriptes der Verwaltung realisieren. Allerdings funktioniert dies wieder wegen den verschiedenen Domains nicht. Ergebnis: Ich habe immernoch keinen Zugriff auf meine Cookies.
Nun zur Frage: Kann ich irgendwie sagen, dass die Verwaltung die Cookie auslesen und ihr Skript abarbeiten soll und danach meine Systeme auf Variablen wie $name oder $rechte zugreifen können?
Vielen Dank schon mal!
Beitrag zuletzt geändert: 28.5.2013 23:36:01 von nie-genug-gewuerzt -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Na du könntest den Inhalt der Cookie oder die Informationen zur Anmeldung an der anderen Seite als JSON oder XML auf der ersten Seite unter einer bestimmten URL anbieten. Auf der zweiten Seite rufst du die Informationen über die URL ab. Zum lesen der Informationen kannst du file_get_contents (http://de2.php.net/manual/de/function.file-get-contents.php) verwenden. Das ist aber nur eine "Mindestlösung".
Wenn du es richtig machen möchtest, müsstest du dir REST und OAuth anschauen und dir selbst einen solchen Dienst programmieren. So müsstest du auf der zweiten Seite nur eine URL zur ersten Seite aufrufen und die zweite Seite autorisieren. Weitere Informationen dazu findest du im Internet (Google).
Gruß S. Brosch -
Hallo,
vielen Dank für deine Hinweise software-brosch!
Mir reicht erst mal die "Mindestlösung". Wenn ich dann 1000 Besucher pro Tag habe steige ich vielleicht noch um...
Allerdings schaffe ich es beim besten Willen nicht die Datei hier von lima-city zu holen.
echo file_get_contents('http://www.nie-genug-gewuerzt.lima-city.de/system/test.php');
Wenn ich das versuche kommt immer: "failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden". Die chmod Werte stehen schon auf 777.
Wenn ich versuche auf eine lokale Datei auf meinem Rechner zuzugreifen geht das.
Ich habe auch schon geschaut: Laut phpinfo ist allow_url_fopen auf on gestellt, was ja als vorraussetzung angegeben ist.
Hat jemand eine Idee woran das liegen könnte, und vielleicht sogar ein Tipp wie man das Umgehen kann? -
Ein Aufruf einer Seite mit der Funktion file_get_contents() innerhalb des Limaservers ist meines Wissens nach nicht möglich.
fopen() sollte funktionieren.
Beitrag zuletzt geändert: 29.5.2013 11:36:07 von timebandit -
Hallo,
leider scheint auch fopen nicht zu gehen:
Warning: fopen(http://www.nie-genug-gewuerzt.lima-city.de/system/test.php) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
Außerdem wird die PHP Datei bei fopen doch nicht ausgeführt, sodass ich selbst wenn es ginge, nur meinen PHP Code sehen würde, oder?
Ich verstehe allerdings nicht, weshalb man file_get_contents() sperrt. Ein normaler Benutzer darf die Seite doch auch einfach öffnen, warum ist es dann für andere Server verboten?
Gibt es noch mehr Ideen? Eigentlich muss der Server ja nur so tun als sei er ein "normaler" Browser und eine Seite anfordern.
Vielen Dank für eure Bemühungen. -
Habe mal file_get_contents herumgespielt:
file_get_contents funktioniert
a) wenn du das Wurzelverzeichnis verwendest;
b) wenn du auf einen anderen Server zugreifst(ist ohnehin Standardeinstellung).
file_get_contents funktioniert nicht, wenn du innerhalb des Limaservers die URL verwendest!
Hier ein kleines Beispiel -
Hallo,
vielen Dak für dein "herumspielen". Du hast recht, wenn ich file_get_contents auf eine fremde Seite anwende geht es!
Leider habe ich jedoch nur den lima-Server zur Verfügung, sodass ich damit leider nicht weiter komme.
Ich habe derweil cURL ausprobiert, womit man immerhin auf lima-interne Seiten zugreifen kann. Allerdings kann die damit aufgerufene Seite nicht ihre Cookies auslesen, weshalb mich das auch nicht weiter bringt. (Meine Vermutung für den Grund: Die eigentliche Seite hat keine Cookies gesetzt, also werden beim Verbindungsaufbau keine übertragen. Wenn nun die cURL Seite versucht ihre Cookies auszulesen werden die halt nicht "nachgesendet". Aber das ist nur eine Theorie...)
Trotzdem nochmal vielen Dank für deine Arbeit! Aber wenn du bei deinem "herumspielen" nicht doch noch eine Möglichkeit gefunden hast wie man lima-interne Seiten nutzen kann, werde ich das wohl nicht realisieren können. -
nie-genug-gewuerzt schrieb:
Doch, kann sie, solange du ihr mit cURL auch Cookies schickst.
Allerdings kann die damit aufgerufene Seite nicht ihre Cookies auslesen, weshalb mich das auch nicht weiter bringt. -
nie-genug-gewuerzt schrieb:
Trotzdem nochmal vielen Dank für deine Arbeit! Aber wenn du bei deinem "herumspielen" nicht doch noch eine Möglichkeit gefunden hast wie man lima-interne Seiten nutzen kann, werde ich das wohl nicht realisieren können.
In diesem Beispiel wurde dreimal file_get_contents() eingesetzt.
Das Script dazu:
ini_set('display_errors', 1); error_reporting(E_ALL); // mit Wurzelverzeichnis $richtig = file_get_contents("{$_SERVER["DOCUMENT_ROOT"]}/nie-genug-gewuerzt/index.html"); echo <<<FGC <!DOCTYPE Html> <html> <head> <title>FILE_GET_CONTENTS</title> </head> <body> <h1 style="color:blue">file_get_contents klappt mit ["DOCUMENT_ROOT"]</h1> $richtig <br><br> <h1 style="color:red"> file_get_contents klappt nicht mit der URL innerhalb von lima</h1> FGC; // mit URL innerhalb lima $falsch = file_get_contents("http://timebandit.lima-city.de/nie-genug-gewuerzt/index.html"); echo $falsch; echo '<h1 style="color:blue"> file_get_contents klappt mit der URL außerhalb von lima</h1>'; // mit URL außerhalb lima $google = file_get_contents("http://google.com"); echo $google; echo "</body></html>";
-
@timebandit
timebandit schrieb:
In diesem Beispiel wurde dreimal file_get_contents() eingesetzt.
Ah jetzt habe ich verstanden was du meintest. Dennoch wird dabei nicht der PHP Code ausgeführt, bevor der gesendet wird.
Wenn ich also die beiden Dateien habe:
test.php:
holt.php:<?php echo "Verbindung steht!"; ?>
<?php echo file_get_contents("{$_SERVER['DOCUMENT_ROOT']}/test.php"); ?>
Und nun holt.php aufrufe, bekomme ich "<?php echo "Verbindung steht!"; ?>" zurück und nicht "Verbindung steht!"
@hackyourlife
Ich bekomme das mit den Cookies aber irgendwie nicht hin. Mein Code:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $Url); curl_setopt($ch, CURLOPT_REFERER, "www.google.de"); curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt"); $output = curl_exec($ch); curl_close($ch); echo $output;
Eigentlich habe ich das so verstanden, dass er mir die Cookies dann in die cookie.txt-Datei schreibt, doch leider tut sich da nichts. Weißt du, was ich ändern muss? -
nie-genug-gewuerzt schrieb:
... test.php:
holt.php:<?php echo "Verbindung steht!"; ?>
<?php echo file_get_contents("{$_SERVER['DOCUMENT_ROOT']}/test.php"); ?>
Und nun holt.php aufrufe, bekomme ich "<?php echo "Verbindung steht!"; ?>" zurück und nicht "Verbindung steht!" ...
also das dürfte eigentlich nicht der fall sein! "<?php echo "Verbindung steht!"; ?>" steht aber wohl unter page-source (also nicht direkt angezeigt). php zeigt den text richtig an, wenn das drinnen ist:<?php $var = file_get_contents("{$_SERVER['DOCUMENT_ROOT']}/test.php"); ob_start(); eval($var); echo $res = ob_get_clean();
dazu muss ich aber sagen, dass die ganze sache mit allen ob_*-s und auch eval, sehr unschöne lösungen sind.
mehr kann ich dazu leider nicht sagen, weil ich dein problem (paar mal schon durchgekaut) noch immer nicht ganz verstehe :(
==== EDIT ====
ah ja! 'test.php' beginnt auf garkeinen fall mit '<?php'. das unnötige '?>' am ende kann man sich - wenn man nicht zwischen html und php hin und her hüpft - auch ersparen!
Beitrag zuletzt geändert: 31.5.2013 7:00:15 von czibere -
Hallo,
czibere schrieb:
mehr kann ich dazu leider nicht sagen, weil ich dein problem (paar mal schon durchgekaut) noch immer nicht ganz verstehe :(
Mein Ziel ist die Nutzung eines Logins von mir in mehreren Systemennie-genug-gewuerzt schrieb:
Dabei soll sich ein Benutzer bei einem meiner Systeme einloggen und dann ebenfalls auf dem anderen angemeldet sein.
Das bedeutet konkret: Der Benutzer meldet sich bei System A an. Dieses leite die eingegebenen Daten an eine Verwaltung weiter.
Die Verwaltung prüft, ob die Daten stimmen und setzt, wenn ja, ein Cookie, um diesen nun angemeldeten Benutzer zu identifizieren.
Nun wird automatisch zu System A zurückgeleitet, wo der Benutzer nun angemeldet sein soll.
Besucht der Benutzer nun auch System B, soll er hier nicht erneut seine Anmeldedaten eingeben, sondern den ja bereits vorhandenen Logincookie nutzen.
Das Problem ist, das System A, System B und die Verwaltung unter verschiedenen Domains laufen sollen. Daraus folgt, dass System A nicht auf Cookies der Verwaltung zugreifen kann. (Eigentlich soll die Verwaltung ja zentral für die Logins zuständig sein.) Deswegen wollte ich in der Verwaltung ein PHP-Skript bereitstellen, dass einfach nur die Cookies der Verwaltung ausliest und diese Daten dann an die aufgerufene Seite in System A, oder System B weitergibt. Allerdings muss der PHP-Code der Verwaltung auch unter deren Domain ausgeführt werden, damit Zugriff auf die Cookies besteht.
czibere schrieb:
Das geht deswegen nicht, da mit eval der Code ja unter System A, bzw. System B ausgeführt wird und nicht unter der Verwaltung. Ich brauche wie der Titel schon sagt, eine Möglichkeit den PHP-Code unter der Verwaltungs-Domain auszuführen und nur das Ergebnis an System A, oder System B weiterzuleiten.
ob_start(); eval($var); echo $res = ob_get_clean();
Ich hoffe nun ist das Problem verständlich. -
ich stups dich mal in diese richtung:
SAML (Security Assertion Markup Language)
http://simplesamlphp.org/
https://code.google.com/p/simplesamlphp/
Beitrag zuletzt geändert: 2.6.2013 12:42:37 von n0tiert -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage