Cookie и SQL инъекции
В этом уроке мы рассмотрим механизм COOKIE, который схож с механизмом сессий, который мы разбирали на прошлом уроке. Также мы рассмотрим очень важный вопрос безопасности веб приложений — внедрение вредоносного SQL кода (SQL инъекция).
COOKIE схожи по своему назначению с сессиями — в них можно хранить данные приложения — информация о пользователе и пр. Но в чем же ключевое различие? COOKIE хранятся в браузере пользователя, а это значит, что к COOKIE можно легко добраться и, соответственно, подменить, украсть и так далее. А значит хранить данные авторизованного пользователя как минимум небезопасно. Сессии конечно тоже можно подменить, но все же сделать это гораздо тяжелее. Злоумышленнику придется потрудиться. Зачем же тогда COOKIE, что можно хранить в них COOKIE? Например, корзину с товарами — предположим, вы положили товары в корзину, но не оформили заказ до конца. Через некоторое время вы возвращаетесь на сайт, и вам не надо заново класть товары в корзину. Это все благодаря COOKIE.
Второй вопрос урока — SQL инъекции. Эту проблему научились решать, но все же начинающим разработчикам важно понять опасность проблемы, чтобы уметь ее обходить. Суть опасности в том, что на стороне сервера вы никак не фильтруете данные, а просто принимаете данные в том виде, в котором их передал вам клиент. Например, в поле формы злоумышленник может ввести такие данные: ‘admin’ or 1=1. Запрос на выборку примет вид SELECT * FROM table_name WHERE user = ‘admin’ or 1=1. Вторая часть условия в запросе будет всегда верно, а значит злоумышленник получит все данные из таблицы table_name. В уроке рассмотрен пример с вариантом, где при помощи SQL инъекции можно удалить базу данных.
Код урока (cookie.php)
<?php
//пример со счетчиком посещения страниц
$counter = 0;
if (isset($_COOKIE['count'])) {
$counter = $_COOKIE['count'];
$counter++;
}
setcookie("count", $counter);
echo $counter;
Код урока (injection.php)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form class="" method="post">
<input type="text" name="name" value="">
<button type="submit" name="button">Отправить</button>
</form>
<?php
$name = $_POST['name'];
$user = "root";
$password = "root";
$mydb = new PDO("mysql:host=localhost;dbname=mydb", "root", "root");
$sql = "select * from users where user_name = $name"; //пример внедрения sql инъекции
echo $sql;
$q = $mydb->query($sql);
$q->execute();
while($res = $q->fetch(PDO::FETCH_ASSOC)) {
echo "<pre>";
var_dump($res);
echo "</pre>";
echo "<br>";
}
?>
</body>
</html>
0 Comments