Единственото, което ще добавя по темата е следното:
POST метода също не е имунизиран срещу SQL инжекция.
Примерно да речем, че имаш логин страница, която ще изглежда приблизително така:
<form method="POST">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" name="loginformsubmit" value="вход"/>
</form>
<?php
if(isset($_POST['loginformsubmit'])){
//Този код се изпълнява само тогава, когато е натиснат бутона вход
$username = $_POST['username'];
$password = $_POST['password'];
$sql = " SELECT * FROM `users` WHERE `username`='$username' AND `password`='$password' ";
//След това изпълняваме SQL-a, без значение как. Белята вече е станала
$q = mysql_query($sql);
$r = mysql_fetch_array($q);
if(!empty($r)){
echo "Влезе баце! Мноо си луд. Са земи си сипи една рикия оти си мноо умен хакер. НАЗДРАВЕ!";
}
}
?>
Този код работи, НО той има една огромна слабост. Ако някой въведе в полето за паролата следното:
glupost' OR '1'='1
към базата ще се прати следният SQL:
SELECT * FROM `users` WHERE `username`='tamnqkfoime' AND `password`='glupost' OR '1'='1'
Този SQL се изпълнява и хакер влиза в профила с име "tamnqkfoime", но без да ползва парола.
Решения:
- Споменатите в предишният отговор проверки
- Ползване на ORM (Object relational mapper) - в зависимост от езика, който се ползва има различни възможности (при PHP най-препоръчван е doctrine)
- Или при изпълнение на самият SQL да се bind-ват параметрите. При php това става чрез PDO. Показаният по-горе код би изглеждал по следният начин:
if(isset($_POST['loginformsubmit'])){
//Този код се изпълнява само тогава, когато е натиснат бутона вход
$username = $_POST['username'];
$password = $_POST['password'];
$sql = " SELECT * FROM users WHERE username=:username AND password=:password ";
//При изпълнение по този начин сме защитени от SQL инжекция
$statement = $db->prepare($sql);
$statement->bindValue(':username',$username); //тук bind-ваме с помощта на PDO
$statement->bindValue(':password',$password);
$statement->execute();
$r = $statement->fetchAll();
if(!empty($r)){
echo "Влезе баце! Мноо си луд. Са земи си сипи една рикия оти си мно умен, само дека тоо път не си хакер. НАЗДРАВЕ!";
}
}
Разбира се, този пример е леко пресилен, защото паролите най-често ще се хешират, но добре демонстрира какво представлява SQL инжекция.