Меры предосторожности — залог успеха.

Как защитить свой сайт? Как защитить сайт от взлома? вы наверняка задавались таким вопросом.

Сегодня хочу показать Вам несколько нехитрых приемов, которые помогут уберечь Ваш сайт от злобных рук хакеров. Чтобы обезопасить свой сайт, нужно запомнить 2 простые вещи — работайте со своими данными правильно и не доверяйте пользователям. Конечно, среди огромного количества людей есть нормальные, я надеюсь, таких даже большинство, но есть и такие которым интересно поискать какие-то косяки на вашем сайте и почувствовать себя хакером.

Самые опасные места для вашего сайта — это места, где пользователь может написать что-то свое. Это либо комментарий, форма обратной связи на вашем сайте, регистрация и т.д, а так же адресная строка. Не стоит забывать про нее, особенно если Вы работаете с GET данными.

Давайте посмотрим первую ситуацию

Например, адресная строка у Вас формируется таким образом

	http://yoursite.ru/index.php?view=articles
	http://yoursite.ru/index.php?view=news
	http://yoursite.ru/index.php?view=gallery
	

Т.е в GET[‘view’] мы принимаем какое-то значение, и исходя из значения полученного из GET[‘view’] показываем страницу, либо записи, либо новости или галерею.

Но злые хакеры могут написать туда что-то своими руками, например «sjnjsfd» и у вас выдаст ошибку, а самые беспощадные могут попробовать написать там какой нибудь SQL запрос.

Поэтому в таких случаях, нужно сначало ограничить варианты чему может равнятся GET[‘view’], в нашем случае GET[‘view’] = articles, либо news либо gallery — других вариантов быть не может. Если мы встретим другой вариант, то должны выдать сообщение или предупреждение пользователю, чтобы он подвязывал.

Как это сделать? Можно просто поместить возможные варианты в массив и перед каким-либо выводом информации, проверить, есть ли в этом массиве значение, которое сейчас находится в GET[‘view’].

	$view = $_GET['view']; // сохраняем в переменную значение полученное через GET['view']
	$arr = array('articles', 'news', 'gallery'); // создаем массив с возможными вариантами значения GET['view']
	if(!in_array($view,$arr)) die('ERROR 404!'); // если в переменной $view находится значение, которое отсутствует в массиве $arr, то заканчиваем работу скрипта.
	

Так нужно поступать всегда.

Вторая ситуация.

Например, Вы выводите какую-то статью на экран и у Вас адресная строка такого типа:

	http://yoursite.ru/index.php?view=articles&id=5 // выводим статью из БД, у которой id = 5
	

В данном случае, так же нужно проверить, есть ли у Вас статья в БД с id=5, если да — выводим, если нет — заканчиваем работу скрипта. Ведь опять же, человек может ввести туда либо — «2643568» или какой нибудь SQL запрос.

Так же нужно проверить, чтобы GET[‘id’] был именно числом, для этого есть различные функции — is_int(), is_numeric().

	$id = $_GET['id];
	if (is_numeric($id))
	{
	что-то делаем
	}
	else { exit(); }
	

Насчет запросов к БД.

Обычно делают так:

	$query = "SELECT * FROM articles WHERE id='$id' ";
	$result = mysql_query($query);
	

А лучше делать так:

	$query = sprintf("SELECT * FROM articles WHERE id = '%s' ",
	mysql_real_escape_string($id));
	$result = mysql_query($query);
	

Т.е мы не напрямую вставляем в запрос значение переменной $id, а сначала пропускаем его через функцию mysql_real_escape_string, которая экранирует специальные символы в строке. Проще говоря, так безопаснее.

Напоследок.

Конечно, не стоит забывать про использование функций — htmlspecialchars, trim, stripslashes, пропуская через них данные принимаемые от пользователя. Делать это можно так:

	$text = $_POST['text']; // какой-то текст из формы, например комментарий
	$text = trim(htmlspecialchars(stripslashes($text))); // пропускаем через все функции сразу
	

Ну и конечно, делайте копии своей БД хотя бы раз в неделю, так же сохраните копию своего сайта где-нибудь, так как бывает всякое — то хостинг накроется, то компьютер.

Так что, если Вы будете писать свой сайт используя эти меры предосторожности, у Вас больше шансов на успех :)

Ну а вообще, я бы рекомендовал использовать фреймворк CodeIgniter, так как там все эти моменты уже учтены и Вам не приходится заморачивать себе этим голову :)

Да и, недавно выкладывал урок по работе с функциями на PHP и если Вы вдруг пропустили этот урок или у вас есть вопросы по функциям, то советую пройти данный урок, он получился очень неплохим :)

Если урок Вам был полезен, нажмите на любую кнопку ниже— буду благодарен :) Всем удачи и следите за ходом событий 😉

Комменты

  • Спасибо Дмитрий я использовал ваш метод безопасности для функциональных сайтов CI попробывал понравилось но я учился по другому пока сложно мне разъеснить эти моментны я одновременно делаю 2 проекта 1 на CI другой на самописном велосипеде ваши статьи помогают но не до конца потому как например если с CI всё понятно насчёт шаблонов можно установить тот же Tweeg или Smarty то в функциональном сайте как сделать смену шаблонов уже мохг сломал может подскажите что какую логику постраения если не сложно

  • Здравствуйте Дмитрий, а если страница такого типа http://yoursite.ru/index.php?view=articles&id=5, и пользователь будет добавлять страницы через админку, где &id=5 этой страницы будет динамически увеличиватся, то как можно написать error404.

    • Дмитрий Валак: 28-11-2013 в 21:11

      Здравствуйте.
      Перед тем как показывать страницу с каким-то ID, сделайте проверку, есть ли запись с таким ID. Если есть — показываем, нету — показываем Вашу 404 страницу.

  • Здраствуйте, Дмитрий.Я создаю сайт с нулья на Html,Css,Php.Какой должень быть пароль админ панели, чтобы пароль не смогли взломать через подбор паролей.

    • Дмитрий Валак: 18-11-2013 в 13:26

      Буквы, большие и маленькие, цифры и различные символы. Но даже такой пароль можно подобрать, но на это уйдет не один месяц.
      Поэтому в некоторых системах, особенно в интернет-банках просят менять пароль каждые 3 месяца.

  • $query = sprintf("SELECT * FROM articles WHERE id = '%s' ",
    mysql_real_escape_string($id));
    

    В случае если поле id в базе имеет тип INT, выделенную строку можно легко сократить до (int)$id и даже если там строка, она будет преобразована в число.

  • это код в какой странице нужно написать ?

  • Да, к сожалению всяких ненормальных, которые ничего не умеют и другим мешают реализовывать свои возможности. 

  • меня тоже ломали какие-то черти из восточной европы, накидали кучу хакерской рекламы и порнухи, тоже спас бекап, но я реально чайник, и мне такие уроки в самый раз))

  • Классная статья!. Мой сайт видеоуроки CorelDRAW для начинающих один раз ночью взломали. Благо я умею восстанавливать бекапы! Так бы волосы рвал на голове. Если у вас виртуальньный сервер, то настройте резервные копии через isp-manager. Обязательно сделайте слепок системы (1 раз в неделю) и бекап каждой базы данных (1 раз в день). И если у вас простой хостинг, то используйте специальный скрипт с кроном. Пусть крон работает каждый день. Так можно уберечься. Можете использовать sypex dumper. А вот статья классная постараюсь иприменить эти знания. Адресная строка и формы ввода действительно дыры для взломщиков.