Skip to content
This repository has been archived by the owner on Jan 1, 2020. It is now read-only.

Login Redirect Patch #51

Closed
wants to merge 1 commit into from
Closed

Login Redirect Patch #51

wants to merge 1 commit into from

Conversation

hirbod
Copy link

@hirbod hirbod commented Aug 9, 2012

Ich habe die redaxo/index.php gepatched, damit man nach einem
Session-Timeout beim Re-Login nicht immer wieder auf der Startseite
landet, sondern auf die zuletzt besuchte Seite, bzw. die Seite, die man
eigentlich aufrufen wollte. Funktioniert mit jeder Seite, egal ob
AddOn, Medienpool oder Redaxo-Page.

Ich habe die redaxo/index.php gepatched, damit man nach einem
Session-Timeout beim Re-Login nicht immer wieder auf der Startseite
landet, sondern auf die zuletzt besuchte Seite, bzw. die Seite, die man
eigentlich aufrufen wollte. Funktioniert mit jeder Seite, egal ob
AddOn, Medienpool oder Redaxo-Page.
} else {
if(!$REX['USER'] && !isset($_SESSION['REDIRECT_REDAXO_AFTER_LOGIN'])){
if(!isset($_GET['rex_logout'])){
$_SESSION['REDIRECT_REDAXO_AFTER_LOGIN'] = strip_tags($_SERVER['REQUEST_URI']);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm warum sollten in der uri tags enthalten sein?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Macht dass sinn falls vor z.b. Ein post request vorrausgegangen ist??

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMHO ja, diesen Case jedoch würde ich ignorieren. Es würde jedoch schon ungemein helfen, einfach an der selben Stelle wieder anzukommen. Dieses Fass wollte ich jetzt nicht auf machen, und noch die POSTs nachschicken.

Zum Thema URI-Tags: Dadurch säubere ich halt $_GET. Sonst wäre ja nen XSS möglich. Evtl sollte ich htmlspecialchars() machen?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm verstehe nicht wie das gegen xss helfen sollte.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

strip_tags killt alle tag elemente, also auch < > etc. bessere wäre natürlich ne preg_replace

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

http://stackoverflow.com/questions/3605629/php-prevent-xss-with-strip-tags

Also, strip_tag tut prinzipiell was es soll.. aber htmlspecialchars() wäre sicherlich besser, oder halt preg_replace..

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm da man fast alle zeichen auch mit %irgendwas url codieren kann sehe ich wenig sinn in strip_tags(). Ich schlaf mal drueber ;-)

Htmlspeciachars ist in diesem context aber sichlich auch nicht besser. Hier gehts ja rein um URLs und nicht um html rendering.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hier sollten wir ein paar webspaces testen ob die REQUEST_URI von allen Servern geliefert wird

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

REQUEST_URI gibts nicht zwingend.. nein.

@staabm
Copy link
Member

staabm commented Aug 9, 2012

Statt der superglobalen array sollte die rex_* api verwendet werden

@hirbod
Copy link
Author

hirbod commented Aug 9, 2012

Meinst jetzt wegen $_SESSION? Das wäre möglich, aber was ist mit REQUEST_URI ?

@staabm
Copy link
Member

staabm commented Aug 9, 2012

Ich meine rex_session() bzw rex_set_session() & rex_server(). Dann sind wir an dieser Stelle auch Instanz-safe.

@hirbod
Copy link
Author

hirbod commented Aug 9, 2012

Also wenn ihr dieses Snippet wirklich übernehmen solltet, würd ichs anpassen....

@staabm
Copy link
Member

staabm commented Aug 9, 2012

Ich finde die idee prinzipiell nicht schlecht. @dergel @gharlan @tbaddade opinions?

@tbaddade
Copy link
Member

tbaddade commented Aug 9, 2012

+1

@dergel
Copy link
Member

dergel commented Aug 9, 2012

ich finde es grundsätzlich auch gut. wichtig ist. die instance beachten, deswegen haben wir die rex_session und co sachen.

  • wegen der posts nachdenken - weil fileupload und co wird nicht so richtig gehen
  • ob man wirklich alle urls durchleiten sollte. dabei geht es nicht nur um xss sondern auch um urls die vielleicht ungewünschte Änderungen machen - z.b. Import datei einspielt, Xform Table dropt oder ähnliches. Ich würde das lieber auf bestimmte Parameter (page/subpage/article_id/mode ..) beschränken.

@hirbod Aber gerne machen :)

@gharlan
Copy link
Member

gharlan commented Aug 9, 2012

Prinzipiell auch +1, allerdings sollte es noch so angepasst werden, dass man nur weitergeleitet wird, wenn man sich wieder mit dem selben Benutzer anmeldet.

@staabm
Copy link
Member

staabm commented Aug 9, 2012

Ob die abfrage des nutzers noetig ist, weiß ich nicht. Die seite auf die man weitergeleitet wird muss ja selbst sicherstellen (bzw der core) ob der user nach der anmeldung rechte dazu hat. Falls nicht wuerde der core ja automatisch nochmals umleiten wg. Fehlender rechte,..

@hirbod
Copy link
Author

hirbod commented Aug 9, 2012

@staabm Ja, das sehe ich auch so. Ich habs auch bereits getestet. Es funktioniert, der Core leitet wieder auf die Startseite des Users, wenn man keine Rechte hat.

Wg. POST bleib ich bei der Meinung. Nach nem Re-Login würde ich keine POST Daten senden. Ich müsste ja auch alle POSTS sonst prüfen, in eine SESSION speichern und beim Login wieder setzen. Ich weiss nicht, ob das sinnvoll ist.

@hirbod
Copy link
Author

hirbod commented Aug 9, 2012

Wie komme ich sicher an REQUEST_URI und HTTP_HOST und HTTP dran? Vorschläge? Oder wollt ihr das da oben selbst "zu ende" bringen?

@jdlx
Copy link
Contributor

jdlx commented Aug 9, 2012

POST würd ich auch auf keinen FAll senden.. wg. HTTP/Protocol: https://github.com/gn2netwerk/rexseo/blob/master/config.inc.php#L43 .. afaik gibts nicht mehr options das abzufragen..

@hirbod
Copy link
Author

hirbod commented Aug 9, 2012

Ich sehe gerade, um die PORT Abfrage kümmert ihr euch aber auch nicht. Muss das wirklich rein?

@jdlx
Copy link
Contributor

jdlx commented Aug 9, 2012

ich glaub wenn man mit relativen locations arbeitet, dann nein.. die sind zwar offiziell nicht korrekt, funktionieren aber de fakto trotzdem weil die UAs das tolerieren..

@staabm
Copy link
Member

staabm commented Aug 9, 2012

Bei relativen redirects braucht man keinen Port das ist richtig.

@jdlx
Copy link
Contributor

jdlx commented Aug 9, 2012

Da der Rest von Redaxo auch mit relativen arbeitet würd ich an der Stelle kein extra Faß aufmachen.. d.h. auch relativ und gut..

@gharlan
Copy link
Member

gharlan commented Aug 9, 2012

Wegen Userabfrage: Mir ging es nicht um die Berechtigung, die ist ja bereits abgedeckt. Ich finde es nur einfach nicht sinnvoll, wenn man auch weitergeleitet wird, wenn man sich mit einem anderen Benutzer einloggt. Umsetzung wäre ja auch kein Problem, man kann den Benutzer ja einfach mit in der Sessionvariable ablegen.
Aber wenn ihr das so sinnvoll findet ohne Userabfrage, ist es auch ok für mich. ;)

