Как обезопасить сайт


Самые безопасные сайты - это сайты, написанные самостоятельно с нуля. Фактически, Вы защищатесь тем самым от всяких школьников, мнящих себя великими хакерами, которых очень много. Однако, имеются люди, знания которых достаточно для взлома весьма серьёзных сайтов, написанных с нуля.

Самое главное - это всегда задавать самому себе вопрос: "А что будет, если...?". Если Вы всегда будете задаваться таким вопросом, то Ваш сайт всегда будет защищён практически на 100%.

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

Также всегда вызывайте функцию htmlspecialchars(), которая заменяет опасные символы на сущности. Исключение - те данные, в которых и должен быть HTML-код.

Если в запросе к базе данных используются данные, ведённые пользователем, то всегда эти входные данные экранируйте с помощью функции addslashes(). Эту функцию надо использовать только, если отключена директива magic_quotes_gpc. Если она включена, то все входящие данные экранируются автоматически.

Всегда отключайте директиву register_globals. Как показывает практика, абсолютное большинство программистов не инициализируют переменные.

Приведу простой пример:

<?php
$mysqli = new mysqli("localhost", "root", "", "mydb");
$array["first"] = "1";
$array["second"] = "2";
foreach ($array as $key => $value) {
$mysqli->query("DELETE FROM `my_table` WHERE `field`='$value'");
}
?>

Если бы Вы проиницилизировали массив так:
$array = array();, то всё было бы в порядке. Однако, уверен, что далеко не все из Вас так делают. В результате, злоумышленник переходит по такому адресу: http://адрес_сайта/адрес_скрипта.php?array[zero]=0, и Ваш скрипт благополучно удаляет ту запись, которую удалять не стоило. А ничего не было бы, если бы была отключена директива register_globals.

Подведу небольшой итог:
- Всегда пропускайте входящие данные через htmlspecialchars(), за исключением тех случаев, где необходимо оставить HTML-теги.
- Проверяйте все входящие данные на правильность, используя строковые функции и/или регулярные выражения.
- Пропускайте входящие данные через функции stripslashes(), если они будут использоваться в запросах к базе данных. Не пугайтесь, что в базу попадут экранированные символы. Нет, данные в базе будут такими же, какими их отправляли в форме. Просто сам запрос будет безопасным.
- Отключайте register_globals.
- Всегда проверяйте работу скриптов на самых различных входных данных. Не забывайте, что если Вы просите ввести, например, фамилию, пользователь не захочет ввести какой-нибудь JS-код.

Это лишь часть самых простых и самых основных правил о том, как обезопасить сайт. В большинстве случаев их соблюдение уже более, чем достаточно, чтобы Вы могли спать спокойно.