<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Session &#8211; Blackbams Blog</title>
	<atom:link href="https://blog.blackbam.at/de/tag/session/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.blackbam.at/de</link>
	<description>development - digital arts - internet</description>
	<lastBuildDate>Wed, 05 Oct 2011 17:30:41 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.3</generator>
	<item>
		<title>(English) Bypass usage of sessions by using $_POST and hidden fields with JSON</title>
		<link>https://blog.blackbam.at/de/2011/04/21/bypass-usage-of-sessions-by-using-post-and-hidden-fields-with-json/</link>
					<comments>https://blog.blackbam.at/de/2011/04/21/bypass-usage-of-sessions-by-using-post-and-hidden-fields-with-json/#respond</comments>
		
		<dc:creator><![CDATA[Blackbam]]></dc:creator>
		<pubDate>Thu, 21 Apr 2011 21:05:02 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[bypass sessions]]></category>
		<category><![CDATA[hidden fields]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[Session]]></category>
		<guid isPermaLink="false">https://blog.blackbam.at/?p=1326</guid>

					<description><![CDATA[Leider ist der Eintrag nur auf Amerikanisches Englisch verfügbar.]]></description>
										<content:encoded><![CDATA[<p class="qtranxs-available-languages-message qtranxs-available-languages-message-de">Leider ist der Eintrag nur auf <a href="https://blog.blackbam.at/en/tag/session/feed/" class="qtranxs-available-language-link qtranxs-available-language-link-en" title="English">Amerikanisches Englisch</a> verfügbar.</p><p><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fblog.blackbam.at%2Fde%2F2011%2F04%2F21%2Fbypass-usage-of-sessions-by-using-post-and-hidden-fields-with-json%2F&#038;title=%28English%29%20Bypass%20usage%20of%20sessions%20by%20using%20%24_POST%20and%20hidden%20fields%20with%20JSON" data-a2a-url="https://blog.blackbam.at/de/2011/04/21/bypass-usage-of-sessions-by-using-post-and-hidden-fields-with-json/" data-a2a-title="(English) Bypass usage of sessions by using $_POST and hidden fields with JSON"><img src="https://static.addtoany.com/buttons/share_save_120_16.png" alt="Share"></a></p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.blackbam.at/de/2011/04/21/bypass-usage-of-sessions-by-using-post-and-hidden-fields-with-json/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Session-Sicherheit in PHP</title>
		<link>https://blog.blackbam.at/de/2010/01/26/session-sicherheit-in-php/</link>
					<comments>https://blog.blackbam.at/de/2010/01/26/session-sicherheit-in-php/#comments</comments>
		
		<dc:creator><![CDATA[Blackbam]]></dc:creator>
		<pubDate>Tue, 26 Jan 2010 17:25:17 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[Proxies]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[SESSID]]></category>
		<category><![CDATA[Session]]></category>
		<category><![CDATA[Session-ID]]></category>
		<category><![CDATA[Sessions]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Skript]]></category>
		<category><![CDATA[Snippet]]></category>
		<guid isPermaLink="false">http://www.blackbam.at/blog/?p=468</guid>

					<description><![CDATA[Weil ich mich ein Weilchen damit beschäftigt habe, ein kleines Tutorial zum erhöhen der Session-Sicherheit in PHP. Nur um Missverständnissen vorzubeugen, ein kleiner Hinweis: Sichere Sessions machen noch lange kein sicheres PHP-Skript und ein sicheres PHP-Skript gewährt noch lange keine sichere Webanwendung. Außerdem sollte man keinen Code 1:1 aus dem Internet verwenden 😉 Ausgangssituation Bei [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>
<p>
	Weil ich mich ein Weilchen damit beschäftigt habe, ein kleines Tutorial zum erhöhen der Session-Sicherheit in PHP. Nur um Missverständnissen vorzubeugen, ein kleiner Hinweis: Sichere Sessions machen noch lange kein sicheres PHP-Skript und ein sicheres PHP-Skript gewährt noch lange keine sichere Webanwendung. Außerdem sollte man keinen Code 1:1 aus dem Internet verwenden 😉
</p>
<h3>
	Ausgangssituation<br />
</h3>
<p>
	Bei PHP wird traditionell bzw. aus Kompatibilitäts- und Bequemlichkeitsgründen mit vielen Sicherheits-relevanten Problemstellungen eher fahrlässig umgegangen. Dabei stellen Sessions keine Ausnahme dar. Eine Session in PHP wird benötigt, um einen Client gegenüber einem Webserver zu authentifizieren. Da HTTP ein zustandsloses Protokoll ist, wird dies in PHP über Session-IDs realisiert. Eine Session-ID wird beim Start einer Session generiert, der Client schleppt sie dann mit sich herum und sendet sie bei Anfragen an den Webserver auf irgendeine Art und Weise mit (in der URL, als verstecktes &lt;input&gt;-Feld oder als Cookie im Header). Der Webserver wiederum schaut nach, ob er die entsprechende Session-ID in seinem Datei-Sortiment gespeichert hat (PHP speichert die Sesson-IDs in Klartext), wenn das nicht der Fall ist, wird schlicht und einfach eine neue Session erzeugt.
</p>
<h3>
	Der "Hacker"<br />
</h3>
<p>
	Der Hacker hat nun zum Ziel, sich solch Session-ID eines Users zu schnappen und selbst zu verwenden, um sich als dieser ausgeben zu können und entsprechend mit dessen Rechten agieren zu können. Ist es ihm erst einmal gelungen, an eine Session-ID zu kommen, ist das nicht mehr weiter schwer, diese zu verwenden, wie sich z.B. sehr schön mit dem Firefox-Addon Tamper-Data zeigen lässt. Mit diesem lassen sich beliebig POST-Parameter, Header-Daten und somit auch Cookies beliebig modifizieren. <br />
	 
</p>
<p>
	 
</p>
<div style="text-align: center;">
	<a href="https://blog.blackbam.at/wp-content/uploads/2010/01/Tamper.jpg"><img loading="lazy" alt="Demonstration Tamper Data" class="aligncenter size-full wp-image-472" height="310" src="https://blog.blackbam.at/wp-content/uploads/2010/01/Tamper.jpg" title="Tamper" width="600" srcset="https://blog.blackbam.at/wp-content/uploads/2010/01/Tamper.jpg 600w, https://blog.blackbam.at/wp-content/uploads/2010/01/Tamper-300x155.jpg 300w" sizes="(max-width: 600px) 100vw, 600px" /></a>
</div>
<p>
	 
</p>
<p>
	<br />
	Um an die Session-ID zu kommen gibt es für den Hacker diverse Möglichkeiten und im Prinzip ist alles, was durch das Internet gesendet wird, (mit den entsprechenden Fähigkeiten) abhörbar.<br />
	 
</p>
<h3>
	Lösungsversuche<br />
</h3>
<p>
	Das folgende Skript probiert bestimmten, kritischen Problemen im Session-Handling entgegenzuwirken<br />
	 
</p>
<table class="dividetable">
<tbody>
<tr>
<th>
				Problem
			</th>
<th>
				Gegenmaßnahme
			</th>
</tr>
<tr>
<td>
				Session-ID als einziges Mittel zur Identifizierung eines Clients
			</td>
<td>
				Zusätzliche Gegenprüfung der Client-IP und eines evtl. verwendeten Proxies
			</td>
</tr>
<tr>
<td>
				Nachvollziehbarkeit der Session-ID
			</td>
<td>
				Erzeugung einer sicheren, nicht rückrechenbaren Session-ID, weitere Schutzmaßnahmen
			</td>
</tr>
<tr>
<td>
				Lebende Sessions die nicht mehr gültig sein sollten
			</td>
<td>
				Absolute Zerstörung der Session und des Cookies im Problemfall
			</td>
</tr>
</tbody>
</table>
<p>
	<br />
	 
</p>
<pre lang="php">### wird immer anstatt session_start(); aufgerufen
function startSession() {

	session_start();

	// Falls eine Session existiert, dann muss es auch eine Client_ip geben
	if(filter_var($_SESSION["client_ip"])) {

		// Wenn es bereits eine Session gibt
		if(getSessionClientIP() == $_SESSION["client_ip"]) {
			return;
		} else {
			destroy_session_absolute();
			header("Location: illegal_action.php");
			die;
		}

	} else {

		// falls eine neue Session erzeugt werden muss, dann machen wir das nochmal gscheid
		destroy_session_absolute();
		session_regenerate_save_id();
		session_start();
		setSessionClientIP();
	}
}

### neue, sichere SESSID generieren, MUSS VOR session_start() aufgerufen werden
function session_regenerate_save_id() {
	$hash_time = md5(microtime());
	$hash_ip = md5($_SERVER["REMOTE_ADDR"]);
	$hash_space = sha1(disk_free_space("/"));
	$session_id = sha1($hash_time.$hash_ip.$hash_space);
	session_id($session_id);
}

### speichert die Client-Adresse je nach Typ als md5-Hash in die Session
function setSessionClientIP() {

	if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
		$_SESSION["client_ip"] = md5($_SERVER["HTTP_X_FORWARDED_FOR"]);
	} else {
		$_SESSION["client_ip"] = md5($_SERVER["REMOTE_ADDR"]);
	}	

}

### liefert die Client-Adresse entsprechend dem vorher angesprochenen Mechanismus zurück
function getSessionClientIP() {

	if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
		return md5($_SERVER["HTTP_X_FORWARDED_FOR"]);
	} else {
		return md5($_SERVER["REMOTE_ADDR"]);
	}	

}

### sichere Zerstörung einer Session
function destroy_session_absolute() {
	if(isset($_COOKIE[session_name()])) {
		setcookie(session_name(),"",time()-42000,"/");
	}
	session_destroy();
}
</pre>
<p>
	<br />
	 
</p>
<h4>
	Verwendung des Skripts<br />
</h4>
<ul style="padding: 20px;">
<li>
		Jede Session mit startSession(); anstatt session_start(); aufrufen
	</li>
<li>
		vor jeder kritischen Operation session_regenerate_id(); einsetzen und zwar vor startSession();
	</li>
</ul>
<h4>
<p>	Erklärung des Skripts<br />
</h4>
<p>
	bzgl. Gegenprüfung der Client-IP bzw. deren Grenzen (Einsatz eines hochanonymen Proxies vom Client)<br />
	 
</p>
<table class="dividetable">
<tbody>
<tr>
<th>
				PHP-Server-Variable
			</th>
<th>
				Standard
			</th>
<th>
				Normaler Proxy
			</th>
<th>
				Anonymer Proxy
			</th>
<th>
				Hochanonymer Proxy
			</th>
<th>
				Erklärung
			</th>
</tr>
<tr>
<td>
				$_SERVER["HTTP_VIA"]
			</td>
<td>
				nein
			</td>
<td>
				ja, proxy ip
			</td>
<td>
				ja, proxy ip
			</td>
<td>
				nein
			</td>
<td>
				Weiterleitungs-IP
			</td>
</tr>
<tr>
<td>
				$_SERVER["REMOTE_ADDR"]
			</td>
<td>
				ja, echte
			</td>
<td>
				ja, proxy ip
			</td>
<td>
				ja, proxy ip
			</td>
<td>
				ja,proxy ip
			</td>
<td>
				Offizielle-IP
			</td>
</tr>
<tr>
<td>
				$_SERVER["HTTP_X_FORWARDED_FOR"]
			</td>
<td>
				nein
			</td>
<td>
				ja, richtige
			</td>
<td>
				ja, proxy/random
			</td>
<td>
				nein
			</td>
<td>
				Ursprungs-IP
			</td>
</tr>
</tbody>
</table>
<p>
	 
</p>
<h4>
	Erweiterungsmöglichkeiten für das Skript<br />
</h4>
<p>
	Entsprechend dem Schema "Gegenprüfung der Client-IP", welches in diesem Script verwendet wird, können weitere Mittel eingesetzt werden, um einen Client möglichst eindeutig identifizieren zu können. So beispielsweise der Vorschlag von phpforum.de:
</p>
<pre lang="php">// zuverlässig
$_SERVER["DOCUMENT_ROOT"]
$_SERVER["HTTP_USER_AGENT"] // kann leer sein, dann aber zuverlässig leer
// eine eindeutige Kennung vielfältig als "salt" einsetzbar
define("APPLICATION_ID","w3463-dfgsdgd-564564")

// weniger zuverlässig
$_SERVER["REMOTE_ADDR"] // oder nur Teile davon
$_SERVER["HTTP_ACCEPT_LANGUAGE"]
$_SERVER["HTTP_ACCEPT_CHARSET"]
$_SERVER["HTTP_ACCEPT_ENCODING"]
$_SERVER["HTTP_ACCEPT"]
</pre>
<p>
	(aus <a href="http://www.phpforum.de/forum/showthread.php?t=216531">Session-Sicherheit auf phpforum.de</a>)
</p>
<p>
	 
</p>
<p>
	Hat man dann vermeintlich genug identifizierendes Material über den Benutzer gesammelt (natürlich sollte man sich hierbei <em>nur auf Daten verlassen, die während der gesamten Session eindeutig sein sollten, damit man nicht seine Benutzer durch ständigen Logout verärgert </em>), speichert man es in gehashten Variablen (mit möglichst unauffälligen Namen), die bei startSession(); gegengeprüft werden. Nützlich ist möglicherweise auch ein <a href="http://php.net/manual/de/reserved.variables.server.php">Überblick über alle $_SERVER-Variablen im PHP-Manual</a>.
</p>
<p>
	 
</p>
<p>
	Man kann dies auch beispielsweise auch über den sogenannten "User-Fingerprint-Array" realisieren. Dazu sammelt man in einem Array erstmal Daten über den Benutzer und bildet darüber einen Hash-Wert.
</p>
<pre lang="php">
$fingerprintArray = array($_SERVER['HTTP_USER_AGENT'],substr($_SERVER["REMOTE_ADDR"],0,7),...);
$fingerprint = md5(serialize($fingerprintArray)); .
</pre>
<p>
	Dazu und ebenfalls zu dem Thema gibt es <a href="http://www.mathias-bank.de/2008/02/22/php-sicherheit-session-fixierung/">hier</a> ebenfalls eine Diskussion.
</p>
<h4>
	Weitere Sicherheitsmaßnahmen<br />
</h4>
<ul style="padding: 0px 15px;">
<li>
		Nur Cookies zur Übertragung der SessionID erlauben
	</li>
</ul>
<pre lang="php">
ini_set("session.use_cookies" ,1); // sicherlich!!
ini_set("session.use_only_cookies",1); // JA! Ohne Cookies geht hier nix!!
ini_set("session.use_trans_sid" ,0); // bloss nicht auf 1 setzen session_start();
</pre>
<ul style="padding: 0pt 15px;">
<li>
		sensitive Daten nur direkt zum Server übertragen und niemals in einer Session speichern
	</li>
<li>
		Verwendung von SSL
	</li>
<li>
		wenn es die Sicherheit erfordert, sei zusätzlich zu einem TAN-System geraten
	</li>
<li>
		Sicherstellen, dass bei Shared-Hosting kein "Server-Nachbar" auf den Ordner mit den Session-IDs zugreifen kann
	</li>
</ul>
<p>
	 
</p>
<p>
	Ich hoffe das dieses Tutorial den Leser ein Stück weitergebracht hat. Es ist, wie gesagt, nur ein kleines Stück Sicherheit und keinesfalls sollte man sich damit in Sicherheit wiegen.
</p>
<p>
	<br />
	Als weiterführende Literatur ist das Buch "Sichere Webanwendungen in PHP" von Tobias Wassermann zu empfehlen, aus welchem ein Großteil meines Wissens für dieses Tutorial stammt. Ebenfalls "PHP-Sicherheit" von Christopher Kunz und Stefan Esser ist den ein oder anderen Blick wert.
</p>
<p>
	 
</p>
<p>
	Weiterführende Informationen: Beschwerden, Bugs, Fehler oder gar Lob bitte unbedingt als Kommentar hinterlassen 🙂</p>
<p></p><p><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fblog.blackbam.at%2Fde%2F2010%2F01%2F26%2Fsession-sicherheit-in-php%2F&#038;title=Session-Sicherheit%20in%20PHP" data-a2a-url="https://blog.blackbam.at/de/2010/01/26/session-sicherheit-in-php/" data-a2a-title="Session-Sicherheit in PHP"><img src="https://static.addtoany.com/buttons/share_save_120_16.png" alt="Share"></a></p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.blackbam.at/de/2010/01/26/session-sicherheit-in-php/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
