Гайд [Lua RakBot+php] Делаем запросы с генерацией ключа доступа

vadimka0216

Известный
Автор темы
38
63
В этом гайде я расскажу про генерацию "хэшей" и о том, как интерпретировать их между скриптом и сайтом,на котором будут приниматься запросы, без всяких "Доп сайтов" для генераций.
Для чего нужно?: Такие ключи служат для выявления случайных запросов отправки данных по данной ссылке и для частичной защиты от "флуда"(Флуд подразумевается - многократное засорение БД или файла записи).
Где используется?: Лично я намерен использовать в RakBot в функции отправки запросов OpenUrl().
Краткое описание алгоритма: Пусть у нас будет 2 основных ключа, которые будут храниться строго в Lua скрипте(у отправителя запроса) и в PHP(у получателя). Отправитель генерирует рандомную строку с длиной "lenght_key", зависящую от произвольного порядка символов в "key" и времени машины. Таким же образом получатель - php скрипт, должен генерировать точно такую же строку и если такие строки совпадают, то можно открывать доступ к чему-либо. Также такие строки будут автообновляться раз в "key_update" секунд.
Итак, приступим:
Для начала нам необходимо создать Lua скрипт:
"key" - переменная, в которой хранится рандомный набор символов(Внимание! Нельзя использовать символы: '0' и '&', а также символы,которые нарушают целостность ссылок(различные пробелы и другие спец. символы), про другие не в курсе). Рекомендуется использовать как можно больше различных символов(желательно повторять символы не более двух), расположенных в РАНДОМНОМ порядке, хранить только в этом скрипте и в файле php.
Код:
local key="~1!@fdFDkqiIsMn973482HDDSSDBiasMAkaNigETOTest^";
local lenght_key=15; --длина "Хэш" - пароля
local key_update=30; --частота обновления "Хэш" - пароля, в данном случае будет генерить раз в 30 секунд.
local A={}; --вспомогательный массив для хранения символов
local size; --вспомогательная переменная для хранения количества символов в "key"
local summ_ascii=0; --Сумма кодов-символов в строке "key", служит для начального рандома
Итак, шапка готова, теперь нам надо разбить строку "key" на символы и поместить в массив "A"(Сделаем это при запуске программы):
Код:
function onScriptStart()
    for i = 1, key and key:len() or 0 do --как я понял, цикл идет до конца по строке "key"
        A[i]=string.char(key:byte(i)); --key:byte(i) -- код из таблицы ascii i-того символа в "key", string.char - функция преобразования из кода ASCII  в символ.
        size=i;
        summ_ascii=summ_ascii+key:byte(i);
    end
end
Инициализация готова, теперь можно приступить к генерации "Хэш" - ключа:
Функция generate_hashkey() будет возвращать сгенерированную строку
Код:
function generate_hashkey()
    local generate=""; --инициализация переменной
    local hash_time=(os.time()-os.time()%key_update)/key_update; --локальная пер, которая будет хранить деленное время на key_update(целочисленное деление).
    local rand=summ_ascii; --запись начального рандома,также служит для последующих записях новых значений
    for i = 1, lenght_key do --цикл for, который будет идти до максимальной длины "Хэш" - ключа
        rand=(hash_time%10000*2193019+rand*1084357)%94806863; --Собственно, основной момент, без которого у меня бы ничего не получилось -  Линейный конгруэнтный метод*.
hash_time%10000 - без деления, получилось бы очень большое число в php, 2193019, 1084357 и 94806863 - простые числа - коэффициенты. Важно: значение в скобках должно быть желательно меньше,значения 94806863, все должно уложиться в 1 цикл остатка от деления.
        rand_index=rand%size+1; --генерация рандомного индекса от переменной rand, +1,т.к. массив начинается от единицы.  Где size - ограничение по размерности массива.
        generate=generate..A[rand_index]; --добавление нового символа в сгенерированную строку.
    end
    return generate;
end
Ну и на этом все, теперь нам осталось отправить запрос с защитным ключом generate_hashkey(). Пример:
Код:
 openUrl("MySite/file.php?hash="..generate_hashkey());
Что нужно со стороны сайта:
Кинуть аналогичный скрипт на сайт "MySite" с названием файла "file.php"
в директиву MySite, только со своими прибамбасами:
ОБЯЗАТЕЛЬНО 3 первых параметра должны совпадать!
Код:
<?php
    $key="~1!@fdFDkqiIsMn973482HDDSSDBiasMAkaNigETOTest^";
    $size_hash=15;
    $key_update=30;
    $size=0;
    $summ_ascii=0;
    while ($key[$size]) { $summ_ascii=$summ_ascii+ord($key[$size]); $size++; }
    $hash_time=(time()-time()%$key_update)/$key_update; 
    $hash="";
    $random=$summ_ascii;
    for ($i=0; $i<$size_hash; $i++){
        $random=($hash_time%10000*2193019+$random*1084357)%94806863;
        $hash=$hash.$key[$random%$size];
    }
    if ($_GET['hash']==$hash){
 
        echo 'access ';
    }else{
        echo 'no access '.$hash.' summ_ascii: '.$summ_ascii.' ; size: '.$size;
    }
?>
К сожалению, есть один ньюанс - это время. Время должно совпадать с машиной, где выполняется lua скрипт для RakBot и с сайтом -сервером, иначе всегда будет выдавать no access.
Прошу отписать в комментариях, на сколько это безопасно и стоит ли использовать для защит от флуда?
Заранее извиняюсь за какие-либо ошибки, пишу ночью, надеюсь поправить чуть позже.
Ссылки:
Линейный конгруэнтный метод
 

Вложения

  • hash.lua
    694 байт · Просмотры: 64
Последнее редактирование:

SAMP.ASI

Известный
223
53
Лучше исползовать время по GMT -0, тогда не придется ограничивать пользователей по часовому поясу