Søger du en specifik kategori?

 



Oprettet ons. d. 25. februar 2009 kl. 21:40

sungdk
sungdk (19.893 point)
Guidens karaktér
1
2
3
4
5

Huskeliste til en sikker side

I denne artikel kan du læse hvilke ting som er meget vigtige hvis du gerne vil have en sikker side. Det er ikke en afhandling men mere en Problem > Løsningsmodel. Der er også små eksempler inkluderet i artiklen.
FORMÅLET
Denne artikel er baseret udfra mine egne oplevelser med nogle sider jeg har programmeret i PHP. Jeg har været ude for at nogle brugere på siderne misbrugte funktionerne som de ikke havde lov til, og derfor har jeg nu besluttet mig for at skrive denne artikel om ting du skal huske hvis du vil lave en sikker hjemmeside.

Jeg ved godt at artiklen er lidt overfladisk, men den er også mere tænkt som en slags huskeliste. Desuden er der sikkert andre metoder til at sikre siden, men disse nedenstående metoder har sikret mine sider imod misbrug.


SERVEREN ER NR. 1
Vil du lave en sikker side så skal du starte med at konfigurere opsætningen på serveren. For at undgå sql-injection er der en funktion ved navn "magic_gpc" som skal slås til. Når denne er slået til så er det ikke længere muligt at bruge '-tegnet. Et kendt sql-injection eksempler er brugen af:  1' OR '1' = '1.

Dvs. har man ikke sikret sig imod sql-injection så kommer der til at stå dette hvis man prøver at logge ind:

<?php
//database_forbindelse_inden

$result = mysql_query("SELECT * FROM tabel WHERE brugernavn = '1' OR '1' = '1' && kodeord = '1' OR '1' = '1'");
exit;
?>


Dvs. Misbrugeren kan nu logge sig ind på din side, uden egentlig at have oprettet en bruger eller angivet korrekt brugernavn og kodeord.

En anden vigtig ting er at rette register_globals til OFF. Ved at sætte denne funktion på OFF, så specificerer man sine variables. Dvs. $_POST['felt'] kun kan komme fra en form med method med POST. Havde register_globals derimod stået på ON, så ville $felt kunne indeholde information fra forms, arrays og meget andet.


SESSIONS ELLER COOKIES?
Session og cookies er begge en slags små "pakker" som kan gemme information. I almindelig login-scripts, er det meget normalt at folk enten benytter sig af Cookies eller Session - Men det ene er mere sikkert end det andet!

Session og cookies har altså det samme formål, minder meget om hinanden, men alligevel er der forskel. Den største forskel er at cookies bliver gemt på din egen computer som små filer, og sessions bliver gemt på selve serveren som du er inde på. Man skal så vidt muligt enhver brug af cookies når det kommer til login-scripts, da man kan manipulere med cookies, og det er muligt at se indholdet af en cookie.
Vil du der imod lave et "gem login" eller på anden måde genkende brugeren selvom browseren er lukket ned og startet op igen, så er det cookies du skal have fat i. Cookies har den fordel at de kan sættes til først at blive automatisk fjernet fra din computer efter et vis antal tid/dage/år osv. MEN! Samtidigt vil jeg sige, at skal man lave et en cookie i forbindelse med "gem login"-funktionen, så skal man altid først md5 (eller på anden måde) skjule sit kodeord.

Eksempel på md5-envejskryptering:

<?php
$str = 'hej hej';
$str_md5 = md5($str);

echo "Her er hej hej med md5: $str_md5";

exit;
?>



XSS (Cross Server-Scripting)
XSS er et andet "hul" som folk ofte glemmer at sikre sig imod. Løsningen på XSS er heldigvis ret simpel, men har man nu en hjemmeside bestående af mange 100 sider kan det godt være et større arbejde. Men det er jo bl.a. derfor at jeg har skrevet denne artikel, så folk netop husker at lave sikker programmering lige fra starten.

Navnet "Cross Server Scripting", siger lidt om hvad dette hul handler om. Her har "misbrugeren" nemlig mulighed for at gemme et script i din database/tabel, og når det aktuelle felt bliver trukket ud i en ganske ren echo-streng som fx:

<?php
//database_forbindelse_inden

$result = mysql_query("SELECT * FROM tabel");
$row = mysql_fetch_array($result);

echo $row['xss-feltet'];

exit;
?>


I $row['xss-feltet'] kunne misbrugeren evt. have tilføjet dette javascript som ved åbning straks vil åbne en alert/popup med teksten "Din sikkerhed er ikke i top":

<SCRIPT LANGUAGE="JavaScript">
alert ("Din sikkerhed er ikke i top")
</script>


Når brugeren åbner denne side hvor dette database-udtræk finder sted, så kan det være at misbrugeren har indtastet en kode så din egen bruger bliver slettet, sender ufrivilligt informationer til misbrugeren, sletning af hjemmesiden og mere andet. Kortsagt så er dette noget som man skal være særlig opmærksom på.

Løsning var som sagt simpel, og det handler om at få PHP til ikke at udføre HTML/programmering som bliver udskrevet via echo.

