PHP mysql_real_escape_string
PHP´s mysql_real_escape_string funktion er egentlig ganske simpel at bruge, men desværre er der stadig folk der ikke prøver at beskytte deres MySQL databaser mod SQL injection - eller på gammelt dansk SQL indsprøjtning.
Hvorfor folk så ikke bruger mysql_real_escape_string, kan man undre sig over - for funktionen har været i PHP siden version 4.3.0 - og eftersom vi nu skriver ~5.3.6 kan det godt undre mig at mange programmører stadig ikke bruger denne.
Eksempel på SQL injection
<?php $username = $_POST['username']; $password = $_POST['password']; $sqls = "select * from user where user = '$username' and '$password'"; $users = mysql_query($sqls); ?>
Hvis de værdier der bliver POST'et ind mod siden - er $_POST['username'] = 'tomchristensen'; $_POST['password'] = "' OR ''='"; Vil enhver kunne logge på som tomchristensen - og med et en URLencoded version af ' OR ''=' (også skrevet sådan: %27+OR+%27%27%3d%27 )
Eksempel på hvordan du undgår SQL injection
<?php $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sqls = "select * from user where user = '$username' and '$password'"; $users = mysql_query($sqls); ?>
eller
<?php $username = $_POST['username']; $password = $_POST['password']; $sqls = "select * from user where user = '".mysql_real_escape_string($username)."' and '".mysql_real_escape_string($password)."'"; $users = mysql_query($sqls); ?>
Derudover kan du lave andre forholdsregler...
Eksempelvis kan du - for at være sikker på at du KUN får tal ind i en $_GET['side'] variable der bruges til sideskift - (Vis side 1 af 200) hvor URL måske er www.phptips.dk/visside.php?side=1 bruge en anden funktion is_numeric.
Det vil sige at du FORVENTER at $_GET['side'] er et tal, og hvis det ikke er de - kan du sådan set godt die; scriptet.
Eksempel
<?php if (isset($_GET['side'])) { if (!is_numeric($_GET['side'])) { echo "Indtrængning!!!"; die; } else { $side = $_GET['side']; } } ?>