2011-02-07 3 views
0

http://www.diigo.com/tools/diigoletКаким образом букмекеры diigolet обходят межсайтовый скриптинг?

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

Кто-нибудь знает, как обойти это, как диголет?

ответ

2

По существу, они , введя тег скрипта URL-адресом другого домена, а не используя XMLHttpRequest. Обратите внимание, что это отличается от обычного запроса JSON в том, что JSON, завернутый в функции обратного вызова, например:

myCallbackFunction(<JSON here>); 

(Это работает, потому что JSON является подмножеством объекта буквального обозначения в JavaScript.)

В их случае они жестко задают имя функции обратного вызова как diigolet.callback, но существует спецификация под названием JSONP, которая поддерживает библиотеки JavaScript such as jQuery.

В соответствии со спецификацией JSONP имя функции обратного вызова передается на сервер через параметр callback=myCallbackFunction в запросе GET. Ваш серверный код должен соответствующим образом обрабатывать его, чтобы иметь возможность обрабатывать запросы JSONP из jQuery.

+0

Они определенно используют инъекцию скрипта. Этот ответ был бы лучше, если бы вы показали, используется ли JSONP, более конкретная техника. –

+1

@Matthew: Вы правы - они жестко задают имя своей функции обратного вызова. К сожалению, я не могу легко показать конкретные строки кода, потому что он минимизирован. Я полагаю, вы могли бы получить некоторое представление о том, как это работает, глядя на панель Firebug Net или Tamper Data. – PleaseStand

+0

Кому-то, кому интересно, ваш сервер должен вернуть обратный вызов в этом формате: если он передан, «callback = callBackThisFunction», тогда серверу нужно вернуть «callBackThisFunction (JSON HERE)». В Django это будет: return HttpResponse (request.GET ["callback"] + '(' + simplejson.dumps (jsonstring) + ')'). Предполагается, что вы используете команду JSON.ajax() и задаете dataType = "JSONP". ПРИМЕЧАНИЕ: request.GET ['callback'] в этом примере будет равен «callBackThisFunction». – Yoshi9143

Смежные вопросы