Programmera i PHP/Undvik att få databasen hackad

Från Wikibooks


Det finns många ondskefulla personer ute på Internet som gör vad de kan för att hacka databaser, därför måste man ta med en del säkerhetsåtgärder. Bland annat brukar man rensa bort speciella tecken som egentligen används av MySQL, bara för att vara säkra på att databasen inte kan manipuleras utifrån.

stripslashes[redigera]

Första steget är att se till att apostrofer och snedstreck inte används i elaka syften Enklast är att helt enkelt ta en text vi kan kalla $textattrensa och slänga in den i funktionen:

$textattrensa = stripslashes($textattrensa); //Tar bort snedstreck

En mer avancerad funktion (som använder samma stripslashes för själva arbetet) är:

function strip_slashes($textattrensa)
  {
  if (is_array($textattrensa)) //Om det är en array och inte ett enstaka värde
   {
    foreach ($textattrensa as $key => $val)
     {
         $textattrensa[$key] = strip_slashes($val);
     }
   }
   else
   {
     $textattrensa = stripslashes($textattrensa);
   }
       return $textattrensa;
   } //Slut på funktionen

mysqli_real_escape_string[redigera]

Nästa steg är att se till att man inte kan lägga in skadlig kod i databasen.

$textattrensa = mysqli_real_escape_string($databasanslutning,$textattrensa);

Det finns en äldre funktion som heter nästan likdant:

mysql_real_escape_string

men den är föråldrad och skall inte användas längre.

Man måste ha en fungerande anslutning till en databas för att funktionen skall fungera, t.ex:

$dbc = mysqli_connect('host', 'user', 'password', 'database') or die('Error connecting to MySQL server');
(Byt: host, user, password och database till vad du själv har på din egen bas)

Efter det kan man ta varje inpostat värde från användarna och rensa dem. Om ett fält som skall läggas in innehåller ett efternamn kan det se ut så här:

$enamn = mysqli_real_escape_string($dbc, trim($_POST['enamn']));

Den föråldrade funktionen fungerar utan databas:

$textattrensa = mysql_real_escape_string($textattrensa);