@hirbod
Copy link
Author

hirbod commented Aug 9, 2012

Wie bekomme ich denn bitte beim Logout, bzw. wenn die Session verreckt ist und $REX['USER'] == NULL ist denn den Usernamen heraus? Ich wüsste nicht wie.

@jdlx
Copy link
Contributor

jdlx commented Aug 15, 2012

Und wie gehts hier weiter? Die Funktion ist wirklich zu praktisch um sie hier versauern zu lassen..

@staabm
Copy link
Member

staabm commented Aug 15, 2012

Hirbod hat recht, dass nach ablauf der Session der Username nicht abgefragt erden kann. Daher ist gregors idee so nicht umsetzbar. Alles andere wurde beschrieben oder ist noch was offen?

@staabm
Copy link
Member

staabm commented Aug 15, 2012

...also nach einarbeiten des feedbacks oben kann das in den core rein

@gharlan
Copy link
Member

gharlan commented Aug 17, 2012

Ja, ihr habt Recht, Userabfrage ist doch nicht so einfach möglich. Daher schließe ich mich euch an, also ohne Usercheck.

@jdlx
Copy link
Contributor

jdlx commented Aug 27, 2012

So, um hier mal wieder Schwung in die Bude zu bekommen.. anbei folgender Vorschlag anhand der comments die hier aufliefen:

