Защита с нуля написанного своего cms

Статус
В этой теме нельзя размещать новые ответы.

cernet

Создатель
Регистрация
19 Янв 2010
Сообщения
44
Реакции
0
:thenks:Люди помогите вот с такой тематикой написал смс, но там только функционал ни какой защиты. В процессе создания думал сначала написать а потом реализовывать защиту. Скажите по какому кретерию оцениваетя защита сайта.Я к примеру знаю только несколько тем по данному вопросу это sql-иньекции и подбор пароля и то не полностью понимаю это и все. Так как этот вопрос думаю волнует всех:ah: Прошу четко и ясно отвечать, так как вы можете хорошо знать о чем говорите а другие ведь только начали и читая ваши ответы должны тоже хоть что то понимать. Знаю вы скажете скачай любые смс тести на локалке и разберешся, я так и делаю, но кто писал с нуля знает как много на это уходит времени.
Исходя из выше сказанного прошу выкладывать готовые скрипты для защиты сайта программы проверки уязвимости ваши советы итд но учтите это тема для не особо продвинутых прошу пояснее а так всем Боольшое человеческое спасибо кто откликнется
 
но там только функционал ни какой защиты. В процессе создания думал сначала написать а потом реализовывать защиту

А вам отвечать собственно нечего. Переписать вашу CMS с 0.
Под защитой, как я понял, вы имеете ввиду обработку всех входящих данных.
Реализовывать обработку необходимо на начальном этапе, т.е при структуировании ядра. Функции, классы.
Лично мне вам посоветовать нечего, ибо реализации защиты на готовом движке = написание нового движка.
 
1) SQL-инъекции

Везде, где у тебя в SQL входят какие-то данные от юзера
PHP:
 "SELECT * FROM products WHERE cat='".$_GET['cat']."'"
надо для них делать mysql_real_escape_string()
PHP:
 "SELECT * FROM products WHERE cat='" . mysql_real_escape_string($_GET['cat']) . "'"


2) XSS

Везде, где у тебя идет вывод на экран, надо следить, чтоб в этот вывод не попал яваскрипт:
PHP:
  <p>Вы искали <?=$search?></p>
заменяем на
PHP:
  <p>Вы искали <?=htmlspecialchars($search)?>


3) XSF

Везде, где у тебя есть формочки, изменяющие данные, вставляй капчу или hidden текстовое поле, которое работает как каптча
<input type=hidden name=captcha value=12345>
При этом 12345 генери для каждой формочки отдельно и при сабмите проверяй - чтоб captcha была валидной, недавней, и чтоб формочку с ней еще не сабмитили. Ну то есть точь-в-точь как капчу, только без вывода самой картинки, в hidden поле уже результат.


4) Session Fixation

Если есть сессии, обязательно храни в них IP и Useragent бровзера и каждый раз сравнивай с текущими. Если не совпали - удаляй сессию вообще.

PHP:
if ($_SESSION['ip'] && $_SESSION['ip'] != $_SERVER[REMOTE_ADDR]) {
  session_destroy();
} else {
$_SESSION['ip'] = $_SERVER[REMOTE_ADDR];
}


5) Брутфорс

Где-то был и про это такой же замечательный по простоте метод, найду- допишу.
 
:yahoo:Спасибо, уже не плохо протестировал ваши советы очень помогло, но вот такой прикол дал потестить свой скрипт вроде бы знающим людям они там тонны дыр нашли но не какие дыри и как закрыть не сказали, в смысле лаве:(просят ну я их понимаю халявой никому ни охото заниматься. Мне посоветовали поставить одноразовые ключи для админки как в джумле(Токены) скажите как мне это поможет и стоит ли вообще это делать. И если да то где достать подобные скрипты, ах да есть ли программа или скрипт для проверки на уязвимость.
 
Нашел про брутфорс:

5) Брутфорс

