Мой сайт - моя крепость или защита 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

<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-тиклассник точно обломается 😉





Читайте также:



7 Ответов на “Мой сайт - моя крепость или защита php.”

  1. Не против, что я на своей новой социалке закинул ваш пост?

  2. novice

    Можешь постить статьи у себя на следующий день после публикации. То есть если опубликована была здесь 14го числа, то 15го можешь у себя размещать.

  3. Еще можно добавить $id=intval($id); но это если у нас чисто ИД

  4. novice

    2dobs: Да, хорошее замечание

  5. Как раз то что надо. Я начинающий так сказать. Пора начинать мне учится безопасности. Спасибо за статью.

  6. Можно еще так использовать $id=(int)$id;

  7. Tkol

    xD $id=$id+0;


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map