// snip.. (nur das relevante)..:

    if(!rex_session('LOGIN_REDIRECT','boolean') || strpos(rex_session('LOGIN_REDIRECT','string'), 'index.php' === false))
    {
      header('Location: index.php?page='. $REX['PAGE']);
    }
    else
    {
      $login_redirect = rex_session('LOGIN_REDIRECT');
      rex_unset_session('LOGIN_REDIRECT');
      header('Location:  ' . $login_redirect);
    }
    exit();
  }
}
else
{
  if(!$REX['USER'] && rex_session('LOGIN_REDIRECT','string')==='')
  {
    if(rex_get('rex_logout', 'int',-1) !== -1)
    {
      rex_unset_session('LOGIN_REDIRECT');
    }
    else
    {
      rex_set_session('LOGIN_REDIRECT', strip_tags(rex_server('REQUEST_URI','string')));
    }
  }
}

// snip..

@staabm
Copy link
Member

staabm commented Aug 28, 2012

strpos(rex_session('LOGIN_REDIRECT','string'), 'index.php' === false)
das wird mit url rewrite / rexseo nicht funktionieren oder? warum die abfrage?

@jdlx
Copy link
Contributor

jdlx commented Aug 28, 2012

Geht ja um backend, sprich kein rewrite.. ist lediglich ne kleine absicherung dagegen das der Wert versehentlich mal totaler Unfug is und man dann ins Nirvana geleitet wird. Ansonsten könnt das auch raus..

@jdlx
Copy link
Contributor

jdlx commented Aug 28, 2012

Bezügl. der params whitelist die @dergel vorgeschlagen hat hier mal ad hoc:

  • page
  • subpage
  • article_id
  • category_id
  • clang

.. what else?

@gharlan
Copy link
Member

gharlan commented Aug 28, 2012

Ich würde die Params dann über rex_request() einlesen, damit die Weiterleitung auch nach POST-Requests funktionieren.

@jdlx
Copy link
Contributor

jdlx commented Dec 13, 2012

Stimmt, linkmap.. habs grad oben rein.

Was daran zu speziell für r4 sein soll versteh ich aber nicht. Ob die Lösung sonderlich elegant ist spielt für r4 keine Rolle mehr, wohl aber das feature als solches zur Verfügung zu haben. Ich benutz das seitdem Hirbod die erste Version vorgeschlagen hat.. es ist ne echte Arbeitserleichterung.

@tbaddade
Copy link
Member

tbaddade commented Jan 9, 2013

Für die 4.4.2 würde ich das eher rausnehmen. Oder habt ihr das ausreichend getestet?

@jdlx
Copy link
Contributor

jdlx commented Jan 9, 2013

Ich benutze den patch schon länger.. in diversen Installationen.. keine probs, sehr arbeitserleichternd.

@ghost
Copy link

ghost commented Jan 22, 2013

Folgendes ist mal passiert: "Der Firmen-Chef" hat einen neuen Block hinzugefügt und hackt herade einen längeren Text per Textile rein. Das Telefon klingelt und er telefoniert ein gutes Stündchen. Danach schreibt er weiter an seinem Artikel und BOOM nach abspeichern des Blockes landet er auf der Logoutseite. Auf die Idee den Back-Button zu drücken und evtl. zur vorherigen Page zurückzukehren ist er nicht gekommen. Sollte man aber auch von nem Redakteur nicht erwarten. Der Text und somit ne halbe Stunde Arbeitszeit waren damit weg.

