Версия для печати. Взято с сайта phpsql.ru

На главную   Назад   Вперед

Защита сайта. Безопасность сайта

Все что сделано одним, ломается другим. )

Хакерам дай только что-нибудь поломать.
Вряд ли Ваш сайт содержит секретную или финансовую инфу.
Но когда он станет популярным, его все равно взломают.
Либо для развлечения - испортить что-нибудь, показать свою крутизну, либо, что бывает чаще, чтобы наспамить.

Сегодня мы поговорим о безопасности сайта. Эти приемы простые, но Вы должны их запомнить и использовать всегда!

Самое важное - проверяйте все входящие данные, не доверяйте никаким принятым от пользователя значениям, например, полученным через массивы $_GET, $_POST.

1. Защищаем числовые данные

Пример взлома:
"SELECT * FROM base WHERE id=" .$_GET["id"];
Для /?id=5 все работает отлично, но хакер вводит
/?id=5;DROP TABLE base;

получаются 2 запроса:
"SELECT * FROM base WHERE id=1; DROP TABLE base"
В результате все данные таблицы base удаляются. Оно нам надо?

Защита:
Целые числа ВСЕГДА прогоняем через функцию intval() или преобразуем в (int), например:
"SELECT * FROM base WHERE id=" .intval($_GET["id"]);
или
$id=(int)$_GET["id"];
"SELECT * FROM base WHERE id=" .$id;

2. Защищаем строковые данные.

Пример взлома:
$search = $_GET["search"];
"SELECT * FROM base WHERE text LIKE (`%$search_text%`)
Для /?search=abc все отлично, но если наберут например
/?search=`)+and+(id=`1
получаем запрос
"SELECT * FROM base WHERE text LIKE('%') AND (id='1%')"
где еще выводятся и значения с id=1 и т.п.
Возможности для творчества злоумышленника большие. Как их закрыть?

Защита:
Все строковые данные заключаем в фунцию mysql_real_escape_string().
Она экранирует специальные символы, например, заменяет ` на \`.
Пример:
"SELECT * FROM base WHERE text LIKE(`%" .mysql_real_escape_string($search). "%`";

3. Защищаем форумы.

Бесплатные движки форумов постоянно ломают, поэтому обновляйте их на последние версии, где баги уже исправлены. Это делать лень, но надо (.

Если пишете свой форум, следите, чтобы он не стал "находкой" для спамера или чтобы через него не "грохнули" всю Вашу базу. Если информация конфиденциальная, не делайте форум! Он всегда угроза для сайта.

Положим сайт у Вас так себе, ничего ценного.
Все любят размещать бесплатные ссылки на блогах, форумах. "Обломите" народ.
Во-первых, вырежьте все теги из набранного пользователем текста с помощью функции strip_tags().
Также не забудьте о функции mysql_real_escape_string() при занесении данных в базу.
Желательно, используя регулярные выражения, вообще обрезать все лишние символы, оставив только буквы алфавита и знаки препинания. Все лишнее не должно вводиться пользователем!

4. Защита капчей.

Если на сайте есть формы обратной связи или свой форум обязательно делайте или регистрацию на почту или капчу (циферки).
Иначе скоро появится робот, который заспамит все что можно.
Зачем он это делает, непонятно, но жизнь такова.

Ниже приведен код несложной капчи. Вызывать внутри тега как img src="имяфайла.php?id=1234" где 1234 - это число, которое изображаем.

<?
  $val=(int)($_GET["id"]%10000);
  header("Content-type: image/gif");
  $img = imagecreatetruecolor(70, 60);
  imagefill($img, 0, 0, 0xDDDDDD);
  for($i=0;$i<4;$i++){
    $v=(int)($val%10);
    $val=(int)($val/10);
    show($img,3-$i,$v);
  }
  imagejpeg($img,"",80); 
  ImageDestroy($img);
  
  function show($img,$pos,$val){
    $x=10+$pos*10-rand(1,4);
    $y=30+rand(0,20);
    $a=rand(0,40)-20;
    imagettftext($img,25,$a,$x,$y,0,"symbol.ttf",$val);
  }
?>

где symbol.ttf - шрифт windows, помещенный в папку, где находится исполняемый файл.
Вы должны потом сравнить переданное и введенное пользователем значение и, разумеется, не передавать его в явном виде.
Для этого либо умножаем его на какое-либо число, либо храним в базе данных или сессии.

5. Сохраняем бэкап сайта на DVD.

Вам нравится когда Ваш месячный труд пропадает напрасно? Нет?
Тогда не забываем о бэкапе.
Что если злоумышленники удалят Ваш сайт, сотрут базу?
Хотя у хостера есть свой бекап сайта за месяц, но полагаться на него полностью нельзя, у них тоже бывают проблемы с железом.
Жесткий диск домашнего компьютера тоже ненадежен. Он ломается тогда, когда этого меньше всего ждешь.
Поэтому покупаем DVD-болванки и копируем данные на них. Содержимое сайта копируем по ftp.
Базы данных, если небольшие, можно экспортировать через phpmyadmin, оттуда копировать в блокнот и сохранять в utf-8 кодировке.
Потренируйтесь на тестовой или небольшой базе, научитесь ее восстанавливать, и тогда почувствуете себя уверенней.
Для больших баз ищем готовые файлы баз данных через ssh (что сложнее), архивируем их (если надо) и копируем.
Пишем все на DVD и убираем в надежное место. Время от времени.

 
Предыдущая   На главную   Следующая