Мой сайт - моя крепость или защита php.
Я уже много чего написал в своём блоге. Но еще не касался темы безопасности. А это на мой взгляд одна из главных проблем web-программиста. Скрипт не просто должен хорошо работать. Он должен всегда оставаться на нашей стороне, а не на стороне злоумышленников. Естественно об это можно долго говорить, и в рамках этой статьи я не смогу изложить все тонкости данной проблемы. Но старт вы от меня получите.
Существует множество видов атак на web-сайты. И множество способов защиты php. Я решил остановиться на самом простом и мне понятном примере. Защита от спецсимволов. |
connect.php
$sqlhost="localhost";
$sqluser="root";
$sqlpass="";
$db="sec";
mysql_connect($sqlhost,$sqluser,$sqlpass) or die("не удалось соединиться с бд!!!! ".mysql_error());
mysql_select_db($db) or die("не удалось выбрать бд(".mysql_error());
?>
form.html
<body>
<form action="index.php" method="post">
<div align="center">
<br />ваш текст<br />
<input type="text" name="text" size="40">
<br /><br /><input type="submit" value="send" name="submit">
</div>
</form>
</body>
</html>
index.php
include "connect.php";
if ($_REQUEST['text']!='')
{
$name = $_REQUEST['text'];
mysql_query("INSERT INTO `security` VALUES (NULL,'$name')")or die(" не удалось добавить запись
(".mysql_error());
}
$sql_selected_posts="SELECT id,text FROM security";
$result_posts=mysql_query($sql_selected_posts)or die(mysql_error());
while($line_select=mysql_fetch_assoc($result_posts))
{
echo $line_select['text'];
}
Include “form.html”;
?>
Запустите этот скрипт, предварительно создав бд `sec` с таблицей security с двумя полями id и text.
В поле формы добавьте
<A href=https://i-novice.net>нажми меня не пожалеешь</A> и щелкните отправить. Посмотрите, что произошло при выводе из бд вашего сообщения. Правильно, наша с вами ссылка. Если бы это была форма для гостевой книги, то вашу ссылку
увидели бы все посетители. А вдруг сайт, на который она ведёт вредоносный. Получается, что вы станете виновником, так как не отфильтровали сообщение злоумышленника.
Теперь измените ввод данных:
$name = htmlspecialchars($_REQUEST[‘text’]);
Как видите теги ссылки выведутся обычным текстом. Так как функция htmlspecialchars лишила все теги функциональности.
Однако теги не радуют глаз. Поэтому можно пойти дальше и просто их всех удалить. Для этого можно использовать замечательную функцию strip_tags.
$name = strip_tags($_REQUEST[‘text’]);
После такой модификации, наша с вами ссылка превратится в обычный текст. Если я захочу, чтобы юзеры выделяли свой текст курсивом. То можно запретить удаление этого тега следующим образом.
$name = strip_tags($_REQUEST[‘text’],'<I>’);
Осталась тяжёлая артиллерия, функция mysql_escape_string(). Нужна, чтобы экранировать все спецсимволы. Вследствие чего использовать mysql_query() можно не боясь.
Зайдите в phpmyadmin и в таблице во вкладке sql выполните следующую команду
SELECT * FROM `security` WHERE text=” or ‘1’ = ‘1’
Как видите стало доступно все содержимое, не зная, что находится в поле text. А если бы там хранились пароли пользователей?
Чтобы злоумышленник не провёл такую sql-инъекцию, надо пользоваться функцией mysql_escape_string(), которая экранирует специальные символы с помощью слешей.
Я не говорю, что взлом теперь не страшен, но какой-нибудь 10-тиклассник точно обломается 😉
Не против, что я на своей новой социалке закинул ваш пост?
Можешь постить статьи у себя на следующий день после публикации. То есть если опубликована была здесь 14го числа, то 15го можешь у себя размещать.
Еще можно добавить $id=intval($id); но это если у нас чисто ИД
2dobs: Да, хорошее замечание
Как раз то что надо. Я начинающий так сказать. Пора начинать мне учится безопасности. Спасибо за статью.
Можно еще так использовать $id=(int)$id;
xD $id=$id+0;