D.h. hier muss imho aufjedenfall was zuerst getan werden. Der Redirect Patch ist ganz nice aber Datenverlust zu erleiden wegen eines zu kurzem Session-Timeouts bzw. fehlendem Meachnismus zum Bestätigen des Logouts ist nicht so fein. Ich habe bei mir den Session-Timout auf 12h erhöht, damit REDAXO einen langen Arbeitstag durchhält, ohne jemandem etwas unter dem Arsch wegzuziehen ;)

@jdlx
Copy link
Contributor

jdlx commented Jan 22, 2013

@rexdude dein Beispiel ist zwar gut & legitim, aber im Rahmen des bisher skizzierten imho nicht gut bzw. hinreichend betriebssicher umsetzbar. Da müßte man imho einen anderen Weg einschlagen, wäre dann mit deutlich mehr edits am core verbunden, und in Folge noch weniger konsensfähig als es diese kleine Lösung schon (nicht) ist.

Eine Imho gute Lösung könnte dann sowas wie ein countdown-timer gesteuertes modales overlay mit login prompt sein, welches die Interaktion mit der page unterbindet bis man per eingabe der credentials sie wieder freigeschaltet hat.. (hint hint: ich glaube das ginge dann sogar per Addon/Plugin ;)

@staabm
Copy link
Member

staabm commented Jan 22, 2013

Um mal eine Alternative Lösung für das Problem zu diskutieren:

Wie waere es mit setTimeout einfach alle x-minuten (z.B. session timeout - 30 sekunden ) ein AJAX request auf die index.php absetzen, damit die session dadurch autm. Verlaengert wird (solange der user angemeldet).

Mir kommt so vor als haetten wir das schonmal diskutiert, bin mir aber net sicher

@jdlx
Copy link
Contributor

jdlx commented Jan 22, 2013

Ja, wär ne Möglichkeit.. wär auch recht schlank. Wäre dadurch aber gleichbedeutend mit einer endless Session so lange irgendein Fenster offen ist. In meinen Augen nicht schlimm, in einem Office Kontext evtl. nicht mehr ganz so im Sinne von: Fenster offen, Admin beim Middach, Putzfrau gestaltet die Firmenwebsite um.. ;)

@jdlx
Copy link
Contributor

jdlx commented Jan 22, 2013

@staabm btw.. dann könnt man aber auch gleich n input für $REX['SESSION_DURATION'] in System reinpacken und gut is..

@staabm
Copy link
Member

staabm commented Jan 23, 2013

Eine session die sicher verlaengert waere schon besser als einfach nur generell die session duration einzustellen. Die verlaengerung sollte ja nur fuer backend user greifen. Damit es nicht endlos wird koennte man das ganze ja auch auf nen max wert beschraenken, z.b max 6 stunden verlaengern...

@ghost
Copy link

ghost commented Jan 23, 2013

@staabm Also ich finde de Idee gut. Hauptsache es wird eine Lösung gefunden damit solche Fälle nicht mehr vorkommen. Ob es max 6 Stunden sind oder mehr, mit oder ohne Ajax entscheidet dann am besten ihr. Und wie schon @jdlx meinte: Die Sache mit der Putzfrau sollte eher selten vorkommen ;)

Ich hoffe @hirbod reißt mir nicht den Kopf ab, aber brauchts dann überhaupt noch ein Redirect Patch. Weil dann hätten auch alle Programmierer keinen plötzlichen Rauswurf mehr zu fürchten und ergo wäre ein Redirect zwar nett aber zweitranging, da der Fall ja kaum noch bis gar nicht mehr in der Praxis auftauchen würde.

@jdlx Die Idee mit dem Plugin ist cool! Ich frage mich nur zu welchem Addon so ein Plugin wohl passen könnte??? :)))