Сделать нужно так: одновременно принимать не более 2х запросов на аутентификацию для одного аккаунта. Два запроса (а не один) нужно разрешить, чтобы ламеры нажимающие даблклик не парили вам головной мозг, что “сайт не работает”. После неправильного запроса на аутентификацию – нужно делать паузу, в течении которой тому же аккаунту запрещено аутентифицироваться, пауза может быть статической, типа 15 секунд или возрастающей каждый раз скажем на 2 секунды, брутфорсилка её быстро загонит до больших значений, что сделает подбор пароля невозможным, а юзер сделавший случайную опечатку – просто не заметит. У меня всё это реализовано через создание файла на сервере, логически связанного с аккаунтом, для которого происходит попытка аутентификации. В файл каждый раз дописывается время запроса (с помощью дописывания в конец – меньше шансов случайно стереть файл, даже с блокировкой), при успешной аутентификации файл стирается.
 
спасибо лучше кнопкой, а то могут и забанить.

Еще забыл важную штуку, поважнее брутфорса:

7) File Upload

Если даешь пользователям заливать файлы, следи чтоб эти файлы не имели расширения php или pl или какое там другое твой Апач понимает. Очень часто бывает, что чувак аттачит какую-то "картинку", она сохраняется на сервере в папку files, и расширение ее при этом не проверяется. Т.е. можно залить через формочку image.php, а потом просто в бровзере набрать Для просмотра ссылки Войди или Зарегистрируйся - и код из image.php, который ты до этого залил, выполнится на сервере.

Очень распространенная на самом деле дыра, и одна из самых страшных.
 
remote file inclusion:

на некоторый сайтах встречаются урлы такого вида: Для просмотра ссылки Войди или Зарегистрируйся

после некоторого раздумья урл преображается в подобие Для просмотра ссылки Войди или Зарегистрируйся и т.п.
 
venetu, не такая уж она и распространенная. И защита тут как раз самая элементарная.
Получаем имя файла:
$filename = $_FILES['uploadfile']['name'];
Массив с разрешенными расширениями:
$allowed = array('exe','rar','txt','jpg','zip');
Потом получаем раширение:
$get_type = explode('.', $filename);
Загоняем в переменную:
$type = strtolower(end($get_type));
Проверяем, если не тру, выкидываем:
if (!in_array($type,$allowed))die("мессед");
 
Напишу уже сюда и про брутфорс, может еще кому сгодится:

На сервере заводим папочку bruteforce, доступную для записи. В ней создается файл с именем
PHP:
md5($_POST['login'] . 'secret_string');
и без расширения. В файл каждый раз, при каждой попытке логина, дописываем текущее время:
PHP:
fwrite($fp, time() . "\n");

При попытке авторизации читаем из файла все времена, которые туда сохраняли. Общее их количество умножаем на 5 - это сколько секунд надо прибавить к последнему времени, хранящемуся в файле. Прибавляем. Смотрим - если больше, чем текущее time() - то просто на выход, выводим ошибку. Если меньше - тогда уже проверяем пароль, и если правильный - файл удаляем, юзера авторизуем. Если неправильный - дописываем текущий time() в конец и выводим "login incorrect";

В файле хранится типа такого:
Код:
1268314474
1268314481
1268314501
т.е. просто подряд unix timestamp, каждый с новой строки.


Проверяем так:
PHP:
$filename = 'bruteforce/'.md5($_POST['login'] . 'secret_string');
$arr = file($filename);
$time = (int) $arr[count($arr)-1];
$time += (count($arr)-1)*5;
if (time() < $time) {
  // .. тут ошибка что ждите
} else {
 // тут проверяем пароль и апдейтим/удаляем файл
}
 
venetu, бред. Что если на сайте 100500 юзеров и каждый авторизуется?
Лучше по такому алгоритму делать:
1. Принимать пароль от юзверя, как обычно.
2. Если неверный, писать в базу в ячейку с его данными в спец. поле, например, sec, значение +1.
3. При логине смотреть, что в этом поле. если значение больше 5, то сразу кидать еррор и требовать восстановить пароль по мылу. При восстановлении пароля по мылу значение этого поля обнуляем, и у юзера снова есть 5 попыток неправильной авторизации :D
Кстати, при успешной авторизации, сразу после выдачи кук, например, можно поставить также обнуление значения в этом поле. В таком случае, блокировка будет лишь при пяти неправильных вводах пароля подряд.

Кода не привожу, т.к. на разных cms все по разному. Кому надо, тот реализует.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху