php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.12.2011, 20:51  
Benutzer
 
Benutzerbild von wingedFish
 
Registriert seit: 20.04.2011
Beiträge: 30
PHP-Kenntnisse:
Fortgeschritten
wingedFish befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Session Sicherheit

Hallo!

Ich habe mir jetzt einige Berichte durchgelesen wie man eine Session absichern soll, aber es gibt verschiedene Möglichkeiten und ich weiß nicht, welche ich nehmen soll.
Hier habe ich ein Beispiel, bei dem ich mich an dieser Seite orientiert habe: http://phpforum.de/forum/showthread.php?t=216531

Reicht es, wenn ich dieses Codestück (s.u) einfach an den Anfang jeder Seite setze?
Innerhalb des Codes steht session_regenerate_id(TRUE) und soweit ich das verstanden habe, führt diese Funktion dazu, dass sobald eine alte Seite neu geladen wird, die SessionId nicht mehr stimmt.

Innerhalb meines Projektes werden zahlreiche Ajax-Aufrufe gestartet und ich möchte auch da für Sicherheit sorgen. Die Funktion output_add_rewrite_var irritiert mich dahingehend, dass ich nicht weiß, ob diese Variable auch bis in die Ajax-Aufrufe weitergereicht wird.
Vielen Dank im Vorraus für eure Hilfe!

PHP-Code:
if(empty($_SESSION) OR !isset($_SESSION))
{
    
ini_set('session.use_cookies',1); 
    
ini_set('session.use_trans_sid'0);
    
ini_set('session.use_only_cookies'1);
}

session_start();
session_regenerate_id(TRUE);

 
// Browsermarker
if(empty($_SESSION['BM']))
{
  
$_SESSION = array();
  
$_SESSION['BM'] = uniqid();
}

if(empty(
$_SESSION['BM']))


// "Gesundheits"-Schlüssel
$salt "7639-vdzaxyew-23675";
$sanityKey =  $_SERVER['DOCUMENT_ROOT']+$_SERVER['HTTP_USER_AGENT']+$salt;

if(empty(
$_SESSION['SK'])) {
    
    
$_SESSION['SK'] = $sanityKey;
}

$proofLogin false;

//Stimmt der Browsermarker oder der SanityKey nicht überein, loginseite anzeigen
if( $_REQUEST['BM'] !== $_SESSION['BM'])
    || 
