Thomas Luethi: session / header / application problem

Beitrag lesen

Hallo Heiko,

So, da bin ich wieder;-)

Schickst Du etwa eine HTML-Seite, nachdem Du gesagt hast,
jetzt kaeme eine Excel-Tabelle?

das klappt prima!

OK, alles klar.
Du schickst also aehnliches Moechtegern-HTML, wie es Excel produziert,
wenn man auf "Datei -> Speichern unter" geht und dann "HTML" als
Export-Format waehlt, und Excel oeffnet dieses Dokument.

ich habe den beginn des scriptes kopiert...da ich bei dem tool doch keine usernamen und pw mit übergeben kann ...?!

Du koenntest ggf. die Session-ID eines erfolgreich "eingeloggten" Benutzers
als URL-Parameter mitgeben.
(Kommt auf die PHP-Konfiguration an, Stichwort session.use_only_cookies)

Probier es zuerst mal selbst:
https://www.example.com/.../export.php?PHPSESSID=xyz123abc456

Die Session-ID kannst Du Dir ja von einem Script anzeigen lassen,
sobald Du eingeloggt bist. Oder Du schaust halt in den Cookies nach,
falls Du weisst oder herausfindest, wie das beim MS IE geht...

An error occured I/O error: http error no host given

Diese Meldung sagt mir leider nichts.

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Ich nehme mal an, dass Du fuer diese Angaben verantwortlich bist.
Mein Apache/PHP schickt keinen solchen Kram...
Versuch mal, sie wegzulassen.

200 OK
Content-Disposition: attachment; filename="EMEA Forecast 120304.xls"

Auch hier hast Du wieder Leerzeichen im Dateinamen.
Spielt vielleicht auch eine Rolle...

=> Ich vermute, Du solltest beim Fall, dass Du die Leute umleiten willst,
nach dem Umleitungs-header() ein exit; einbauen.
Steht uebrigens auch im Manual zu header()!

if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
{
header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
exit;
}

Erst, als ich offline und unterwegs war, kam mir folgendes in den Sinn:
Ganz sauber waere eigentlich, das ganze mit if/else zu machen:

if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)
  {
   header("Location: https://".$DOCUMENT_ROOT.$Home_URL."/index.php");
   /* Plus ggf. ein paar Zeilen HTML mit einem Link, siehe unten */
  }
else
 {
  /* Eigentliche Ausgabe */
 }

Ich weiss, dass der dclp-FAQ-Artikel "Waechter"
http://www.dclp-faq.de/q/q-stil-waechter.html
Deinen Schreibstil propagiert.

Aber eben, wenn Du hier mit if/else arbeitest, und
nicht mit nur mit if und exit, dann ist schonmal ganz
eindeutig, welcher Fall zutrifft.

Ganz korrekt (nach HTTP/1.1) sollten uebrigens nach einem 30x-Head
noch ein paar Zeilen HTML mit einem klickbaren Link zur
neuen URL folgen.
In Opera kann man Umleitungen ausschalten, dann wird
ebendieses HTML dann angezeigt.

aber doch nur client seitig?! über header läuft das doch schon auf dem server ab, oder?!

Ja, klar. Aber es erhoeht die Stabilitaet und Standard-Konformitaet,
wenn Du Dich bezueglich "302 Found" an RFC 2616 haeltst:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3
  "Unless the request method was HEAD, the entity of the
   response SHOULD contain a short hypertext note with
   a hyperlink to the new URI(s)."

Ich wuerde es etwa so machen:

if (/* nicht eingeloggt/berechtigt */)
  {
   $zielurl="https://...";
   header("Location: $zielurl");
   echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n";
   echo "<title>Umleitung</title>\n";
   echo "<p>Umleitung: <a href='$zielurl'>Zur Loginseite</a>";
  }
else
 { /* eigentliche Ausgabe */ }

hast du vielleicht ne idee für nen ganz anderen ansatz?

Ich wuerde versuchen, das Problem einzukreisen.

Es scheint ja primaer etwas mit Sessions sowie mit
dem Unterschied HTTPS/HTTP zu tun zu haben.

Ich wuerde also mal als eigentliche Ausgabe
etwas ganz einfaches nehmen, nicht gleich ein
Excel-HTML-Dokument, sondern nur etwas Plain-Text:

if (/* nicht eingeloggt/berechtigt */)
  {
   header("Location: $zielurl");
   /* u.s.w. */
  }
else
 { echo "Alles OK, Sie duerften die Daten sehen!";  }

Auch die Bedingung solltest Du nochmals ueberpruefen.

if ($_SESSION['Login'] != "true" OR !$_SESSION['Login'] OR $_SESSION["Master"] != 1)

Ist das wirklich das, was Du willst?
Ich vermute, Du willst die Leute zulassen, die Login==true und Master==1 haben.

Das koennte man z.B., wenn man etwas faul ist, so schreiben:

if ($_SESSION['Login']=="true" AND $_SESSION["Master"]==1)
  { /* Eigentliche Ausgabe */ }
else
  { /* Umleitung zur Login-Seite */ }

Oder, wenn man die Umleitung als erstes (im IF-Teil) will,
mit Negation der Bedingung:

if (!($_SESSION['Login']=="true" AND $_SESSION["Master"]==1))
  { /* Umleitung zur Login-Seite */ }
else
  { /* Eigentliche Ausgabe */ }

Weil man dabei aber nicht prueft, ob die Variablen bzw. Schluessel
ueberhaupt existieren, bevor man ihren Wert anschaut, ist diese
Schreibweise nicht ganz korrekt.
Bei scharf eingestellter Fehlerbehandlung gibt es so z.B. die Meldung
Notice: Undefined index Login
wenn $_SESSION['Login'] nicht definiert ist.

Um ganz sauber zu sein, sollte man deshalb schreiben:

if (!(isset($_SESSION['Login']) AND isset($_SESSION['Master']) AND $_SESSION['Login']=="true" AND $_SESSION["Master"]==1))
  { /* Umleitung zur Login-Seite */ }
else
  { /* Eigentliche Ausgabe */ }

Ein weiterer Punkt, den Du recherchieren bzw. ausprobieren
koenntest, ist die Reihenfolge der verschiedenen HTTP-Content-Header,
mit denen Du ja das Browserverhalten beeinflussen moechtest.

Ich habe nur eine schwache Erinnerung, dass diese Reihenfolge
evtl. beim MS IE eine Rolle spielt.
Vielleicht findest Du dazu mehr...

inhalt in eine temp. variable schreiben per header neue seite aufrufen, die die variable ausgibt und löscht?

Ich glaube nicht, dass das etwas bringen wuerde.
Es ist egal, woher das Skript die Daten hat, die es ausgibt.

ohne session_start und if abfrage funzt es ja prima auch bei https...

Daraus werde ich noch immer nicht schlau.

Findet denn alles unter HTTPS statt?
Also auch das Einloggen u.s.w.?

Browser unterscheiden evtl. auch bezueglich Cookies u.s.w.
zwischen https://www.example.com und http://www.example.com

---

Du hast AFAIK noch gar nicht erwaehnt, welchen Browser
Du verwendest.
Falls es der MS IE ist - was ich irgendwie immer annahm - dann
koenntest Du ja auch mal die Optionen durchforsten und schauen,
ob es etwas aendert, wenn Du die Domain bzw. URL zu den
"vertrauenswuerdigen" Seiten (oder wie das heisst) hinzufuegst.

Sorry, irgendwie bin ich mit der ganzen Geschichte am Ende
meines Lateins...

Gruesse,

Thomas

--
Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/