Autor Zpráva
Majko
Profil
Zdravím vás,

potřeboval bych poradit, jak změním session nebo cookies pomocí file_get_contents?

Uveďme si příklad: mám skript www.okurkavesklenici.cz/logout.php, který provede odhlášení uživatele na doméně okurkavesklenici.cz.

Dále mám skript třeba na www.trojkolkyprodeti.com/globallogout.php, který provede odhlášení uživatele na své doméně, ale taky na doméně okurkavesklenici.cz, nebo taky třeba na toaletnipapir.info atp. víc názvů se mi vymýšlet už nechce :D

Zkrátka nedaří se mi toto vyřešit pomocí file_get_contents, aby spustil skript logout.php.

Je tady někdo kdo mi pomůže? Díky :)


Ještě pro ujasněnou pošlu ty jednoduché skripty. Na nich jsem imho nic nezvrzal:

logout.php
session_start();
$_SESSION["logged"] = false;

globallogout.php
session_start();
$_SESSION["logged"] = false;
$troll = file_get_contents("http://www.okurkavesklenici.cz/logout.php");
header("Location: http://www.okurkavesklenici.cz/?odhlasen");
koudi
Profil
Timhle zpusobem to delat nemuzes. Session ID mas (predpokladam) ulozenou v cookie. Ta se posila s pozadavkem na server od clienta. Problem je, ze v tomhle pripade je ale clientem tvuj server, tudiz pri tom druhym requestu nepracujes se session uzivatele.
Majko
Profil
Já si to myslel. Jak to potom tedy řešit? Dalo by se to vyřešit přesměrováváním, že bych Location: použil několikrát za sebou a ty skripty by se pěkně za sebou redirectovaly. Problém je, že těch webů, na kterých chci provést logout může být víc, a Google Chrome a ostatní neschopné prohlížeče mají problém už s třemi přesměrováváními.

Nějaký nápad jak to řešit?
Mastodont
Profil
Použít CURL? Na všech doménách bys ale musel mít stejný ID uživatele.
Majko
Profil
Mastodont:
Mohl by jsi mi prosím trochu konkrétněji popsat, jak bych dosáhl toho, abych mohl změnit session nebo cookies na jiné doméně? Stačilo by vlastně jen smazat cookie PHPSESSID, protože tu když smažu, tak afaik se všechny session informace pro klienta ztratí.

S cURL jsem ještě nikdy nepracoval, netuším jak jej nastavit a spustit aby změnil klientovi cookies na jiné doméně.
Mastodont
Profil
Nemyslel jsem změnu cookies na jiné doméně, ale odhlášení uživatele na jiné doméně, což ty chceš řešit. Čili spustil bys přes CURL soubor logout.php na jiné doméně, kterému bys předal nějaké údaje opravňující k odhlášení (to by asi bylo nutné řešit podobně jako funguje single sign-on). Příznak udávající, zda je uživatel přihlášen nebo ne, by pak samozřejmě nemohl být v session.
Majko
Profil
Mastodont:
Nenapadá mě jak jinak řešit uložení stavu přihlášen/nepřihlášen. Abych sahal každé načtení stránky do mysql je opravdu velmi náročné + bych musel vytvořit "fingerprint token", abych odlišil uživatele (protože podle IP to zkrátka nejde).

A ano, má to fungovat jako jednoduchý SSO. Googlil jsem celé dny a noci, ale nikde žádný stručný a pochopitelný náčrt způsobu fungování SSO jsem nenašel. Tak jsem navrhl vlastní:

Máme login.domena.com a např. example.com. Když zobrazím loginform na example.com, proběhne header location přesměrování na login.domena.com, odkud se přenesou cookies uživatele o trvalém přihlášení a pokud jsou správná, vytvoří token, přesměruje zpět na example.com, kde uživatele přihlásí.

Problém však je, když chci uživatele odhlásit. Musel bych jedině spustit na všech webech skripty logout.php, což však teoreticky není problém, prakticky ano, protože nevím, jak to řešit.
Alphard
Profil
Tím přesměrováním a vytvořením tokenů v podstatě vymýšlíte OpenId. To je rozumný návrh přihlašování přes jednu centralizovanou autoritu, ale hromadné odhlášení nevyřeší.
Odhlašovat přesměrováním jen pomocí http redirectů a id uživatele bych se možná bál, je jen otázka času než si toho někdo všimne a začne pravidelně odhlašovat všechny všude.

Při odhlašování pomocí redirectů bych se asi snažil připojit i nějaký token, který ale musí být pro jednoho uživatele na všech webech stejný.
Řešení od Mastodonta bych nezavrhoval, vy jinak nepotřebujete tahat z db žádné informace o uživateli? Opět bych to obecně pro n webů řešil odhlášením přes jeden centrální, kterému by jen mohl poslat dceřiný web žádost.

Vůbec ideální by bylo, kdyby všechny weby byly na stejném stroji a mohly sdílet nějakou databázi. Pak byste nemusel řešit curl, jen měnit záznamy.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: