Как использовать JSONP для преодоления проблемы XSS? - PullRequest
3 голосов
/ 27 мая 2010

У меня есть фрагмент javascript, выполняющийся на джет-сервере, который отправляет запрос XMLHTTP в scoket на другом сервере (сервер wamp) Запрос отправляется в сокет, однако, похоже, что ответ XHR блокируется.

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

function sendPost(url, postdata, callback) {

xmlHttp=GetXmlHttpObject()

if (xmlHttp==null) {
    alert ("Browser does not support HTTP Request")
    return
} 

xmlHttp.onreadystatechange=callback
xmlHttp.open("POST",url,true)
xmlHttp.send(postdata);

}

function sendInitRQ(width, height) {

var post = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><command     type=\"init\"><width>" + width + "</width><height>" + height + "</height></command>";

sendPost("http://localhost:80/socket.php", post, initReturned);

}

Я знаю, что сокет php получает сообщение, так как когда я проверяю журнал сервера, я получаю 200 на запросе get.

Я просто хочу знать, как я могу использовать подход JSONP? Я видел примеры этого подхода, но я все еще не уверен, как это сделать.

1 Ответ

7 голосов
/ 27 мая 2010

Метод JSONP использует совершенно другой механизм для отправки HTTP-запросов на сервер и обработки ответа. Требуется совместный код на странице клиента и на сервере. Сервер должен иметь URL-адрес, который отвечает на запросы HTTP «GET» с блоком JSON, заключенным в вызов функции. Таким образом, вы не можете просто выполнять транзакции JSONP на любом старом сервере; это должен быть сервер, который явно предоставляет функциональность.

Идея состоит в том, что ваш клиентский код динамически создает блок <script> с атрибутом "src", установленным на URL-адрес сервера JSONP. URL-адрес должен содержать параметр, сообщающий серверу имя функции Javascript, которую вы ожидаете вызвать с данными JSON. (Какое именно имя параметра использовать зависит от сервера; обычно это «обратный вызов», но я видел некоторые, которые используют «jsonp».) Клиент, конечно, должен иметь эту функцию в глобальной области видимости. Другими словами, если у вас есть такая функция, как

function handleJSON(json) {
  var something = json.something;
  // ... whatever ...
}

тогда ваш URL говорит серверу вызвать "handleJSON", и ответ сервера должен выглядеть следующим образом:

handleJSON({"id": 102, "something": { "more": "data", "random": true }});

Таким образом, когда блок <script> загружается из указанного вами URL-адреса "src", браузер интерпретирует содержимое (ответ от сервера) и будет вызываться ваша функция.

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

изменить & mdash; Вот хорошая статья: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/

...