На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
  
> подмена реферрала
    приветствую!

    к примеру, я для некоторого своего сервиса, хочу предоставить публичный АПИ. но важно то, чтоб этот АПИ не могли использовать вне браузера потому, что счетчики и реклама(за счет чего и живет сервис) перестанут работать.
    идея в том, что я на стороне сервиса буду проверять реферрала, и если он валидный - то АПИ работает. иначе отсылает.
    собственно вопрос в том, нормальный ли это способ, и есть ли возможность обойти такую проверку и самому каким-то образом устанавливать реферрала?

    ну, или, предлагайте идеи.

    благодарен.
      Конечно можно обойти. При HTTP запросе подставив валидный реферер "злоумышленник который не хочет смотреть рекламу" обойдет ограничения.
      Вообще же создание API предполагает что там не будет никакой рекламы и клиент получит данные машинного вида для обработки и хранения.
      Если данные очень уж специфические и уникальные, лучшим вариантом будет работать по подписке, продавать доступ на время.

      Добавлено
      Этот вопрос уже обсуждался тут: RESTfull-api и счетчики, верно?
      Возможно стоит уточнить что за сервис и какие данные он предоставляет пользователям что бы разобраться в ситуации более точнее.
        Цитата Sunny @
        Конечно можно обойти. При HTTP запросе подставив валидный реферер "злоумышленник который не хочет смотреть рекламу" обойдет ограничения.

        просто я далек от этого, и не очень понимаю, кто/как устанавливает реферрал.

        Цитата Sunny @
        Этот вопрос уже обсуждался тут: RESTfull-api и счетчики, верно?

        да.

        Цитата Sunny @
        стоит уточнить что за сервис и какие данные он предоставляет пользователям что бы разобраться в ситуации более точнее.

        этот сервис:
        http://liveworkspace.org/

        хочу предоставить АПИ, для сайтов-партнеров.
        подскажите, как такое вообще делается?
        одно из условий - чтоб использовать этот АПИ можно было только из браузера.
        Сообщение отредактировано: niXman -
          Цитата niXman @
          просто я далек от этого, и не очень понимаю, кто/как устанавливает рефферал.

          Реферал это человек который подписался под другим (МММ, реферальная программа).
          HTTP реферер (Referrer в HTTP ответе сервера) - это строка которую отправляет браузер при запросе страницы, она указывает откуда пользователь пришел (предыдущий адрес).
          Прикреплённый файлПрикреплённый файлsample.jpg (25,91 Кбайт, скачиваний: 450)

          Цитата niXman @
          хочу предоставить АПИ, для сайтов-партнеров.
          подскажите, как такое вообще делается?

          Обычно через API обращаются к данным, а если необходимо эти данные создавать на сайтах-партнерах, то лучше использовать Iframe или JavaScript код для интеграции редактора в их сайт.
          При таких вариантах можно будет вставлять рекламу (в каком формате кстати, никаких баннеров не видно при отключенном adblock) и счетчики.

          Цитата Sunny @
          JavaScript код для интеграции редактора в их сайт

          По такой технологии например работают многие like-кнопки (Facebook или Google+).
          VK.com использует Iframe для этих целей.
            Цитата Sunny @
            HTTP реферер (Referrer в HTTP ответе сервера) - это строка которую отправляет браузер при запросе страницы, она указывает откуда пользователь пришел (предыдущий адрес).

            понял. т.е. при формировании запроса "руками", можно указать какой угодно реферрал.

            Sunny, смотрите, такая идея: партрнер, на своей стороне формирует УРЛ вида http://liveworkspace.org/выполнить_и_показ...т_кода_в_base64
            тут, фрагмент_кода_в_base64 - это то, что я извлекаю на своей стороне и выполняю, и показываю результат. т.е. партнер формирует у себя на сайте нужные УРЛы, по которым кликают юзеры.

            возможно, это пояснение натолкнет Вас на какие-то мысли...
              Если от сервиса требуется только выполнение кода на разных языках, без редактора этого кода, можно использовать примерно такие реализации:
              • Iframe для получения результата по ссылке
              • POST ajax-запрос
              В обоих случаях пользователь который захочет протестировать код и получить результат с помощью вашего сайта отправляет запрос и получает результат с вашей рекламой.
              Вопрос в том, захочет ли владелец сайта показывать рекламу стороннего ресурса у себя на сайте.

              Либо же делать сервис по подписке - оплачивай и смотри без рекламы, или используй trial-версию с рекламой.

              Как я представляю себе эту систему:
              Цитата
              Заходим на сайт, вроде javascript.ru
              Видим код который хотим испробовать
              Жмем кнопку "Выполнить (Execute)"
              Открывается popup модальное окошко
              Крутится какой-нибудь ajax-загрузчик, мы ожидаем результат
              Получаем результат с рекламой (или без) сверху/снизу этого попапа


              Опять же владелец ресурса может свободно обрезать рекламу или подставлять свою собственную в ответ, это не сложно.

              Необходимо так же определиться с форматом рекламы который будет использоваться. Для hello world нет смысла впихивать баннеры с флеш-плеером 468*60 пикселей.
                Цитата Sunny @
                Если от сервиса требуется только выполнение кода на разных языках, без редактора этого кода, можно использовать примерно такие реализации:
                Iframe для получения результата по ссылке
                POST ajax-запрос
                В обоих случаях пользователь который захочет протестировать код и получить результат с помощью вашего сайта отправляет запрос и получает результат с вашей рекламой.
                Вопрос в том, захочет ли владелец сайта показывать рекламу стороннего ресурса у себя на сайте.

                нет-нет-нет, Вы все не так поняли.
                партнер, сами коды хранит у себя и отображает их как ему угодно. но, помимо этого, он формирует ссылку, при клике на которую, юзер будет перенаправлен на liveworkspace.org.
                  niXman можете привести пример такого партнера?
                  Например тот же Javascript.ru подойдет для этих целей?
                  Не особо понимаю для чего партнеру уводить своих клиентов на другой сайт.
                    Цитата Sunny @
                    можете привести пример такого партнера?

                    я сейчас в процессе налаживания взаимодействия по просьбе первого партнера. сам сервис liveworkspace.org, не предусматривал публичного АПИ до тех пор, пока ни поступило предложение. и вот, мы пытаемся прийти к общему мнению о функциях АПИ.

                    Цитата Sunny @
                    Например тот же Javascript.ru подойдет для этих целей?

                    если там есть примеры кодов(а наверняка они там есть), то да, подходит.

                    Цитата Sunny @
                    Не особо понимаю для чего партнеру уводить своих клиентов на другой сайт.

                    это нужно не партнеру, это мое требование.
                    а для партнера плюс в АПИ в том, что пользователи ресурса партнера получают профит в виде _однокликового_выполенения_кода_и_просмотра_результата_
                    Сообщение отредактировано: niXman -
                      Тогда как вы и сказали через base64 передавать по ссылке код и отображать всплывающее окно или сам сайт.
                      Еще стоит учесть тот факт, что различные браузеры поддерживают разную длину ссылок: http://paradigm.ru/url-max-length
                        Цитата Sunny @
                        Тогда как вы и сказали через base64 передавать по ссылке код и отображать всплывающее окно или сам сайт.

                        да, но исходный вопрос так и остался без ответа: что нужно сделать, чтоб этот АПИ могли использовать только партнеры?
                          Использовать генерацию ключа доступа на стороне партнера или генерацию ссылки для просмотра после запроса сервера партнера.
                          Первый вариант немного проще, но не очень гибок. Второй более сложный, но крайне гибкий, который может генерировать короткие ссылки на присланный сервером код.
                          В обоих вариантах требуется участие серверных скриптов.
                            жуть как все сложно %)

                            Sunny, спасибо огромное. буду думать.
                              niXman на самом деле не очень сложно, второй метод мне кажется более логичным и правильным.
                              Партнерский сервер отправляет код (он так же может включать IP адрес клиента) на ваш сервер, а в ответном сообщении получает ссылку для просмотра результатов.
                              Тут можно и в фоне вычислять результат, считать клиентов, показывать рекламу и все остальное что вздумается.
                              Помимо кода партнер может отправлять ссылку что бы клиент мог вернуться, вы же в свою очередь можете сделать более простой дизайн или как-то еще брендировать страницу.
                              Что-то аж воображение разгулялось :D
                                Цитата Sunny @
                                Партнерский сервер отправляет код (он так же может включать IP адрес клиента) на ваш сервер, а в ответном сообщении получает ссылку для просмотра результатов.

                                т.е. при клике на ссылку у партнера, сервер партнера отправляет мне код для компиляции и я, в ответ, шлю ему ответ в виде ссылки на которую он переадресует юзера?
                                тут, мне не очень понятно, как такое реализуется пошагово... не могли бы Вы описать плиз ;)

                                Цитата Sunny @
                                Помимо кода партнер может отправлять ссылку что бы клиент мог вернуться

                                непонял.. поясните.

                                Цитата Sunny @
                                вы же в свою очередь можете сделать более простой дизайн или как-то еще брендировать страницу.

                                так же, поясните пожалуйста :)
                                  В операции участвуют трое:
                                  Клиент - пользователь который хочет протестировать код
                                  Партнер - сайт вашего партнера куда заходит Клиент
                                  Сервис - сайт который воспроизводит код от Партнера

                                  • Клиент заходит на сайт с исходниками
                                  • Нажимает на кнопку выполнения кода
                                  • Партнер отправляет POST-данные для Сервиса (примерно):
                                    • IP Клиента
                                    • Код который необходимо выполнить
                                    • Язык программирования (либо Сервис определяет его автоматически)
                                    • Ссылка для возврата на страницу Партнера
                                  • Сервис получает данные от Партнера
                                  • Сервис обрабатывает данные:
                                    • Генерирует ссылку (md5 кода)
                                    • Сохраняет код в базе
                                    • Выводит ссылку на которую должен перейти Клиент
                                    • Партнер перенаправляет пользователя по ссылке из предыдущего пункта
                                  • Клиент видит результат исполнения на сайте Сервиса
                                  • Клиент нажимает на кнопку возврата на страницу где он был ранее (она берется из Referrer или по присланной ссылке)

                                  Сервис определяет что пользователь перешел по ссылке с сайта определенного Партнера и может например менять изображение логотипа или оформлять сайт в цветовое оформление сайта Партнера и т.п. усложнение.
                                  Либо же можно не перенаправлять Клиента на ссылку которую создал Сервис, а просто открывать её во всплывающем окне которое Клиент безболезненно закроет.
                                    Sunny, да, все выглядит логично, но есть одно но: партнер не хочет вносить столь сильные изменения в свой сайт. но генерить УРЛы при помощи JS он согласен.
                                    даже и не знаю... может быть отказаться от закрытого АПИ, и сделать его публичным? да, это не принесет прямой прибыли от рекламы, но это сделать рекламу сервису! т.е. своего рода косвенная реклама...
                                      Цитата niXman @
                                      но генерить УРЛы при помощи JS он согласен

                                      В методе который я написал выше, партнеру ничего генерировать даже не придется. Он обращается по адресу на сервисе, получает ссылку и переадресует клиента на эту ссылку.
                                      Все решается максимум 2 десятками строчек на JavaScript, а на jQuery так вообще десятью, не более.

                                      Добавлено
                                      Цитата Sunny @
                                      jQuery так вообще десятью

                                      ExpandedWrap disabled
                                                $.ajax({
                                                    url: "http://liveworkspace.org/api/",
                                                    dataType: "json",
                                                    data: {
                                                        referrer: document.location.toString(),
                                                        code: $("#textarea").text()
                                                    },
                                                    type: "POST"
                                                }).done(function(data){
                                                    document.location = data.link;
                                                });

                                      Сервис получает код который необходимо исполнить (переменная code), ссылку для возврата (переменная referrer) и отдает сгенерированную ссылку для клиента.
                                      Все происходит на сайте партнера, при этом задействован сайт сервиса который при получении данных может начать их обрабатывать и подготавливать для клиента который придет как только получит ответ от сервиса (в виде ссылки на которую нужно придти).
                                      Можно конечно код шифровать в base64, это более простой способ, но имхо, код выше намного гибче, вы можете контролировать тех кто запрашивает ссылку на код с помощью access-control-allow-origin на стороне http сервера сервиса.
                                        Sunny, либо я придумал еще один способ защитить АПИ от использования нежелательными приложениями/сайтами, либо я придумал бред.

                                        идея:
                                        1. УРЛ должен быть таким: liveworkspace.org/api/<service_prefix>/<encoded_data>
                                        2. где: service_prefix - префикс в виде имени сервиса-партнера, encoded_data - сам код и остальные данные энкодированные каким-то алгоритмом.

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

                                        как Вам такая идея?

                                        тут, осталось только определиться с алгоритмом. основные требования к которому: 1)реализация на php/js, 2)невысокая алгоритмическая сложность, 3)возможность точно определить, соответствуют ли полученные данные конкретному ключу.

                                        Добавлено
                                        для алгоритма подходит простой XOR, вот только с третьим пунктом лажа. да и подбором такой алгоритм с легкостью раскалывается =)
                                        Сообщение отредактировано: niXman -
                                          Если шифрование происходит на стороне сервера по приватному ключу и передается публичный ключ (для идентификации партнера) + зашифрованные данные - может сработать.
                                          А если использовать ключи на javascript, как их не шифруй, все равно найдут и смогут использовать сервис в своих корыстных целях.
                                            поясню.
                                            я, заключая договор с партнером, передаю ему ключ, с помощью которого он шифрует данные. я же, на своей стороне, дешифрую его данные используя тот же ключ.

                                            вот только, я не уверен на счет того, каким образом партнер будет шифровать данные так, чтоб никто не смог украсть ключ. есть идеи?
                                              Цитата niXman @
                                              каким образом партнер будет шифровать данные так, чтоб никто не смог украсть ключ

                                              Никто не сможет расшифровать данные кроме тех, кто знает ключ, если партнер будет это делать на стороне сервера с применением приватного и публичного ключа.
                                                ладно, осталось только согласовать с партнером...
                                                  для алгоритма шифрования, я пока что решил использовать RC4. благо есть реализация на JS: http://code.google.com/p/crypto-js/#RC4,_RC4Drop
                                                    да, на этом и сошлись.

                                                    тред, полагаю, можно закрывать.

                                                    Sunny, спасибо еще раз, огромное!
                                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                    0 пользователей:


                                                    Рейтинг@Mail.ru
                                                    [ Script execution time: 0,0664 ]   [ 17 queries used ]   [ Generated: 11.05.24, 12:13 GMT ]