PHP scripts veiliger maken


Tags: beveiligingPHPSecurity

Wanneer je een PHP script schrijft, moet je voorkomen dat er code in je script zit waarmee hackers toegang kunnen krijgen tot je site of je database. In dit artikel beschrijven we een aantal kwetsbaarheden, en tips en tricks waarmee je je PHP scripts veiliger kunt maken.

Bescherm je site tegen XSS aanvallen

Wanneer je bijvoorbeeld een forum of gastenboek hebt, is jouw website misschien kwetsbaar voor XSS aanvallen. Je zou de berichten op jouw forum in ieder geval moeten quoten met de functie htmlspecialchars. Vaak is het mogelijk de invoer van gebruikers te controleren met een reguliere expressie. Als gebruikers bijvoorbeeld een URL kunnen opgeven, kun je die vergelijken met

if (!preg_match("/^(http|ftp|https)://[-A-Za-z0-9._/]+$", $url)) 
{ 
die("ongeldige url");
}

Zie ook het artikel Validating input.

SQL injectie

Het forum is ook kwetsbaar voor SQL injectie. Als de inloggegevens van bezoekers worden gecontroleerd met:

$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

zou een bezoeker als password “‘ OR ='” kunnen ingeven. Ook hier heeft PHP een oplossing voor: je kunt de invoer quoten met addslashes of mysql_real_escape_string. Of je kunt prepared statements gebruiken met de mysqli of de PDO Mysql extensies. Zie ook het Kennisbankartikel PHP SQL Injection voor meer informatie hierover.

Als de magic_quotes_gpc instelling aan staat, is het in principe niet nodig om addslashes() te gebruiken – dan zou er twee keer gequote worden. Het is netter om magic_quotes_gpc uit te zetten en zelf de invoer te quoten.

Mail header injectie

Wanneer je een contactformulier op je website hebt, zou een bezoeker een PHP e-mail header misbruik kunnen uitvoeren om hiermee spam te versturen. Dit is te verhinderen door te controleren of er in door de bezoeker gegeven velden ongeldige tekens voorkomen.

Tips PHP veiligheid

Include bestanden

Denk ook na over de include bestanden. Als in index.php bijvoorbeeld het volgende staat:

include("db.inc");

… en in db.inc je databasewachtwoord staat, dan kan een bezoeker die http://uwdomein.nl/db.inc opvraagt, jouw databasewachtwoord zien.

Wanneer je het include bestand db.php noemt, is het ook door een bezoeker op te vragen en wordt het als php code uitgevoerd. Je kunt include bestanden het beste buiten de document root opslaan.

Controleer de extensies van bestanden

Wanneer je bezoekers de mogelijkheid wilt geven bestanden te uploaden, controleer dan de extensie van die bestanden. Als ze bijvoorbeeld afbeeldingen moeten kunnen uploaden, controleer dan of het een .gif, .jpg of .png bestand is en geen .php bestand.

Zelfs als je de extensies van uploads controleert, kan een uploadmogelijkheid nog zwakke plekken hebben. Zie ook http://www.webcheatsheet.com/PHP/file_upload.php voor een overzicht van hoe jouw site mogelijk nog te hacken is. De enige echt veilige oplossing is om upload van bestanden niet toe te staan.

Overige tips

  • De Register_Globals instelling staat standaard uit. Het is sterk aan te raden deze uit te laten staan.
  • Code als:
    include(“foo/$bar)
    is zeer onveilig. Je kunt beter geen variabelen in argumenten aan include gebruiken.
  • Gebruik liever geen include als je ook readfile kunt gebruiken

Nuttige Links

0