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

Тема в разделе "PHP", создана пользователем cernet, 11 мар 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. cernet

    cernet Создатель

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

    invader Серый кардинал в отставке :)

    Moderator
    • Супермодератор
    Регистр.:
    3 апр 2006
    Сообщения:
    2.585
    Симпатии:
    5.725
    А вам отвечать собственно нечего. Переписать вашу CMS с 0.
    Под защитой, как я понял, вы имеете ввиду обработку всех входящих данных.
    Реализовывать обработку необходимо на начальном этапе, т.е при структуировании ядра. Функции, классы.
    Лично мне вам посоветовать нечего, ибо реализации защиты на готовом движке = написание нового движка.
     
  3. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    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) Брутфорс

    Где-то был и про это такой же замечательный по простоте метод, найду- допишу.
     
    ghostik32, baldins, sonicflare и 2 другим нравится это.
  4. cernet

    cernet Создатель

    Регистр.:
    19 янв 2010
    Сообщения:
    44
    Симпатии:
    0
    :yahoo:Спасибо, уже не плохо протестировал ваши советы очень помогло, но вот такой прикол дал потестить свой скрипт вроде бы знающим людям они там тонны дыр нашли но не какие дыри и как закрыть не сказали, в смысле лаве:(просят ну я их понимаю халявой никому ни охото заниматься. Мне посоветовали поставить одноразовые ключи для админки как в джумле(Токены) скажите как мне это поможет и стоит ли вообще это делать. И если да то где достать подобные скрипты, ах да есть ли программа или скрипт для проверки на уязвимость.
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Нашел про брутфорс:

    5) Брутфорс

     
    latteo нравится это.
  6. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    спасибо лучше кнопкой, а то могут и забанить.

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

    7) File Upload

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

    Очень распространенная на самом деле дыра, и одна из самых страшных.
     
  7. shutty

    shutty Создатель

    Регистр.:
    8 фев 2008
    Сообщения:
    41
    Симпатии:
    1
  8. -=BlackSmoke=-

    -=BlackSmoke=-

    Регистр.:
    4 авг 2009
    Сообщения:
    280
    Симпатии:
    49
    venetu, не такая уж она и распространенная. И защита тут как раз самая элементарная.
    Получаем имя файла:
    Массив с разрешенными расширениями:
    Потом получаем раширение:
    Загоняем в переменную:
    Проверяем, если не тру, выкидываем:
     
  9. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Напишу уже сюда и про брутфорс, может еще кому сгодится:

    На сервере заводим папочку bruteforce, доступную для записи. В ней создается файл с именем
    PHP:
    md5($_POST['login'] . 'secret_string'); 
    и без расширения. В файл каждый раз, при каждой попытке логина, дописываем текущее время:
    PHP:
    fwrite($fptime() . "\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 {
     
    // тут проверяем пароль и апдейтим/удаляем файл
    }
     
    zss и cernet нравится это.
  10. -=BlackSmoke=-

    -=BlackSmoke=-

    Регистр.:
    4 авг 2009
    Сообщения:
    280
    Симпатии:
    49
    venetu, бред. Что если на сайте 100500 юзеров и каждый авторизуется?
    Лучше по такому алгоритму делать:
    1. Принимать пароль от юзверя, как обычно.
    2. Если неверный, писать в базу в ячейку с его данными в спец. поле, например, sec, значение +1.
    3. При логине смотреть, что в этом поле. если значение больше 5, то сразу кидать еррор и требовать восстановить пароль по мылу. При восстановлении пароля по мылу значение этого поля обнуляем, и у юзера снова есть 5 попыток неправильной авторизации :D
    Кстати, при успешной авторизации, сразу после выдачи кук, например, можно поставить также обнуление значения в этом поле. В таком случае, блокировка будет лишь при пяти неправильных вводах пароля подряд.

    Кода не привожу, т.к. на разных cms все по разному. Кому надо, тот реализует.
     
Статус темы:
Закрыта.