{"id":409,"date":"2010-11-28T15:54:46","date_gmt":"2010-11-28T14:54:46","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=409"},"modified":"2016-01-11T23:09:34","modified_gmt":"2016-01-11T22:09:34","slug":"php-session-management-erklaert","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/php-session-management-erklaert\/","title":{"rendered":"PHP Session-Management erkl\u00e4rt"},"content":{"rendered":"<p><b>Anmerkung:<\/b> Dieser Post ist dem Teil \u00fcber <a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-2-session-highjacking-und-session-fixation\/\">Session-Highjacking und Session-Fixation<\/a> vorgeschaltet, da der Artikel dar\u00fcber sonst zu lang geworden w\u00e4re.<\/p>\n<p>In dem Moment, indem der Benutzer per <\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">session_start();<\/pre>\n<p> eine Session verpasst bekommt, wird ein <b>Session-Cookie<\/b> auf dem PC des Benutzers angelegt, der bei jedem folgenden Request wieder an den Server \u00fcbertragen wird. Dieser Cookie hat den Name <b>PHPSESSID<\/b> und im Inhalt steht der Session-Name. Der sieht etwa so aus: <i>3cm12d11d14fg0ssklulk1k274<\/i>. Dieser Session-Cookie wird verwendet, um den Benutzer wiedererkennen zu k\u00f6nnen. Mit Firebug oder dem coolen Firefox-Addon <a href=\"https:\/\/addons.mozilla.org\/de\/firefox\/addon\/4510\/\">Edit Cookies<\/a> (welches wir sp\u00e4ter sowieso noch brauchen) l\u00e4sst sich gut sehen, welche Cookies \u00fcbertragen werden und was deren Inhalt ist. <\/p>\n<p><b>Ein Test:<\/b> Auf dem localhost eine Datei mit folgendem Inhalt anlegen:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nsession_start();\r\nprint session_name().&quot;=&quot;.session_id();\r\n<\/pre>\n<p>und gleichzeitig Das Firebug Net-Panel aufmachen. Das Ergebnis wird ungef\u00e4hr so aussehen:<br \/>\n<div id=\"attachment_410\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/session-check.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-410\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/session-check-300x287.png\" alt=\"session-check\" title=\"session-check\" width=\"300\" height=\"287\" class=\"size-medium wp-image-410\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/session-check-300x287.png 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/session-check.png 733w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-410\" class=\"wp-caption-text\">session-check<\/p><\/div><\/p>\n<p>So wird also klar, wie die Server-Session und der Session-Cookie auf dem PC des Benutzers zusammenh\u00e4ngen. Nun gebe ich der Session auch noch einen Wert mit:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nsession_start();\r\n$_SESSION[&#039;test&#039;] = &quot;testing with values&quot;;\r\nprint session_name().&quot;=&quot;.session_id();\r\n<\/pre>\n<p>Auf der Serverseite ist nun im \/tmp\/-Verzeichnis (unter Windows-XAMPP bei mir <i>D:\\xampp\\tmp\\<\/i>) in der Datei <b>sess_[meine-session-id]<\/b> folgendes gespeichert:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\ntest|s:19:&quot;testing with values&quot;;\r\n<\/pre>\n<p>Macht Sinn, oder?<\/p>\n<h3>Relevante php.ini &#8211; Einstellungen f\u00fcr Sessions<\/h3>\n<p>Es gibt 4 wirklich wichtige Einstellungen f\u00fcr die Session-Verwaltung:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nsession.use_cookies\r\nsession.use_only_cookies\r\nsession.use_trans_sid\r\nsession.cookie_httponly\r\n<\/pre>\n<ol>\n<li><b>session.use_cookies<\/b> (Defaultwert: 1) besagt, ob session-cookies angelegt werden. Unbedingt auf 1 lassen. Im Fall einer Deaktivierung dieser Option muss bei jedem Link die Session-ID wieder angehangen wird. Das ist h\u00e4sslich und unsicher. Dann sieht jeder Link ungef\u00e4hr so aus:\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">http:\/\/www.webseite.de\/user-area\/edit-profile.php?PHPSESSID=3cm12d11d14fg0ssklulk1k274<\/pre>\n<\/li>\n<li><b>session.use_only_cookies<\/b> (Defaultwert ab PHP 5.3: 1) beschr\u00e4nkt die Session-Verwaltung ausschlie\u00dflich auf Session-Cookies. Es sperrt Benutzer, die Cookies deaktiviert haben komplett aus, weil es dann nicht mehr m\u00f6glich ist, per <i>?PHPSESSID=&#8230;<\/i> einen workaround f\u00fcr user ohne Cookies zu fahren. Trotzdem ist die Voreinstellung 1 sinnvoll, da es Angriffe um einen ganzen Zacken schwieriger macht. <b>Achtung:<\/b> Der Get-Parameter <i>PHPSESSID<\/i> ist &#8222;st\u00e4rker&#8220; als der Session-Cookie. Ist also <i>session.use_only_cookies<\/i> deaktiviert, kann man mittels Parameter seine Session-ID manipulieren, da der Parameter wichtiger als der Cookie eingestuft wird.<\/li>\n<li>Ist <b>session.use_trans_sid<\/b> (Defaultwert: 0) eingeschaltet, wird jedem Link auf eurer Webseite <b>automatisch<\/b> (also ohne das ihr euch selbst drum k\u00fcmmern m\u00fcsst) das <i>?PHPSESSID=&#8230;<\/i> angeh\u00e4ngt. Ist also ein &#8222;convenience&#8220;-Feature, wenn ihr session.use_cookies = 0 eingestellt habt und euch nicht selbst bei jedem Link drum k\u00fcmmern wollt. Die Option sollte man also tunlichst auf 0 belassen.<\/li>\n<li><b>session.cookie_httponly<\/b> (Defaultwert ab PHP 5.3 = 1) besagt, ob der Session-Cookie per Javascript mittels\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">document.cookie<\/pre>\n<p> ausgelesen werden darf. Problem dabei ist nur, dass es der Browser unterst\u00fctzen muss. <s>Und das war bei meinen Recherchen mit Firefox 3.6, Chrome 7, Opera 10, Safari 5 und dem IE8 noch in keinem Browser der Fall.<\/s> <\/p>\n<p><b>Korrektur:<\/b> Hatte einen Fehler in meinem Testscript. Nach einer Korrektur stellte sich heraus, dass genau das Gegenteil wahr ist: Alle getesteten Browser bis einschlie\u00dflich IE6 verhalten sich absolut korrekt und geben den Cookie per Javascript nicht aus, wenn <i>session.cookie_httponly = 1<\/i> ist.<\/p>\n<p>Demnach ist es sinnvoll, diesen Wert auf 1 zu belassen, denn erstens braucht man wohl in der Regel sinnvollerweise kaum Zugriff mit Javascript auf den Session-Cookie und zweitens erh\u00f6ht es die Sicherheit gegen Session Highjacking-Attacken nochmal um ein St\u00fcckchen.<\/li>\n<li>Auf jeden Fall mal auf die offizielle <a href=\"http:\/\/www.php.net\/manual\/de\/session.configuration.php\">Seite zur php.ini-Konfiguration<\/a> schauen!<\/li>\n<\/ol>\n<h3>Fazit dieser kleinen Abhandlung<\/h3>\n<p>Die php.ini-Defaultwerte sind sehr vern\u00fcnftig gew\u00e4hlt. Trotzdem sollte man nachpr\u00fcfen, ob diese bei euch korrekt gesetzt sind. Session-IDs per URL zu \u00fcbergeben ist in jedem Fall b\u00f6se, da man so dem Benutzer die M\u00f6glichkeit gibt, seine Session-ID ganz bequem selbst zu \u00e4ndern. Leider wird damit Session-Highjacking \/ Session-Fixation nur erschwert, nicht aber unm\u00f6glich gemacht. Mehr dazu <a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-2-session-highjacking-und-session-fixation\/\">im n\u00e4chsten Teil<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Anmerkung: Dieser Post ist dem Teil \u00fcber Session-Highjacking und Session-Fixation vorgeschaltet, da der Artikel dar\u00fcber sonst zu lang geworden w\u00e4re. In dem Moment, indem der Benutzer per session_start(); eine Session verpasst bekommt, wird ein Session-Cookie auf dem PC des Benutzers &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/php-session-management-erklaert\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6,3],"tags":[],"class_list":["post-409","post","type-post","status-publish","format-standard","hentry","category-php","category-security","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=409"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/409\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}