$sanityKey != $_SESSION['SK']) {


  
//===> loginsseite anzeigen
  
$proofLogin true;
  
  


// den Browsermarker weiterreichen
output_add_rewrite_var ('BM',$_SESSION['BM']); 
wingedFish ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.12.2011, 10:38  
Erfahrener Benutzer
 
Registriert seit: 10.01.2010
Beiträge: 386
PHP-Kenntnisse:
Fortgeschritten
ChrisvA befindet sich auf einem aufstrebenden Ast
Standard

Was ich auf jeden Fall zum Schutz reinnehmen würde wäre die REMOTE_ADDR, also die Client IP, damit wäre der Key alleine schon mal nutzlos, da es für einen außenstehenden fast unmöglich ist mit der IP des Zieles eine Website zu besuchen, falls er selbst außerhalb des Netzwerkes ist. Einzig ein Trojaner oder dergleichen würde das schaffen, der kann aber denke ich mal alle Schutzfunktionen außer Kraft setzen.

Einziger Nachteil, falls sich die IP während des Besuches ändert, dann wäre die Session natürlich andauernd futsch und der Besucher dürfte falls das mehrfach passiert ziemlich genervt sein.
Mir ist jedoch fast keine Methode bekannt, die zum ändern der externen IP während des Seitenbesuches führt, außer man nutzt ein Anonymisierungsnetzwerk oder wählt sich per VPN in ein neues Netzwerk ein über das man dann die Seite besucht.
ChrisvA ist offline   Mit Zitat antworten
Alt 25.12.2011, 11:05  
meikel
Gast
 
Beiträge: n/a
Standard

Ich beziehe mich mal nur auf das Script.

Zitat:
if(empty($_SESSION) OR !isset($_SESSION))
{
ini_set('session.use_cookies',1);
ini_set('session.use_trans_sid', 0);
ini_set('session.use_only_cookies', 1);
}
Ungünstig. $_SESSION existiert, wird aber erst nach session_start() gefüllt. Die Configanweisungen solltest Du besser in die Config auslagern.

Falls apache2handler:
.htacces File erstellen oder editieren:
Code:
# apache2handler
<IfModule mod_php5.c>
    php_flag session.use_cookies  1
    php_flag session.use_only_cookies  1
    php_flag session.use_trans_sid  0
</IfModule>
Falls fastCGI und PHP >= 5.3.3
.user.ini erstellen oder editieren
Code:
session.use_cookies  1
session.use_only_cookies  1
session.use_trans_sid  0
.htaccess u/o .user.ini am besten ins DocumentRoot.
Code:
session_regenerate_id(TRUE);
Ist auf jedem Falle nützlich.

Code:
 // Browsermarker
if(empty($_SESSION['BM']))
{
  $_SESSION = array();
  $_SESSION['BM'] = uniqid();
}
Achtung! Mit $_SESSION = array(); killst Du den kompletten Inhalt der Session.

Beachte zusätzlich noch folgendes:
vor der Ausführung von Location Header ein session_write_close() und nach dem header ein exit.
  Mit Zitat antworten
Alt 25.12.2011, 11:51  
Benutzer
 
Benutzerbild von wingedFish
 
Registriert seit: 20.04.2011
Beiträge: 30
PHP-Kenntnisse:
Fortgeschritten
wingedFish befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für die nützlichen Tipps! Ich habe den Code gestern getestet und bemerkt, dass er so gar nicht funktioniert. Beispielsweise das $_SESSION = array(); sollte ja nur aufgerufen werden, wenn man sich ausloggt.
Also entschuldigt für das wirre Codestück...

@meikel:
Deinen Hinweis für den Location header habe ich nicht ganz verstanden. Beziehst du dich damit auf die Funktion header() http://de.php.net/manual/de/function.header.php ? Die Funktion session_write_close() dient soweit ich das aus dem Maual verstanden habe, dazu, dass Ladezeiten verringert werden, da das Schreiben der Session beendet wird, sobald die Funktion aufgerufen wird. Klingt sinnvoll, aber ich würde diese Funtkion erst am Ende der Seite aufrufen, da ich auf einigen Seiten noch mehr in die Session speichere. Sie dient nicht nur als Login, sondern speichert auch noch andere Infos.

Die Session Einstellungen werden per Include Funktion an den Anfang jeder Seite eingefügt. Hat das Nachteile gegenüber den Methoden, die du vorgeschlagen hast?

@ChrisvA: REMOTE_ADDR werde ich auf jeden FAll noch mit rein nehmen.
Meine vorherige "Sicherheitsüberprüfung" (bevor ich mich etwas in die Sicherheit von Sessions reingelesen habe) war lediglich diese Abfrage:

PHP-Code:
if($_SESSION['nameMeinesProjekts']->loggedIn == true AND $_SESSION['IP'] == $_SERVER['REMOTE_ADDR']) {
  
//alles ok

Auf den Seiten, die ich dann danach gelesen habe, kam REMOTE_ADDR nicht mehr vor, also habe ich es wieder aus dem Code herausgenommen. Ist es denn überhaupt richtig, IP und REMOTE_ADDR miteinander zu vergleichen?
wingedFish ist offline   Mit Zitat antworten
Alt 25.12.2011, 14:31  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von wingedFish Beitrag anzeigen
@meikel:
Deinen Hinweis für den Location header habe ich nicht ganz verstanden.
Beispiel:
Der User hat erfolgreich den Login absolviert und soll unter Beibehaltung der Session auf eine neue Seite "umgeleitet" werden.
PHP-Code:
if (irgendWas){
  
$_SESSION['LoginOK'] = true;
  
session_write_close();
  
header('Location: http://example.com/ich_bin_drin.php');
  exit;
}else{
  echo 
"Login fehlerhaft.";
...

mit session_write_close() wird sichergestellt, daß die Session gespeichert wird, bevor der User "stiften geht".
Ich weiß - theoretisch wird die Session beim Scriptende automatisch gespeichert - aber doppelt genäht hält besser. Früher gabs da ab und zu versionsabhängige Stolperstellen...

Geändert von meikel (25.12.2011 um 17:02 Uhr). Grund: dibbfälr
  Mit Zitat antworten
Alt 25.12.2011, 15:42  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

PHP-Code:
$sanityKey =  $_SERVER['DOCUMENT_ROOT']+$_SERVER['HTTP_USER_AGENT']+$salt
DAS sieht mir nach einem Bug aus... Stringverkettung passiert mit dem Punkt.
Beim + werden die Parameter auf eine Zahl gecastet, was für Dateipfade wohl auf 0 hinausläuft.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 25.12.2011, 16:40  
Benutzer
 
Benutzerbild von wingedFish
 
Registriert seit: 20.04.2011
Beiträge: 30
PHP-Kenntnisse:
Fortgeschritten
wingedFish befindet sich auf einem aufstrebenden Ast
Standard

@ lstegelitz: Danke, das habe ich gar nicht bemerkt! Ich habe zuviel Javascript in letzter Zeit geschrieben....

@meikel: okay : )
wingedFish ist offline   Mit Zitat antworten
Alt 25.12.2011, 18:33  
Benutzer
 
Benutzerbild von wingedFish
 
Registriert seit: 20.04.2011
Beiträge: 30
PHP-Kenntnisse:
Fortgeschritten
wingedFish befindet sich auf einem aufstrebenden Ast
Standard

Ich habe eben bemerkt, dass, falls ich den Browsermarker benutzen möchte, bei absoluten URLs, also bei I-Frames und besonders bei den zahlreichen Ajaxaufrufen separat einfügen müsste...
wingedFish ist offline   Mit Zitat antworten
Alt 27.12.2011, 10:54  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Ich würde den "Browsermarker"/token einfach nur bei POST-Requests (bzw. requests die etwas verändern) mitschicken - bei allen anderen ist es ja eigentlich egal. Dann kannst du deine AJAX-Funktionen so umschreiben, dass der Token automatisch angehängt wird. Beispielsweise in dem du ihn in ein <meta>-Tag schreibst und dort per JS wieder ausliest.
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 27.12.2011, 12:56  
Benutzer
 
Benutzerbild von wingedFish
 
Registriert seit: 20.04.2011
Beiträge: 30
PHP-Kenntnisse:
Fortgeschritten
wingedFish befindet sich auf einem aufstrebenden Ast
Standard

Das sollte ohne Probleme gehen, ich kann den Browsermarker/Token auch in eine Variable speichern und per Ajax request weiterreichen.
Vielen Dank für alle Antworten!
wingedFish ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Fragen zu Login und Session (geschützter Bereich) ts.ts PHP Einsteiger 12 14.10.2011 17:36
Session sicherheit mit IP Adresse??? Sven1987h PHP Einsteiger 9 11.10.2011 11:37
Session GC und Timeout nutcracker PHP Einsteiger 1 24.01.2011 19:32
[Erledigt] Sicherheit bei Objekt-Eigenschaften in einer Session Raiden PHP-Fortgeschrittene 22 06.12.2010 16:49
[Erledigt] $_SESSION frage tomnar PHP Tipps 2010 24 09.11.2010 19:37
session variable verschwindet bei erneutem seitenaufruf david.a.p. PHP Tipps 2009 2 17.08.2009 16:07
SessionHandler - Sessions in einer Datenbank #Avedo Software-Design 11 04.05.2009 15:44
Session nofear87 PHP Tipps 2008 8 05.11.2008 10:42
Brauche Ratschläge bzg. Klassenaufbau und Sicherheit NONNNNN PHP-Fortgeschrittene 13 25.03.2008 15:05
Problem bei session Lifetime Cyberbob_at_tot PHP Tipps 2007 5 05.06.2007 17:47
session nach seitenwechsel leer... GELight PHP Tipps 2006 8 17.09.2006 15:17
[Erledigt] php session problem :( PHP Tipps 2005-2 5 21.10.2005 16:37
Session wird nicht angelegt PHP Tipps 2005-2 7 24.07.2005 13:35
Kreieren einer Session PHP Tipps 2005 11 28.05.2005 15:16
[Erledigt] Formulardaten in einer Session speichern, per Link übergeben PHP Tipps 2004-2 2 29.12.2004 15:47

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
session sicherheit php browsermarker, php sicherheit von sessions, php session sicherheit, session sicher, login session sicher, session sanity_key, php 5.3.3 session verschwindet beim seitenwechsel, php uniqid in session speichern

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum