Одноразовая ссылка

Тема в разделе "WASM.NETWORKS", создана пользователем SLayer0, 22 ноя 2009.

  1. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    Собственно сабж, как организовать?
    Т.е. нужно чтоб при запросе на http://<some-host>/<some-text> выдавались данные только один раз и чтоб подобрать этот <some-text> было крайне тяжело.
    Есть соображения по этому поводу, но они упираются в реализацию. Теоретически если писать на winsock то можно привязаться к порту соединения (т.к. получателю он также известен через $_SERVER['REMOTE_PORT']) и кодировать некую сигнатуру используя порт как ключ. Но вся проблема в том, что используется wininet и всё упёрлось в то, чтоб узнать номер порта с которого отправляется этот самый запрос.

    Для этих целей есть специальная ф-ция InternetQueryOption вызвав которую с INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO можно получить структуру типа:
    Код (Text):
    1. typedef struct {
    2.   DWORD_PTR Socket;
    3.   DWORD     SourcePort;
    4.   DWORD     DestPort;
    5.   DWORD     Flags;
    6. }INTERNET_DIAGNOSTIC_SOCKET_INFO
    Но тут опять подводные камни:
    1. MSDN учит что вызывать её можно только
    , т.е. это значит что запрашиваемый URI был отдан, а нам же его нужно ещё зашифровать!
    2. Даже при вызове этой ф-ции после HttpOpenRequest получаем структуру где Socket = -1 и все остальный поля = 0.

    Как быть? :)
     
  2. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    Пик релейтид:
    [​IMG]
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    SLayer0

    Нифига не понял, а почему все не сделать server-side?
     
  4. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    Сервер должен отвергнуть те запросы, иницатором которых выступает левое клиентское приложение.
    Вот пример:
    Есть некоторая программа которая обращается на некий сайт GET /linkAAA, сервер это принимает т.к. соединение с клиентской стороны установлено на порт AAA.
    Далее пользователь увидив такую ссылку в сниффере также пытается выполнить этот-же запрос, но должен получить что-то вроде [ 404 ], т.к. в его случаи уже у него уже будет другой порт.
    Далее пользователь умный думает попробую ка я вызвать /linkBBB и ему опять выдаётся [ 404 ], т.к. опять не угадал порт.
    Т.е. теоретичекси подобрать порт можно будет, но никто этим заниматься точно не будет.
     
  5. zeroday

    zeroday New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2009
    Сообщения:
    27
    SLayer0
    Привязка к порту - не лучший способ, тк, количество портов ограничено, и написать простенькую утилитку, которая переберт все - даже школьник сможет.
    На твоем месте, я бы смотрел в сторону асинхронного шифрования.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    SLayer0

    А нельзя ли сделать обычный SSL, с валидацией клиентов на стороне сервера по сертификату?
     
  7. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    zeroday
    _DEN_
    Немного не то, вы предлагаете зашифровать имеющиеся данные своим кеем и отправить уже типа шифрованныей запрос и получть ответ, но скажем HttpAnalyzer прекрасно перехватит эти данные и через его утилитку HttpBuildRequest можно будет отправит один в один те-же данные и получить один в один тот-же ответ, а такое неприемлемо. В случаи с портами вероятность того, что совпадёт порт, мнимальна и мало кому прийдёт в голову что сам запрос "/URI" был сформирован исходя из данных о соединении.
     
  8. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    P.S.: про дизассемблирование и изучение кода речь не идёт.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Не совсем понял что требуется, но не вижу проблемы. some-text - большое чило - ID (GUID). Если кто-то уже обратился по ссылке, то грохаем этот ID. Думаю на каком-нибудь PHP, это не сложно сделать.
     
  10. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    Booster
    а если их (обращающихся) очень много, соответсвенно ID тоже будет очень много, неохотно хранить их всех в базе или где-то ещё.

    Требуется чтоб программа всегда генерила уникальную ссылку, заходила по ней и получала данные. А другие при попытке зайти на эту ссылку посылалсиь куда подальше и наугад вбитые новые ссылки тоже посылалсиь куда побальше.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Какие такие другие?
     
  12. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    Booster
    Ну допустим я .. ты... видим что программа ломиться на http://<some-host>/ABCDEFABCDEFABCDEFABCDEFABCDEF и получает данные через обычный GET.
    Берём втыкаем эту же ссылку в свой браузер и получаем PAGE NOT FOUND к примеру.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Тогда я не понял, как это соотносится с названием темы.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Отправляешь запрос серваку, он возвращяет соль. Смешиваешь соль с паролем, делаешь хеш и отправляешь запрос на скачку. И так каждый раз.
     
  15. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    Booster
    Некая программа заходит по сгенерированной ссылке нормально, все посейдующие попытки зайти по этойже ссылке будут неудачныим. Вот как относится...
     
  16. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Сколько это «много»? Даже для миллиона id (сгенерированных, но не использованных ссылок) одновременно это всего лишь несколько мегабайт.
     
  17. SLayer0

    SLayer0 New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    17
    Запросов скажем так к серверу идёт около сотни в секунду, если все хранить у себя да ещё и проверять не повторяется ли он при каждом запросе это бует накладно.
    100* 3'600 * 24 = 8'640'000 запросов в сутки...для каждого хранить ID на несколько байт, база выростет за неделю до гигантских размеров и ДЛЯ КАЖДОГО запросо пробегаться по всей базе искать совпадения - скажем мягко плохой тон.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Я не совсем понимаю зачем хранить много. Достаточно одной, как-только кто-то заюзал - меняем. Хотя я так и не понял, что именно нужно.
     
  19. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Та просто кодируй содержимое ответа. Т.к. ты написал
    то это защита от юзеров. Тут шифрование подойдет. Любой другой метод если захотят то расковыряют твою клиенсткую программу и все, твои изыскания будут бесполезны.