Her er et eksempel på en løsning:

<?php
//database_forbindelse_inden

$result = mysql_query("SELECT * FROM tabel");
$row = mysql_fetch_array($result);

//strip_tags fjerner alt kode fra database udtrækket, undtagen <br> og (I dette eksempel)
$renset_echo = strip_tags($row['xss-felt'],"<br>[i]");
echo $renset_echo;

exit;
?>


[i]Man kan også bruge htmlentities() og nogle andre funktioner.



SIKRE SIG IMOD IFRAME-HACK (SPECIFIK XSS)
Er misbrugeren rigtig slem, så kan personen finde på at oprette en side på en anden server som indeholder en skjult iframe. Denne iframe kunne fx se således ud:

<iframe src="http://www.din-egen-side.dk/ (...) frameborder="0" marginwidth="0" marginheight="0"></iframe>


Her skal man forestille sig, at brugeren allerede har logget sig ind på din hjemmeside, og lige nu er der en session som indeholder brugeren unikke id fra databasen.

Kigger man i iframe-koden, så kan man se at "misbrugeren" prøver at henvise brugeren til  "http://www.din-egen-side.dk/ (...) Herinde kan det være at man har lavet en DELETE som ser således ud:

<?php
//database_forbindelse_inden

mysql_query("DELETE FROM tabel WHERE id = ‘$_SESSION[id]'");
exit;
?>


Dvs. Man kan ikke slette en andens bruger, og man kan selvfølgelig heller ikke slette sin egen bruger, medmindre at du er logget ind ($_SESSION[id] er sat).

Når brugeren er logget ind og $_SESSION[id] er sat for brugeren, så lad os forudsige at han på en eller anden måde modtager et link som han bare ikke kan modstå. Det kan være at der står noget med "http://www.misbrugerens-hjemmeside.dk/ (...) Alle som vil have mange penge tryk på linket". Måske er brugeren naiv (de fleste folk kender vel til når nysgerrigheden tager overhånd :), og trykker/indtaster linket og pludselig uden at vide af det, så har han rent faktisk slettet sin egen bruger.

I dette eksempel er jeg gået udfra at det var dette mål som misbrugeren havde, men det kan jo sagtens være andre funktioner på siden som han misbruger på denne måde.

Løsningen er lige rundt om hjørnet! For at sikre sig din side ikke bliver vis/udført på en andens side, så er løsningen desværre lidt mere besværlig end det foregående eksempel med XSS-hullet. Ved at lave unikke id's i links for hver enkelt bruger på siden (eller dig selv), så kan du på den måde undgå at dine funktioner bliver udført på en anden side.

Her er eksempel på et script som tjekker om brugerens session_id fra da han loggede ind er identisk med session_id i linket:

<?php
//database_forbindelse_inden

