phpbar.de logo

Mailinglisten-Archive

[php] login-sicherheit mit session

[php] login-sicherheit mit session

Kai Meder php-ml at kai.meder.info
Sam Jan 17 04:02:52 CET 2004


Wolfgang Hauck wrote:

 >> [...] anbei die gewünschte
 >> literaische Abhandlung des von Ihnen gewünschten Themas...
 >>
 >> http://www.acros.si/papers/session_fixation.pdf


Hallo zusammen,

habe das paper zwar schon vor einem halben jahr gelesen,
jedoch bin ich jetzt erst dazu gekommen, die beschriebenen probleme
rudimentär zu lösen.
an dieser stelle ein riesen dank an wolfgang, für diesen sehr sehr guten
link!

herausgekommen ist folgender InterceptingFilter, der ziemlich
straight-forward sein sollte und keiner weiteren erklärung bedarf.

nur eines: das request-object kapselt die GPC-variablen, bei portierung
in die eigene php-applikation müsste man also $_GET,$_POST, und $_COOKIE
auf die variable "SID" checken, oder wie immer ihr die nennt ...

<?php
class SessionFilter extends InterceptingFilter
{
function preProcess()
      {
      session_name('SID');
      session_id($this->getValidSID());
      session_start();

      echo 'SID:'.session_id().'<br />';
      }

/* prevents session-fixation attacks */
function getValidSID()
      {
      $requestedSID = $this->request->get('SID');

      // invalid structure
      if (!preg_match('°^[0-9a-z]{32}$°' , $requestedSID))
          return $this->generateSID();

      $sessionDirName = ini_get('session.save_path');
      $sessionFileName = realpath($sessionDirName.'/sess_'.$requestedSID);

      // someone tries to trick the session-management by providing a
filesystem-path instead of a SID
      if (substr($sessionFileName , 0 , strlen($sessionDirName)) !=
$sessionDirName)
          return $this->generateSID();

      // session-file does not exist yet, someone tries to "fixate" a new
session
      if (!is_file($sessionFileName) || !is_readable($sessionFileName))
          return $this->generateSID();

      return $requestedSID;
      }

function generateSID()
      {
      return md5(uniqid(rand() , true));
      }
}
?>


nur als wiedererinnerung an das thema gedacht,
kai

p.s. ist das problem eigentlich noch aktuell oder bereits gefixt ?

php::bar PHP Wiki   -   Listenarchive