Om du har denna SQL-fråga:
Kod:
SELECT * FROM table WHERE id = '$id'
Så skulle ovanstående göra att denna fråga körs:
Kod:
SELECT * FROM table WHERE id = 'hi' or 1=1--'
Som du redan vet betyder -- att resten av raden är en kommentar. Detta skulle då kunna lista alla oster i databasen. Ett (ofta värre) exempel är om man gör samma sak i ett inloggningsformulär med dessa uppgifter:
user: admin
pass: hi' or 1=1--
Denna SQL-fråga:
Kod:
SELECT * FROM users WHERE username = '$user' AND password = '$pass'
blir då:
Kod:
SELECT * FROM users WHERE username = 'admin' AND password = 'hi' or 1=1--'
Denna fråga kommer alltid att stämma eftersom 1=1 alltid stämmer. Man blir då inloggad som admin. Du skyddar dig mot detta genom att använda mysqli_real_escape_string på värden som ska användas i databasfrågor eller genom att använda prepared statements ( PDO eller liknande).
I ditt fall kan du se till att $_GET['id'] garanterat är ett heltal med hjälp av intval. Då behöver du inte använda mysqli_real_escape_string på det värdet:
PHP-kod:
$_GET['id'] = intval($_GET['id']);
|