Как я могу защитить свой виджет ajax?

Я хочу создать виджет вокруг API ajax, который я размещаю на своем сервере. Виджет также будет обслуживаться моим сервером и размещаться на сторонних веб-сайтах. Виджет должен иметь доступ к DOM страницы хостинга (поскольку он обращается к данным формы на странице), поэтому он должен быть встроен с использованием тега скрипта, а не в iframe.

При нажатии кнопки виджет обращается к моему API, получает ответ и вставляет его в форму страницы хостинга.

Пока все хорошо, используя теги script и совершенство ajax. Быстрое доказательство концепции за несколько минут. Но как я могу запретить четвертой стороне просматривать код на странице третьей стороны и копировать его, чтобы виджет также был на их странице? Виджет будет доступен всем бесплатно, но я хочу знать, кто им пользуется, и контролировать доступ. Я также хочу, чтобы люди не могли получить доступ к API без виджета.

Я обдумал массу идей для подписи и хэширования, истечения срока действия токенов, стороннего прокси-сервера на стороне сервера, использования Flash на клиенте и многого другого, но я не могу придумать что-то, чего не смог бы честно обойти решительный мошенник. без труда.

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

Может быть, есть другой способ думать об этой проблеме?


person Nicholas    schedule 02.11.2010    source источник
comment
Может быть, какая-то структура виджетов? Не видя ничего там, что явно делает это.   -  person Nicholas    schedule 02.11.2010
comment
ОАут? OpenID? Я немного ошеломлен этими понятиями. Не уверен, что кто-то из них подходит сюда...   -  person Nicholas    schedule 02.11.2010


Ответы (1)


Ну, кому интересно, я придумал решение:

Я требую, чтобы мой виджет отображался только на страницах, требующих входа на сторонний веб-сайт. т.е. не на общедоступных страницах.

Я также потребую, чтобы сторонний веб-сайт внедрил несколько строк кода на стороне сервера (например, PHP), которые генерируют случайный одноразовый номер, объединяют его с секретным ключом и создают хэш:

$nonce = make_nonce(); $secret = 'ключ, специфичный для этого провайдера'; $ хэш = sha1 ($ одноразовый номер . $ секрет);

Nonce и хэш будут отправлены вместе с запросами на мой сервер, чтобы я мог проверить, что они исходят из браузера, который правильно зарегистрирован в сторонней системе. Я верну в браузер токен доступа к API, который можно использовать при обращениях к API.

Это связывает доступ к API с конкретными сторонними интеграторами.

Затем, чтобы ограничить злоупотребления, я ограничу скорость маркеров доступа, чтобы они подходили для одного интерактивного пользователя, но не для программного использования.

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

Это должно значительно ограничить возможность злоупотреблений, не затрагивая реальных клиентов.

person Nicholas    schedule 05.11.2010
comment
Еще одна вещь, которую вы можете сделать, - это внести в белый список авторизованные веб-сайты, чтобы только они могли делать запросы (хотя я не слишком уверен, сможете ли вы получить, с какой страницы она запрашивается, если только они не используют php-скрипт, чтобы получить ее от вас, и в этом случае вы может использовать аутентификацию (что вы уже сделали)) - person Not Available; 05.11.2010
comment
Упс, не сразу увидел этот ответ. Я бы сделал это, за исключением того, что все запросы поступают от клиента. Я думаю, что то, что я предложил, будет хорошо работать, если я немного подправлю ограничение скорости. - person Nicholas; 14.12.2010