Owner
Регистрация: 29.09.2006
Адрес: WORLD
Сообщений: 2,361
Провел(а) на форуме: 3 мес 0 нед 4 д
Репутация: 223
|
Методы дополнительной защиты сайта
Методами дополнительной защиты сайта, работающего на php. Напишем пассивную защиту для обнаружения web шеллов, подумаем над способами защиты от брутфорса пароля и сделаем ещё несколько полезных вещей. Для начала хочу сказать, что данная статья прежде всего даёт пищу для размышления, так как я в основном буду подавать вам идеи, нежели исходный код. Итак, начнём…
Первый фрагмент кода, который я хочу вынести на ваш суд, «бьёт тревогу» в случае обнаружения в переменной посторонних знаков. Он пригодится для обнаружения попытки проведения sql инъекции и подобных атак.
Листинг 1:
function inj($what,$inj,$error) {
if (ereg(”[^$what]”,$inj)) die($error);
}
Пояснение 1:
Вызывать данную функцию следует так:
inj(’a-z0-9′,$var,$error);
a-z0-9 - символы, которые нужно пропускать (формат регулярных выражений)
$var - переменная, которую нужно фильтровать
$error - сообщение об ошибке (ошибка появится в случае нахождения посторонних символов)
То есть мы видим, что данная функция просто ищет посторонние символы в строке, и, в случае нахождения, выдаёт сообщение об ошибке и немедленно прекращает свою работу. Не стоит сетовать на излишнюю простоту… Всё гениальное просто! Да и вообще, все предлагаемые мною варианты просты, но могут сослужить неплохую службу.
Теперь я предлагаю перейти к теме защиты от брутфорса (подбора паролей). От брутфорса неплохо спасает следующий код:
Листинг 2:
sleep($sleep);
Пояснение 2:
$sleep - количество секунд, на которое сценарий останавливает свою работу.
Данный код рекомендую вставлять перед проверкой пароля. Например, двухсекундная задержка особо пользователю не помешает, а вот брутфорс применять будет бессмысленно. Разве что можно использовать много компьютеров (ботнет) для подбора пароля… Однако и это тоже решаемо. Например, если пользователь неверно ввёл пароль десять раз, можно забанить его по IP адресу (код не привожу). А ссылку для смены пароля отправить на e-mail пользователю. Так можно применять код из листинга 2 в поисковых механизмах сайта - для избежания DDOS атак.
Как идея - можно написать скрипт, который будет отсылать тебе sms/e-mail в случае поступления слишком большого количества запросов к сайту.
Следующий код можно использовать для нахождения web шеллов.
Листинг 3:
function srd($dir,$fn) {
if ($odir=opendir($dir)) {
$cdir=’0′;
while (false!==($file=readdir($odir))) {
if ($file!=”.”&& $file!= “..”) {
$cdir++;
}
}
closedir($odir); if($cdir!=$fn) { echo ‘Error!’; }
}
}
Пояcнение 3:
Вызывать данную функцию следует так:
srd(’test’,'15′);
test - имя папки
15 - число файлов в папке
При вызове данной функции начнётся подсчёт количества файлов и папок в папке и сравнение этого числа со вторым параметром (числом файлов и папок, которое должно быть в каталоге). Если при сравнении числа оказались разными (обнаружен посторонний файл или папка) - скрипт выдаст ошибку. Кстати, к выдаче ошибки рекомендую добавить ещё и функцию которая, будет отсылать e-mail/sms администратору. Чтобы администратор всегда был в курсе дел. Разумеется, приведённый код нужно вызывать в основных скриптах сайта. Если же у вас есть папка куда файлы постоянно добавляются (например, директория для закачки аватар на форуме), то рекомендую так же добавить в написанную мною функцию ещё и проверку типа и расширения файла.
Думаю, я показал вам методы нестандартного подхода к защите сайта. У меня ещё много идей (наверняка они появились и у вас по прочтению данной статьи). Например, можно настроить сервер так, чтобы он записывал все ошибки интерпретатора php в лог файл, который тоже будет парсить какой-нибудь скрипт на наличие фатальных ошибок… Пароли пользователей лучше шифровать алгоритмом md5 и прибавлять к ним (еще до шифрования) сложную комбинацию символов (которая будет зашита где-нибудь в теле скрипта). Так мы добьёмся того, что расшифровать пароль будет почти невозможно, а если в cookies при авторизации идентефикатором использовать не пароль, а что-нибудь ещё, то попасть в админ-панель сайта станет ещё труднее. Так же можно пароли от админ панели тоже зашить в теле скрипта. Тогда sql инъекций вообще можно особо не боятся…
Собственно на этом я заканчиваю статью, только хотелось бы дать последнюю рекомендацию, которой многие почему-то не следуют: всегда ставьте php_value error_reporting равным нулю, когда выкладываете сайт в интернет, и взломщики лишатся массы ценной информации.
|