PHP Beveiliging
18-06-2009 20:59
Offline Stuur privëbericht
Beveiliging

Als je een website wil maken, dan is het belangrijk om alles goed te beveiligen. Al helemaal met programmeertalen zoals PHP. In deze tutorial/artikel ga ik uitleggen hoe je je source/website goed kan beveiligen.

HTML voorkomen

Als eerst beginnen we met de simpele HTML bug, deze maakt het mogelijk om HTML te gebruiken, als gebruikersnaam, reactie in het forum, enzovoort. Wat erg vervelend is is als mensen <noscript> gaan gebruiken want dan werkt uw website niet meer zoals het zou moeten echter zijn er veel gevaarlijkere dingen te doen als "de hacker" HTML kan gebruiken. Een voorbeeld is om bijvoorbeeld door JavaScript de inhoud van een cookie naar zijn/haar e-mail te laten sturen waardoor ze jou cookie kunnen HiJacken. Maar goed, we weten nu het probleem, maar hoe lossen we het op?
Nou daar heeft PHP een hele handige functie voor genaamt htmlspecialchars() of htmlentities(). Eigenlijk is het het beste om het overal te doen waar een gebruiker (Lid of Teamlid) zelf iets in kan voeren. Hieronder ziet u een klein voorbeeldje van een stukje PHP die htmlspecialchars() gebruikt.
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if($_POST['submit'])
{
    echo 
htmlspecialchars($_POST['text']);
}
else
{
    echo 
"<form method="post" action="">
    <fieldset style="border: 0px; ">
    Text: <input type="text" name="text" />
    <input type="submit" name="submit" value="Verstuur" />
    </fieldset>
    </form>"
;
}
?>

Als je nou &lt;noscript&gt; in zou sturen zou de htmlspecialchars() van de &lt; en &gt; een: &lt; en &gt; maken, de gebruiker ziet een &lt; maar de HTML ziet &lt; staan en maakt er dus geen &lt;noscript&gt; van, maar: &lt;noscript&gt; waardoor het niet de HTML code &lt;noscript&gt; uitvoert. Het verschil tussen htmlspecialchars &amp; htmlentities is dat htmlentities alles omzet naar HTML en de htmlspecialchars functie alleen de: &amp;, &quot;, ', &lt; , &gt; omzet naar HTML.

De database

Wij zouden graag gegevens op willen slaan in een database, maar hoe kan dit zo veilig mogenlijk? Simpel het allerveiligst zijn prepared statements gebruiken (PDO &amp; MySQLi) maar niet iedereen beheersen die talen, de veel meer voorkomende database connectie die in PHP door velen worden gebruikt is de verouderde: MySQL connectie. Ook hier geld weer, alles wat door de gebruiker (Lid of Teamlid) naar de database gestuurd word moet je zien als NIET veilig. Hoe gaan we dit dan oplossen? Simpel voor de verouderde MySQL connectie bestaan er 2 functies voor, mysql_real_escape_string (mysql_escape_string bestaat ook maar ik raad de mysql_real_escape_string aan) &amp; addslashes, ze werken in prenciepe allebei goed, echter raad ik de mysql_real_escape_string aan. Hoe gaan we deze gebruiken?
Hieronder ziet u een stukje PHP script waarin u een voorbeeld ziet:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if($_POST['submit'])
{
    
mysql_query("INSERT INTO tabel (kolom) VALUES ('".mysql_real_escape_string($_POST['text'])."')");
    
    echo 
"Succesvol opgeslagen.";
}
else
{
    echo 
"<form method="post" action="">
    <fieldset style="border: 0px; ">
    Text: <input type="text" name="text" />
    <input type="submit" name="submit" value="Verstuur" />
    </fieldset>
    </form>"
;
}
?>

Door dit op deze manier te gebruiken voorkom je dat ze SQL injections doen. Maar hoe werken prepared statements dan? Ik zal hieronder de PDO prepared statement functie gebruiken:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if($_POST['submit'])
{
    
$pdo->prepare("INSERT INTO tabel (kolom) VALUES (:post)");
    
$pdo->execute(array(':post' => $_POST['text']));
    
    echo 
"Succesvol toegevoegt.";
}
else
{
    echo 
"<form method="post" action="">
    <fieldset style="border: 0px; ">
    Text: <input type="text" name="text" />
    <input type="submit" name="submit" value="Verstuur" />
    </fieldset>
    </form>"
;
}
?>

De prepared statement functie gebruik uit zichzelf al een soort van mysql_real_escape_string(). Als je een van die functies gebruikt vergeet dan niet om alle \&quot; weer terug te zetten naar &quot;, Ook daar heeft PHP een hele handige functie voor genaamt: stripslashes(), dus stel je voor je haal kolom op met een $txt = mysql_fetch_assoc, dan doe je dit:
Code | Selecteer Alles
minimaliseren
1
2
3
<?php
echo stripslashes($txt['kolom']);
?>


HiJacken

In het begin vermelde ik dat het mischien mogelijk zou zijn om je cookies/sessies te HiJacken. Wat is HiJacken nou eigenlijk? Nou simpel gezegt is het het stelen van een cookie/sessie en je voordoen als de persoon van wie die cookie/sessie eigenlijk is. Maar nu natuurlijk de hoofd-vraag hoe voorkom je dat? Ikzelf los dat altijd op door zodra iemand inlogt het IP in de database te zetten en dan elke keer als iemand een pagina bezoek kijken of de inhoud van dat cookie bij het IP in de database bij elkaar horen. Ook werk ik met een hash zodat ook de cookie bug weg is. Wat bedoel ik met de cookie bug? Simpel bij sommige website?%u20AC%u2122s staat in het cookie jou lid id, als je die met een add-on van firefox of programma veranderd naar het id van de eigenaar (meestal 1) en dan druk je refresh en dan zit je op de eigenaar zijn account. En met een hash gaat dat niet werken. Hieronder ziet u een voorbeeld van hoe u eventueel uw cookie beveiliging zou kunnen doen:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
if($_COOKIE['hash'])
{
    
$query mysql_query("SELECT inlog_ip FROM gebruikers WHERE hash='".mysql_real_escape_string($_COOKIE['hash'])."'")or die(mysql_error());
    
$bestaat mysql_num_rows($query);
    
    if(
$bestaat)
    {
        
$user mysql_fetch_assoc($bestaat);
        
        if(
$user['inlog_ip'] == $_SERVER['REMOTE_ADDR'])
        {
            
$ingelogd 1;
        }
        else
        {
            
setcookie("hash"""time()-1"/");
            
$ingelogd 0;
        }
    }
    else
    {
        
setcookie("hash"""time()-1"/");
        
$ingelogd 0;
    }
}
else
{

$ingelogd 0//(je bent niet ingelogd)

}
?>


Het kan zijn dat ik iets vergeten ben (dat ik idee heb ik ook) maar ik heb even geen idee wat.

Let op!: Dit artikel mag niet zonder toestemming van de auteur Jasper (webdam-x) op een andere website worden geplaatst

Met vriendelijke groet,
Jasper G.
Berichten: 374
Offline Stuur privébericht
Omg, hier @ CP wordt me hele artikel verpest door jullie zogenaamde goeie beveiliging
2009-08-02 02:07:35
Rapifia Europe
Berichten: 3702
Offline Stuur privébericht
Oja
Ik zou ook nog even strip_tags(); uitleggen.
Dit kan je beter gebruiken, i.p.v. htmlspecialchars(); en mysql_real_escape_string();

Lars
2010-06-01 20:28:26