Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как привязать код к определенному домену? (https://javascript.ru/forum/misc/55251-kak-privyazat-kod-k-opredelennomu-domenu.html)

VladUA 19.04.2015 21:52

как привязать код к определенному домену?
 
Как привязать код к определенному домену?

Например:
определить домен окна самого верхнего уровня и если этого домена нет в списке разрешенных, то прекратить дальнейшее выполнение кода.

Пробовал сам решить, но утыкался на кросдоменную защиту используя window.top.location.hostname


Может кто-то смог решить данную задачу

Deff 20.04.2015 00:57

VladUA,
1. Сам скрипт в главном окне ? Или непонятно где? может быть и во фрейме ? Тогда может запретить фрейм ?
2. Располагать два скрипта: Перед фреймом, и во фрейме, скрипт перед фреймом тестирует страницу и передаёт данные во фрейм, к примеру в name, если данных нет - фрейм не работает и ссылка фрейма вываливается(открывает вкладку) в главном окне

demoniqus 20.04.2015 08:41

Чтобы определить, исполняется ли скрипт в верхнем окне, надо выполнить проверку window === window.top - так ты узнаешь, что кто-то твою страницу запустил во фрейме. И если при этом ты не можешь простучаться в window.top, то хост чужой - можно тупо затирать свою страницу. А для обхода кроссдоменной безопасности нет универсальных средств - для этого устанавливаются плагины, которые подгружают с разрешения пользователя скрипты глобально (т.е. еще глобальнее, чем window) и позволяют им исполняться на каждой открытой странице.

Deff 21.04.2015 02:14

Цитата:

Сообщение от demoniqus
Чтобы определить, исполняется ли скрипт в верхнем окне, надо выполнить проверку window === window.top

if(this!==top){
, и если хост чужой (тестишь через try..catch) мон запустить как Гугол форму со своей сылкой target="_top" в главное окно

VladUA 21.04.2015 13:52

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

demoniqus
относительно проверки на вложенность в ифрейм:
к сожалению нельзя использовать, т.к. код отдается покупателю и он его может вложить в свою обвертку через ифрейм(ы) ... единственное известно что у покупателя верхний домен будет всегда постоянным, т.е. необходима привязка к домену окна самого верхнего уровня.



нашелся параметр document.referrer, похоже с помощью него можно посмотреть URL первого ифрейма в который вложено главное окно.

начал делать тесты (данные вывожу в консоль)
ТЕСТ 1
главное окно -- http://townden.com/html5/topdomain/v7.html
document.referrer=null << оно и понятно что null



ТЕСТ 2
главное окно в 1-м ифрейме -- http://angry-animals.net/test/top-domain-v7_2.html
<iframe src="http://townden.com/html5/topdomain/v7.html" width="468" height="460">
 </iframe>
document.referrer=http://angry-animals.net/test/top-domain-v7_2.html << уже интересно :)
причем без всяких секюрити запретов :)
но возможно с document.referrer есть какие-то нюансы, пока не знаю




ТЕСТ 3
главное окно в 1-м ифрейме, а 1-й ифрейм во 2-м ифрейме
document.referrer=http://angry-animals.net/test/top-domain-v7_2.html << уже не интересно :(
тестировал в http://jsfiddle.net/ используя такой код
<iframe src="http://angry-animals.net/test/top-domain-v7_2.html" width="468" height="460">
 </iframe>




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

demoniqus 22.04.2015 10:57

Если клиент может обернуть твой скрипт в свои фреймы, тогда просто пройдись до самого верхнего window и сравни их домены с доменом непосредственно того фрейма, в котором запущен твой скрипт (ну и / или со статичным списком допустимых доменов). Примерно так:
var w = window;
var d = window.location.href.match(/^(?:[^:]+:\/\/)?([^\/]+)/)[1];
var permittedList = {'yandex.ru': true, 'mail.ru' : true};//Список разрешенных доменов
permittedList[d] = true;
while ((w = w.parent) != window.top) {
    if (!(w.location.href.match(/^(?:[^:]+:\/\/)?([^\/]+)/)[1] in permittedList)) {
        killScript();//Убей всё, что сможешь
    }
}
w === window.top && 
        !(w.location.href.match(/^(?:[^:]+:\/\/)?([^\/]+)/)[1] in permittedList) &&
        killScript();


Часовой пояс GMT +3, время: 18:02.