Как использовать JSONP для решения проблемы XSS?

У меня есть фрагмент javascript, выполняемый на причале, который отправляет XMLHTTPRequest на скокет на другом сервере (сервере 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 в запросе на получение.

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


person shane87    schedule 27.05.2010    source источник
comment
Это не имеет ничего общего с межсайтовым скриптингом (XSS); Другими словами, такого рода проблемы с межсайтовыми операциями не относятся к термину XSS.   -  person Pointy    schedule 27.05.2010
comment
Ах, кажется, я вижу. Между версиями 1.5.2 и 1.6.4 сам jQuery начал удалять пустые параметры. Я не знаю, почему, поэтому я могу в конечном итоге зарегистрировать ошибку.   -  person Pointy    schedule 25.11.2011


Ответы (1)


Техника 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 только к серверам, которым вы доверяете, поскольку они отправляют обратный код для выполнения в вашем клиенте с доступом к любым активным сеансам, которые ваш клиент имеет с другими защищенными сайтами.

редактировать Вот хорошая статья: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/

person Pointy    schedule 27.05.2010
comment
Что касается доступа к любым активным сеансам, которые ваш клиент имеет с другими защищенными сайтами... это правильно? Я думал, что это будет ограничено контекстом страницы, выдавшей запрос, а не другими возможными открытыми сайтами в разных вкладках/окнах/iframe. - person jjmontes; 24.11.2011
comment
Ну, это JavaScript, который импортирован на вашу страницу, и он может делать все то же, что и любой другой JavaScript. Обратите внимание, например, что ваши страницы могут загружать что-то вроде jQuery из Google, и эта копия jQuery имеет столько же возможностей, сколько и jQuery, загруженный с вашего собственного сайта. Но вы правы в том, что все это для каждого окна/вкладки, поэтому код на одной вкладке не виден и не имеет доступа к вашему окну Home Banking (хотя, если он публикуется на сайте Home Banking, браузер будет отправлять любые файлы cookie открытого сеанса и т. д., на что опираются атаки CSRF). - person Pointy; 25.11.2011