Коротчайше сессии

Discussion in 'PHP' started by melky, 29 Jul 2010.

  1. melky

    melky New Member

    Joined:
    7 Apr 2010
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    коротчайшие сесси - ошибочка

    В процессе создания своего очередного проекта (ради практики) возникла такая идея..
    сейчас попробую вам объяснить и показать примером...

    например, существует такой инструмент, пусть будет для отправки сообщения. Ради простоты будет только поле ввода и кнопка отправки.

    index.php
    HTML:
    <form method="GET" action="mes.php">
    <input type="text" name="message"'> <br>
    <input type="submit" value="Отправить">
    </form>
    данные идут сюда
    mes.php
    PHP:
    $d = @$_GET['message'];
    $bd = new Bd('comments');   /* вымышленный класс для работы с бд*/ 
    $db->insert($d);
    Очень просто .. так же и для понимания.
    Но ведь фишка всей темы в том, чтобы не сделали вот типа такого
    http://site.com/mes.php?message=123
    и не автоматизировали это.

    После нескольких минут раздумий думал, что можно защитить этот файл , сделав
    1. передачу по POST (это самое очевидное)
    2. Защитить работу mes.php какими-то переменными, передающимися в QUERY, например ;
    2.1 хеш ИПа
    2.2 время (например, с помощью JS добавить туда секунды и сделать проверку на конечном скрипте, с погрешностями)
    2.3 ???? еще не придумал
    3. Добавить какую-нибудь информацию в кукис (эту же, вероятно :) )
    4. :confused:

    получается, что первая страница превращается в такую.

    index.php

    Code:
    [COLOR=YellowGreen]<?php $ip=md5($_SERVER['REMOTE_ADDR']); ?>[/COLOR]
    [COLOR=DarkOrange]<script>function c(){
    var t = (new String((new Date).getSeconds()))
    t = t.substring(t.length-1)
    document.forms[0].time.value = t  
    document.cookie = 'g=[COLOR=YellowGreen]<?php echo $ip; ?>[/COLOR];'
    return true;
    }</script>[/COLOR]
    <form method="POST" action="mes.php" [COLOR=DarkOrange]onsubmit="return c()"[/COLOR]>
    <input type="hidden" name="time" value="">
    <input type="hidden" name="ip" value="[COLOR=YellowGreen]<?php echo $ip; ?>[/COLOR]">
    <input type="text" name="message"'> <br>
    <input type="submit" value="Отправить'>
    </form>
    Хочу сразу cказать, что пишу , возможно, нерабочие примеры.
    Они требуются только для понимания.

    а теперь он

    mes.php
    PHP:

    function fu(){setcookie("g"md5($t));header("Location: " $_SERVER['HTTP_HOST'] . "");die("<script>document.location.href = '" $_SERVER['HTTP_HOST'] . "';</script>");return false;}
    /* облом , инфа 100%*/

    function g_t($num =0){ @date_default_timezone_set("Europe/Moscow");$t time();$time = @getdate$t );$time = @$time['seconds'];$int = (int) $time $num;$time = (strlen($int)>1) ? substr($int11):$int;return $time;}
     
    /* функция для короткой записи "погрешности" времени - внизу */

    $ip md5($_SERVER['REMOTE_ADDR']);

    $a = (isset($_POST['ip'])) ? (($_POST['ip']==$ip) ? true:false):false/* короче, если ипа в строке нету или он не подходит к вашему настоящему - конец*/

    $b = (isset($_COOKIE['g'])) ? (($_COOKIE['g']==$ip) ? true:false):false/* если ипа в кукис нету или он не подходит к вашему настоящему - конец*/

    /* время. */

    $c = (isset($_POST['time'])) ? $_POST['time']:false;
    /* кешируем время, потому что так текста меньше :)*/
    if (!$cfu();
    else 
    $c=($c==g_t(0)) ? true:(($c==g_t(1)) ? true:(($c==g_t(2)) ? true:false));
    /* если нет переданного времени, или оно не равно настоящему или минус 1 секунду или минус 2 секудны - то, оно равно false*/

    if (!$a || !$b || !$cfu();

    /* Так как там die(), можно оставить этот код */
    $d = @$_POST['message'];
    $bd = new Bd('comments');  
    $db->insert($d);
    говнокод, несомненно, присутствует. ну, знаю всё это с февраля :)

    просьба вас, ачатовцев, развить данную идую и пофиксить приведённый выше "код"
     
  2. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Каким бы код не был, придумаеться "антикод", поетому люди придумали Капчу =)
     
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    melky плохой план.

    1) Предположим самый сложный вариант - ваш движок приватен, и никто не догадывается, как вы генерируете кукис (пусть там например сверхдлинная строка добавляется, что даже не побрутишь). Мне ничего не мешает один раз спарсить это значение, и пока IP не сменится могу спамить как хочу.
    2) Со временем между запросами все так же ужасно. Пока работаете на локалхосте - все вроде бы хорошо, но с удаленным сервером у меня например рассинхрон, то есть его часы спешат на 2-3 секунды - получается я смогу отправить сообщение только если звезды устроят парад планет. А вот боту ничто не мешает ввести поправку, например.
    3) Кстати о боте - даже взяв одну цифру, например 1, он будет пробиваться с сообщением с вероятностью 30%, а это даже больше чем требуется для автоматического распознавателя капчи (без использования сервиса антикапчи). А если учесть, что в течение 3 секунд можно отправить не одно сообщение - вас заспамят
     
    _________________________
  4. melky

    melky New Member

    Joined:
    7 Apr 2010
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    насчет времени у меня такие же сомнения.. а что, если взять не текущее время, а секунды, прошедшие с начала эпохи Unix? там нет уникального значения. и зашифровать md5 или своим алгоритмом - чтобы не смогли прикручивать значения сами.

    А чтобы не завалили за 3 секунды, можно добавить анти-ДДос скрипт, не позволяющий делать >2 операций в секунду.

    Ну, для того, чтобы не было удачнух запросов, зависящих от определенной фазы луны, то пожно еще увеличить погрешность до 5 секунд и более.

    Сейчас там допускается, что данные идут 0 сек, 1 сек , 2 сек.

    Еще добавить каптчу (это худший вариант).
    что скажете?
     
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    melky сейчас у вас сравниваются последние цифры в секундах, тогда при рассинхроне в 22 секунды, то на скрипт будут влиять только 2. Если же начнете использовать unixtime, то погрешность будет уже полные 22 секунды.

    Таким образом - для первого случая увеличение промежутка до 5 секунд эквивалентно тому, что вы вообще отключите этот скрипт. А для второго случая - что слону дробина, почему - думаю понятно.

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

    Я обеими руками "ЗА" жизнеспособную схему защиты от ботов без использования капчи. Но на данном этапе - люди ничего лучше не придумали
     
    _________________________
  6. melky

    melky New Member

    Joined:
    7 Apr 2010
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    ну, я считаю, вы меня не поняли полностью. я вечером набросаю эту функцию полностью и покажу вам на критику. защита задумавалась первоначально не для блокирования ботов, а для накладывания ограничений на использование определенных скриптов, то есть, чтобы этот файл мог использоваться только со стороны сервера и только с этой формы. хм, эдакая антиюзер зона :)
     
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Что? Серверу не нужна форма, чтобы взаимодействовать самому с собой, возможно вы имели ввиду:
    http://ru.wikipedia.org/wiki/Referer
     
    _________________________
    #7 Gifts, 29 Jul 2010
    Last edited: 29 Jul 2010
  8. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    melky
    Что бы файл использовался только с стороны сервера, клиент обязан сидеть за сервером))) Да и проверить что входящие данные "только с этой формы" невозможно, т.к. реферер передаеться клиентом, и его можно подделать.