@staabm
Copy link
Member

staabm commented Jan 23, 2013

@rexdude ja das das eine Alternative zu diesem PR, keine Ergänzung.

@jdlx
Copy link
Contributor

jdlx commented Jan 23, 2013

@staabm ich versteh grad den Unterschied nicht zwischen einem "ping" der bis max. n Stunden die Session verlängert, und einer generellen Sessiondauer von n Stunden. Letzteres wäre ein nobrainer für den wir nur noch ein select @ System bräuchten.

@staabm
Copy link
Member

staabm commented Jan 23, 2013

Der Unterschied ist, dass wenn man die session generell verlängert dass dann auch alle Session-Daten auf den Servern für User liegen bleiben die sich schon gar nicht mehr auf der Seite befinden.

Man macht also nicht die Ausnahme zur Regel,...

@jdlx
Copy link
Contributor

jdlx commented Jan 23, 2013

Ohne expliziten logout ja.. Frage ob das ein Problem wäre.

@staabm
Copy link
Member

staabm commented Jan 23, 2013

Logout-Links klicken max. 10% der User.

@hirbod
Copy link
Author

hirbod commented Jan 23, 2013

Ich finde eine automatische Sessionverlängerung mittels AJAX nicht gut. Das ist wie Jan schon sagte eine Endless-Session. Der beste Lösungsweg kam von Jan. Und ich denke, so sollte es sein. Ich benutze einige Web-Tools, ein Beispiel: mite (Zeiterfassung).

Mite macht das folgendermaßen: Bist du eingeloggt und nutzt die Seite, bleibst du "alive". Ist klar. Bist du länger abwesend, wird die Session gekillt, aber ohne redirect oder ähnliches. Es wird ein Layer eingeblendet mit der Abfrage der Login-Credentials. Gibt man diese ein, wird im Hintergrund ein neuer "Login" an den Server abgeschickt, mittels Ajax. Das ist smart, das ist fein, das ist super easy umzusetzen. Sogar mittels AddOn oder Plugin. Entscheidet sich der User dann keine Zugangsdaten einzugeben und die Seite zu reloaden, verliert er halt seinen ungespeicherten Stand.

Da wir aber ein Layer drüberlegen, kann es z.B. nicht passieren, das der User ein Submit-Button o.Ä. einfach abschickt und rausfliegt. Will er weitermachen, muss er sich einloggen.

@jdlx
Copy link
Contributor

jdlx commented Jan 23, 2013

@staabm Richtig.. bleibt dennoch die Frage ob es ein prob darstellen würde. Session hijacking? Im Prinzip.. aber wirklich faktisch?

So oder so: was den bisherigen PR angeht könnten wir den - weitere Diskussion kann ja stattfinden - erstmal closen von meiner Seite aus. Ich würd jetzt an der Stelle zumindest nicht weiterfrickeln wollen. Falls @rexdude da Bock hat wäre code-wise ein eigener PR eh sinnvoller..

@hirbod
Copy link
Author

hirbod commented Jan 23, 2013

mitesession

So, hier das Beispiel.. Gerade darüber gesprochen, schon isses passiert :)

@ghost
Copy link

ghost commented Jan 23, 2013

@jdlx wie schon gesagt: überlasse ich lieber euch da ich zuwenig anhung habe von der materie...Session hijacking? etc. würde mich "faktsich" auch interessieren...

@hirbod klingt vernünftig, ich glaube typo3 nutz auch so ein mechanismus. aber ist vermultiich ein deutlich höherer codeing aufwand.

@ghost
Copy link

ghost commented Jan 23, 2013

allerdings: wenn der user die checkbox "angemeldet bleiben" aktiviert hat...ist der mechanismus auch für die katz, oder?

@jdlx
Copy link
Contributor

jdlx commented Jan 23, 2013

@rexdude solche "angemeldet bleiben" Funktionen werden üblicherweise dann per cookie gesetzt und sind halt eine bewußte User-Entscheidung. Was nicht zwingend eine endless Session bedeutet.. häufig ist das dann immernoch "nur" eine deutlich verlängerte Session.. mal so mal so meiner Beobachtung nach zumindest.

@hirbod wie triggerst du dein overlay.. ist das ein statischer JS counter ab page-load? Oder kombinierst du das mit AJAX checks ab countdown Zeitpunkt X .. ?

@hirbod
Copy link
Author

hirbod commented Jan 23, 2013

@jdlx Der Overlay wird mittels JS getriggered, nachdem die Session verreckt ist. Davor würde der AJAX-Request nämlich die Session wieder verlängern. Ich gehe stark davon aus, das mite das mit einem internen JS-Counter ab page-load macht. Wenn der Counter abgelaufen ist, wird die Overlay-Maske geladen und darüber gelegt.

Ein anderer Lösungsweg fällt mir aktuell nicht ein. Vllt nach dem Essen :)

@rexdude Nur weil der Haken jetzt im Screenshot ist, heißt das noch nicht, das ich es drin haben wollte. Hatte ich auch nicht erwähnt, aber generell würde sowas mit einem Cookie gelöst werden, wie @jdlx schon gesagt hatte.

@jdlx
Copy link
Contributor

jdlx commented Jan 23, 2013

@hirbod achso.. mite.. dachte das wär Teil deiner app. Was einen rein statischen counter ab pageload anginge, beißt sich das imho mit dem (typischen) Szenario, daß mehrere backend pages offen sind, und man davon ausgehen muß, das der counter von einem pageload eines anderen Fensters schon wieder resettet wurde.. das prob ist jetzt:
Angenommen ich setzt nach dem statischen timeout einen AJAX request um zu sehn wies um die Session bestellt ist, dann verlänger ich - falls der timeout durch nen pageload eines anderen fensters verlängert worden war - durch den AJAX request eben doch wieder automatisch.. Überlegung: das ganze so stricken, daß die AJAX checks nicht verlängern, was erforderlich machen würde, daß es neben SESSION INSTNAME STAMP noch eine SESSION INSTNAME LAST_STAMP gäbe, auf die STAMP manuell wieder gesetzt würde wenn der Request eben der AJAX check wäre..
Dunno, evtl. seh ich aber auch grad den Wald vor Bäumen nicht.. das SESSION Zeug macht mich immer bischen breiig im kopp.. ;)

@ghost
Copy link

ghost commented Jan 23, 2013

Vorschlag:

Für R4 -> Timeout Erhöhen auf 2h oder evtl. sogar 4h (halber Arbeitstag) + evtl. ganz rudimentär ;) ein Hinweis im Footer "Automatischer Logout nach: 47...46...45min". Sollte der Counter tatzächlich heruntergezählet haben könnte per JS ein Hinweis hochpoppen "Sie wurden ausgeloggt. Wenn Sie ungespeicherte Texte etc. haben, sicher Sie diese jetzt seperat bevor Sie fortfahren".

Für R5 -> Evtl. die DeLuxe-Variante ala mite :)

Bin jetzt erstmal wech...

Cheers

@jdlx
Copy link
Contributor

jdlx commented Jan 23, 2013

@rexdude Eine Minimallösung für r4 core wäre imho ein Select zum Einstellen von REX SESSION_TIMEOUT .. kein popup/counter gefrickel, ganz basic und fedsch.

Die overlay Lösung wäre als Plugin umsetzbar .. und als solche dann auch r5 portabel. Zu dem was ich oben schrob wg. der "callback = verlängert Session" Problematik: hab dabei gepflegt die Möglichkeit von Cookies ausgeblendet.. das sollte imho auf dem Wege eigentlich gut machbar sein.

Da der PR ja inzwischen eindeutig hinfällig ist, mache ich hier mal dahingehend zu.. weitere Diskussion/Ideen bleiben ja trotzdem möglich.

@jdlx jdlx closed this Jan 23, 2013
@ghost
Copy link

ghost commented Jan 24, 2013

@jdlx sollte vielleicht ein neuer issue werden, da es sonst evtl. untergeht...

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants