TP Underground Lounge 07/08
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 02.09.2005, 02:44   #1
giv
TP-Senior
 
Benutzerbild von giv
 
Registriert seit: Jan 2003
Ort: Darmstadt
giv macht sich hier sehr viel Mühe
Lightbulb

[PHP, Apache] sessions bei abgeschalteten cookies realisieren


hallo,

der hintergrund zu diesem thread ist in jenem thread nachzulesen. steffen hat mich in posting #49 auf diese idee gebracht. unter gewissen umständen ist es möglich, die realisierung einer session auf ein feature des browsers zu verlagern, welches im vergleich zu cookies nicht abschaltbar ist und von allen browsern unterstützt wird - die http authentifizierung.

http authentifizierung ist eine user authentifizierung. die herkömmliche authentifizierung durch eine session id, wie sie bei php sessions nötig ist, möchte ich hier eine client authentifizierung nennen. das heißt, dass sich nur der browser authentifiziert. in der regel kann man davon ausgehen, dass der browser während der session nicht von mehreren usern benutzt wird. aber dennoch besteht ein unterschied. dieser sollte aber in folgendem szenario keinen unterschied machen, da man mit einer session im allgemeinen immer auch user bezogene daten speichert.

bei einer user authentifizierung per http muss bei jeder anfrage das paar benutzername und passwort mitgesendet werden, da http ein zustandsloses protokoll ist. dies wäre aber höchst benutzerundfreundlich, wenn man bei jedem seitenaufruf das passwort neu eingeben müsste, daher erledigt das der user agent, also die browsersoftware. und genau dies möchte ich ausnutzen.

meine idee löst das problem, dass cookie unterstützung aus sicherheitsgründen deaktiviert wird und somit der automatischen übermittlung der session id steine in den weg gelegt werden, nur in einem bestimmten fall:

kriterien:
- man möchte auch ohne cookieunterstützung des clients eine php session realisieren
- man möchte nicht auf die übermittlung der session id per url oder per hidden field setzen, warum auch immer (darüber könnte man eine neue diskussion anfangen)
- es ist immer ein user per http authentifiziert, wenn daten in der session abgelegt werden

folgendes beispiel lief auf einem apache2 mit php 4.3.10 als modul

verzeichnisstruktur: ein neues verzeichnis anlegen, darin dann folgende dateien erstellen:

1. index.php
PHP-Code:
<?php
// sicher gehen, dass nur cookies benutzt werden
ini_set('session.use_only_cookies''1');
ini_set('session.use_trans_sid''0');
 
// hat sich ein user per http authentifiziert?
if (isset($_SERVER['PHP_AUTH_USER']))
{
  
// ganz sicher sein, dass cookies abgeschaltet sind
  
unset($_COOKIE);
 
  
// datei mit session ids auslesen
  
$file file('session_ids.txt');
  foreach (
$file as $line)
  {
    list(
$user$session_id$timestamp) = explode(' '$line);
    
$age round((time() - $timestamp)/60);
    if (   (
$user == $_SERVER['PHP_AUTH_USER'])
        && (
$age < (session_cache_expire()-1)))
    {
      
// session gefunden, die zu eingeloggtem user gehoert und nicht abgelaufen ist. session wird wieder aufgenommen
      
session_id($session_id);
      
session_start();
      echo 
'<pre>';
      echo 
'user: <strong>' $_SERVER['PHP_AUTH_USER']  . '</strong><br />';
      echo 
'session id in session_ids.txt gefunden und session wieder aufgenommen<br />';
      echo 
'session id: ' session_id() . '<br />';
      echo 
'session daten: ' print_r($_SESSIONtrue);
      echo 
'<br /><a href="">reload</a>';
      
$flag true;
    }
  }
 
  
// es wurde keine session gefunden, die zum eingeloggten user passt
  
if (!$flag)
  {
    
// neue session starten
    
session_start();
    echo 
'<pre>';
    echo 
'user: <strong>' $_SERVER['PHP_AUTH_USER'] . '</strong><br />';
    echo 
'neue php session gestartet, weil alte session noch nicht existiert hat oder abgelaufen war<br />';
    echo 
'session id: ' session_id() . '<br />';
    
$_SESSION['test'] = $_SERVER['PHP_AUTH_USER'] . ' http://www.traum-projekt.com/forum/';
    echo 
'variable $test in der session gespeichert<br />';
    
// neue session id speichern
    
$new_file = array();
    foreach (
$file as $line)
      if (
strstr($line$_SERVER['PHP_AUTH_USER']))
      {
        
$new_file[] = $user ' ' session_id() . ' ' time();
        
$_flag true;
      }
      elseif (
trim($line))
        
$new_file[] = $line;
    if (!
$_flag)
      
$new_file[] = $_SERVER['PHP_AUTH_USER'] . ' ' session_id() . ' ' time();
    
print_r($new_file);
    
$handle fopen('session_ids.txt''w');
    
fwrite($handleimplode("\n"$new_file));
    
fclose($handle);
    echo 
'session id in session_ids.txt abgelegt<br />';
    echo 
'<a href="">reload</a>';
  }
  echo 
'</pre>';
}
else
{
  
// kein user hat sich per http authentifiziert
  // starte normale session, auf cookies basiert
  
session_start();
  echo 
'<pre>';
  echo 
'user: <strong>anonymous</strong><br />';
 
  if (!isset(
$_SESSION['test']))
  {
    echo 
'neue php session gestartet<br />';
    echo 
'session id: ' session_id() . '<br />';
    
$_SESSION['test'] = 'http://www.traum-projekt.com/forum/';
    echo 
'variable $test in der session gespeichert<br />';
  }
  else
  {
    echo 
'php session wird fortgesetzt<br />';
    echo 
'session id: ' session_id() . '<br />';
    echo 
'session daten: ' print_r($_SESSIONtrue);
  }
 
  echo 
'<a href="">reload</a> ';
  echo 
'<a href="login.php">login</a>';
  echo 
'</pre>';
}
?>
2. login.php
PHP-Code:
<?php
header
('Location: index.php');
?>
3. .htaccess
Code:
AuthType Basic
AuthName "session demo"
AuthUserFile <pfad zur passwort datei>

Satisfy Any
Require valid-user
 
<Files login.php>
  Satisfy All
  Require valid-user
</Files>
4. dann eine datei namens session_ids.txt anlegen und die rechte so setzen, dass das php script lesen und schreiben darf.

5. unter linux existiert der befehl htpasswd zum anlegen der passwortdatei. in meinem apache im xampp packet unter windows liegt der befehl im apache/bin ordner bei. dann mindestens einen benutzer anlegen.

6. jetzt die cookies im browser abschalten. dann index.php laden. fertig. testen. tipp: in der firefox developer's bar gibt es unter miscellaneous eine funktion, um sich auszuloggen.

das szenario sollte auch auf jedem anderen webserver funktionieren, allerdings habe ich nur erfahrung mit dem apache und kann daher auch nur zum apache hilfestellung geben, wobei ich da selbst noch hilfe bräuchte, wie man ein login und ein logout per http gescheit steuert.

also nun zu dem, was ich überhaupt mache:
wenn man index.php bei ausgeschalteten cookies anonym betritt, wird man feststellen, dass bei jedem reload eine neue session beginnt. zum testen, dass dies anders ist bei eingeschalteten cookies, kann einer das gerne tun.

klickt man auf login wird man auf login.php geleitet. da diese resource durch entsprechende apache konfiguration mit 'Satisfy All' und 'Require valid-user' eine user authentifizierung zwingend verlangt, muss man sich einloggen. dann natürlich mit den usern, die man beim erstellen der passwort datei angelegt hatte. nach erfolgreichem login wird man wieder zur index.php geleitet.

ist nun ein user eingeloggt ($_SERVER['PHP_AUTH_USER'] enthält user namen) wird in der datei session_ids.txt nachgeschaut, ob der user vorher schonmal eine session begonnen hatte und ob diese noch gültig ist. falls ja, wird diese wieder aufgenommen, falls nein, wird eine neue session begonnen und die session id gespeichert. anstelle der textdatei kann man sich natürlich auch eine datenbank als speicherort vorstellen.

in keinem der beiden fälle wird ein cookie angelegt oder eine session id auf anderem wege übertragen, das skript nutzt die 'session' aus, die der browser aufgrund der http authenitfzierung managed/handled.

das skript soll nur das prinzip demonstrieren. es ist keine ausgereifte lösung, die man als basis für ein richtiges projekt nutzen sollte - eher zum verständnis. vor allem ein gesteuertes logout ist nicht möglich. aber da waren meine apache kenntnisse erschöpft, vielleicht weiß jemand von euch, wie man so etwas implementiert?

anmerkung: mir ist bewusst, dass man bei vorhandener http authentifizierung auch auf die php session verzichten kann, aber es geht hier um einen workaround für die session id übergabe per cookie. mir ist auch bewusst, dass das von mir beschriebene keine megaidee ist und auch jeder andere darauf kommen könnte, ja, schon gekommen ist. der ansatz meiner idee wird ja in der software dieses forums schon verfolgt, wie steffen geschrieben hat - allerdings mit einem anderen ziel und kontext.

ich hoffe, mein script hat keine groben fehler mehr, wenn doch, dann postet sie. für jede andere konstruktive kritik bin ich natürlich auch offen und ohr.

nacht

p.s. ich werde die dateien noch packen und posten, dass man nicht den ganzen aufwand mit dem anlegen der dateien treiben muss, aber das frühestens morgen abend.
__________________
forenregeln - 3.d) ... richtige groß- und kleinschreibung benutzen ...
giv ist offline   Mit Zitat antworten


Alt 02.09.2005, 20:11   #2
giv
TP-Senior
 
Benutzerbild von giv
 
Registriert seit: Jan 2003
Ort: Darmstadt
giv macht sich hier sehr viel Mühe
also anbei die dateien zum ausprobieren. die htusers_session datei in ein verzeichnis außerhalb des document roots verschieben und in der .htaccess entsprechend den pfad anpassen.

EDIT

achso, wer meine passwortdatei benutzt, sollte auch die passwörter und user kennen:
user otto pass otto
user anna pass anna
Angehängte Dateien
Dateityp: zip session.zip (1,7 KB, 6x aufgerufen)
__________________
forenregeln - 3.d) ... richtige groß- und kleinschreibung benutzen ...

Geändert von giv (02.09.2005 um 22:25 Uhr).
giv ist offline   Mit Zitat antworten
Alt 02.09.2005, 21:27   #3
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Mann Dennis, da hast Du Dich ja voll reingekniet.

Was ich noch nicht ganz checke ist, warum Du auf die http_authentifizierung zurückgreifst. Klar möchtest Du das vom Client zum Server holen, aber dafür reicht doch auch eine normale Login-Form.
Aber dafür zeigt Dein Beispiel auch mal diesen Weg.
Ich werd es mir die Tage in Ruhe anschauen.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
[PHP, Apache] sessions bei abgeschalteten cookies realisieren [PHP, Apache] sessions bei abgeschalteten cookies realisieren
« Sessions bei abgeschalteten cookies | Gefunden: Kostenloser PHP-Debugger »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:23 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67