if (session_id() <> $_GET[‘session_id']) {
//fejl
} else {
//Lav funktionen
}
?>


I linket hen til funktionen skal du evt. lave det sådan her:

<?php
echo "<a href='slet_bruger.php?session_id=session_id()'>Slet din bruger, hvor du ved det!</a>";
?>


Dvs. ved at lave dette "større" arbejde, så kan misbrugeren umuligt gætte dit unikke genererede session_id fra da du loggede ind på siden/din bruger.

Synes man at session_id er lidt for langt i sine links, så kan man evt. bruge substr().


AFSLUTNINGEN
Jeg håber at denne artikel giver et lidt indblik i hvad der er specielt vigtigt at have med i sine koder, når man vil lave et rimeligt sikkert site. Har du rettelser eller noget jeg har glemt at tilføje, så er du selvfølgelig velkommen til at skrive.

Og HUSK NU! Dette er som sagt bare en slags huskeliste hvor jeg har givet små meget simple eksempler som man bedre forstår hvad jeg snakkede om.


SVAR PÅ KOMMENTARER
HVIS DU IKKE HAR EN KOMMENTAR TIL DINE POINTS OG EVT. GIVER MIG DÅRLIG KARMA - SÅ SKRID UNDERMÅLER!

FÅ DIG ET LIV, OG KOM FREM I LYSET, ISTEDET FOR AT KOMME MED NOGET KONSTRUKTIVT. LÆNGE LEVE ARROGANCE @ EKSPERTEN.DK

OG ROS TIL DEM SOM GIVER KONSTRUKTIV KRITIK!

Skrevet tir. d. 26. april 2005 kl. 22:36| #1

Mange af dine eksempler har jeg ikke oplevet, og tror ikke ville virke. Dit eksempel med XSS vil f.eks. ikke kunne "ødelægge" noget, da man ikke vil kunne udskrive php uden brug af eval() funktionen.

Skrevet tir. d. 26. april 2005 kl. 22:41| #2

cyberfinn (9.210 point)
Artiklen er okay, men der er dog andre måder, man kan sikre for den sidste problemstilling. Man kunne tjekke om man bliver sendt til slet_bruger.php fra sit eget domain.

Skrevet ons. d. 27. april 2005 kl. 17:27| #3

plazm (17.906 point)
Jeg vil så sige, at det er dårlig skik at lære dårlig kode til andre.
PHP.net råder folk til ikke at bruge foo[bar] men foo['bar']. http://dk2.php.net/ (...) Med hensyn til <iframe> hack'et så er det fordi din egen kode ikke er god nok, og du bør derfor overveje at lave den om. Det kan sagtens lade sig at gøre at lave et sikkert remove. Eksempelvis kan du bede om brugerens password før at den bliver slettet. Det sikrer BÅDE mod <iframe> og at folk tilfældigvis udnytter at du ikk er logget af siden. GammelHat, selvom det løser nogle problemer, kan der opstå nye, så det er altid smartest at skrive god kode, ikke at jeg selv er god til PHP, men jeg har da i det mindste læst hvad de selv råder os til. -- Svar på kommentar: Som sagt så syns jeg ikk du kan være bekendt at kalde os arrogante, når jeg og Hyber fortæller at der kan opstå nye problemer ved ikk at bruge korrekt kode. Og som jeg sagde så skulle der kun Password tjek på ved Slet Bruger funktionen, men det viser jo bare at du heller ikke læser hvad vi skriver til dig.

Skrevet ons. d. 27. april 2005 kl. 22:40| #4

sorenbs (16.287 point)
Udemærket artikkel. Koden er måske ikke hundrede procent korekt, men det er min tyske gramatik altså heller ikke. Jeg synes det giver god mening at pointere og belyse disse problematikker, og der er mange der har mere gavn af dette, end hvis det ikke var skrevet...  Er der nogen derude der ved bedre og har en bedre løsning, så del den da med os andre.

Skrevet ons. d. 27. april 2005 kl. 23:57| #5

gammelhat (14.840 point)
Ok. De andre som har kommenteret, tror jeg lidt har misforsået noget af det der står i artiklen (specielt den med iframe og xss). Læs den igen. Kommentaren angående kontrol af 'http_referer': de brugere som piller denne af, vil få problemer med hjemmesiden. -- Edit: nu er det ikke en artikel om php programmering; labisama fik 'hacket' sig hjemmeside, og her er lidt om hvordan problemerne blev løst.. -- Edit: hyberpreprocessor, ifølge php.net er <> gyldig syntax: http://www.php.net/ (...)

Skrevet tor. d. 28. april 2005 kl. 08:50| #6


Skrevet tor. d. 28. april 2005 kl. 19:45| #7

milo (24.299 point)
Dårlig artikel, alt for mange fejl i koden...ud over de fejl der allerede er nævnt, benytter du single quotes omkring integers osv...

Skrevet man. d. 02. maj 2005 kl. 13:55| #8

hyberpreprocessor (14.004 point)
ikke fantastisk artikel, endda forkert php kode i. echo $row[xss-feltet]; er ikke korrekt, det er foo['bar'] og ikke foo[bar]. Gode løsninger mod Iframe hack er også at sætte no-frame javascript på, eller slet ikke bruge frames som enhver der koder serverside godt ved er otopi, da serversidekoden kan lave en "frame" for en via. include/SSI. Du burde også komme mere ind på addslashes() og SQL injection via. query-strings hvilket der er mere udbredt. <> er forreesten ASP ! brug != i php og alle andre c-orienterede sprog. Du mangler også isset flere steder, php5 ville kommer med uendelig mange errors i dine eksempler.
Jeg synes at du skulle have sat dig meget mere ind i php/programmering/sikkerhed før denne artikel. Og mere endnu, mht. "http://www.din-egen-side.dk/ (...) så har enhvert seriøs person noget validering (hvor er det henne i artiklen?) og et logincheck... | Ja foo[bar] virker  men er IKKE korrekt, læs her: http://dk.php.net/ (...) og min kritik er da meget konstruktiv, den påpeger en hel række fejl i artiklen. Og at kalde kritik for arrogant er en dårlig måde at placere sig selv på. Gammelhat, ja men <> er noget der hører til VB, i c-lignede sprog bruger man != (/me undre siger over 3x karma spam, efter at have rated artiklen)

Skrevet tir. d. 17. maj 2005 kl. 15:49| #9


Skrevet fre. d. 27. maj 2005 kl. 12:34| #10

philip (21.269 point)
` != ' :)

Skrevet søn. d. 05. juni 2005 kl. 09:49| #11

huset (93.749 point)
Rodet kode med formange fejl, og rodet opstilling.
Dertil en totalt svinet kommentar nederst.

"HVIS DU IKKE HAR EN KOMMENTAR TIL DINE POINTS OG EVT. GIVER MIG DÅRLIG KARMA - SÅ SKRID UNDERMÅLER!

FÅ DIG ET LIV, OG KOM FREM I LYSET, ISTEDET FOR AT KOMME MED NOGET KONSTRUKTIVT. LÆNGE LEVE ARROGANCE @ EKSPERTEN.DK"
Alene denne kommentar trækker mere ned!

Skrevet tir. d. 06. september 2005 kl. 23:13| #12


Skrevet lør. d. 27. januar 2007 kl. 22:30| #13


Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
12 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger