Как я могу предоставить пользователям виджет javascript для безопасного извлечения контента с моего сайта

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

Похоже, что единственный способ защитить наш контент - это проверить, что URL-адрес страницы, на которой размещен наш javascript, совпадает с сайтом, на который подписан. Есть ли другой способ сделать это, учитывая, что мы не знаем клиентские браузеры, которые будут посещать сайты-подписчики?

Лучший способ сделать это - предоставить включаемый файл javascript, который заполняет известный элемент страницы при загрузке страницы? Я думаю об использовании jquery, чтобы включаемый файл сначала вызывал jquery (проверяя, загружен ли он уже, и использует какую-то защиту пространства имен), а затем при загрузке страницы заполняет данный элемент.

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

Звучит ли это как разумный подход? Есть ли еще что-нибудь, что мне следует подумать?

Заранее спасибо,

Майк


person Mike    schedule 16.02.2010    source источник
comment
+1 Добро пожаловать в Stack Overflow, Майк!   -  person Sampson    schedule 16.02.2010
comment
Спасибо, Джонатан, я нашел на сайте несколько отличных советов   -  person Mike    schedule 17.02.2010


Ответы (2)


Похоже, что единственный способ защитить наш контент - это проверить, что URL-адрес страницы, на которой размещен наш javascript, совпадает с сайтом, на который подписан.

А, но в коде на стороне клиента или на стороне сервера?

У них обоих есть свои недостатки. Выполнение этого с помощью серверного кода ненадежно, потому что некоторые браузеры вообще не будут передавать заголовок Referer, и если вы хотите, чтобы кеши не сохраняли копию сценария, предотвращая выполнение проверки Referer, вы должны обслуживать с заголовками nocache или Vary: Referer, которые могут снизить производительность.

С другой стороны, с проверками на стороне клиента в возвращаемом скрипте вы не можете быть уверены, что ваша среда, в которой вы работаете, не была саботирована. Например, если ваш тег сценария включения был таким:

<script src="http://include.example.com/includescript?myid=123"></script>

и ваш серверный сценарий смотрел 123 как идентификатор клиента, использующего домен customersite.foo, он мог бы ответить сценарием:

if (location.host.slice(-16)==='customersite.foo') {
    // main body of script
} else {
    alert('Sorry, this site is not licensed to include content from example.com');
}

Что кажется достаточно простым, за исключением того, что включающий сайт мог заменить String.prototype.slice функцией, которая всегда возвращала customersite.foo. Или другие различные функции, используемые в теле сценария, могут быть подозрительными.

Включение <script> из другого контекста безопасности сокращает оба пути: включающий сайт должен доверять сайту-источнику, чтобы он не сделал ничего плохого в его контексте безопасности, например, украсть пароли конечных пользователей или заменить страницу большой козой; но в равной степени код исходного сайта является только гостем в потенциально злонамеренно настроенном контексте безопасности включающего сайта. Таким образом, между двумя сторонами должна существовать мера доверия, если на одном сайте есть скрипт от другого; проверка домена никогда не будет 100% надежным механизмом безопасности.

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

Вы, конечно, можете добавить элементы таблицы стилей в элемент заголовка документа, но вам понадобится строгое пространство имен, чтобы оно не мешало другим стилям страницы. Вы можете предпочесть использовать встроенные стили для простоты и во избежание вмешательства специфики со стороны основной таблицы стилей страницы.

На самом деле это зависит от того, хотите ли вы, чтобы ваш сгенерированный контент был частью главной страницы (в этом случае вы могли бы предпочесть, чтобы включающий сайт имел дело с тем, какие стили они хотели для него сами), или вы хотите, чтобы он стоял отдельно, не подвергаясь влиянию контекст (в этом случае вам, вероятно, будет лучше поместить свой контент в <iframe> с его собственными стилями).

Я думаю об использовании jquery, чтобы включаемый файл сначала вызывал jquery

Я бы попытался избежать втягивания jQuery на главную страницу. Даже с noconflict есть способы, которыми он может конфликтовать с другими сценариями, которые не ожидают его присутствия, особенно со сложными сценариями, такими как другие фреймворки. Запуск двух фреймворков на одной странице - это рецепт странных ошибок.

(С другой стороны, если вы выбрали путь <iframe>, у вас будет собственный контекст сценария, с которым можно поиграть, так что проблем там не возникнет.)

person bobince    schedule 16.02.2010
comment
Спасибо за информацию, которая дала мне много поводов для размышлений и прояснила несколько вещей. - person Mike; 17.02.2010
comment
@bobince Может ли включающий сайт заменить функцию location.host, а также String.slice? - person Murat Derya Özen; 25.12.2011
comment
@Murat: да, хотя есть некоторые особенности браузера, связанные с тем, что именно вы можете делать с location. В IE вы можете заменить весь объект location. В Firefox вы можете Object.defineProperty заменить свойство существующего location объекта. - person bobince; 25.12.2011
comment
@bobince Тогда это означает, что нет способа предоставить 100% безопасный виджет, поскольку возможно, что заголовок Referer может отсутствовать / подделан и / или функции javascript могут быть переопределены злонамеренным образом. Что может сделать провайдер виджета, если он не доверяет всем сайтам, использующим виджет? И после этого мне просто интересно, будет ли вам интересно этот вопрос. :) - person Murat Derya Özen; 25.12.2011
comment
@Murat: правильно, 100% нет. Однако простейший подход, состоящий только в регистрации рефереров (без попытки взломать кеш), часто бывает «достаточно хорош»: если у вас есть сайт, использующий скрипт без авторизации, есть вероятность, что у оператора сайта будут пользователи, у которых нет файл в кеше и кто не блокирует / подделывает Referer. Если вы видите непропорционально большое количество обращений с плохим Referer от конкретного лицензиата, это может быть основанием для расследования и потенциального отзыва их ключа API. - person bobince; 25.12.2011
comment
@bobince - Спасибо, bobince, ваши комментарии помогли. Я хотел бы отметить ваш ответ как принятый, если вы можете просто скопировать и вставить соответствующие части своего ответа (вместе с этими комментариями) в мой вопрос, потому что ваш ответ до сих пор дал мне самое глубокое понимание. - person Murat Derya Özen; 25.12.2011

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

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

По теме:

  1. Как загрузить файлы CSS с помощью Javascript?
  2. проверьте, загружен ли jquery, а затем загрузите его если ложь
person Sampson    schedule 16.02.2010
comment
+1. В качестве побочного примечания, я всегда был бы осторожен при загрузке скрипта на мою страницу со стороннего сайта, особенно если он не превышает https. Помимо того, что он не заинтересован в предоставлении доступа третьей стороне к DOM моей страницы, он открывает возможности для потенциальных атак MITM. Большинство поставщиков виджетов должны использовать фреймы, чтобы обеспечить безопасность всем участвующим сторонам. Iframes могут быть прозрачными, и вы даже можете предложить параметр get, который указывает расположение файла css. - person Andy E; 16.02.2010