2010-05-27 4 views
3

У меня есть часть javascript, выполняющаяся на сервере причала, который отправляет XMLHTTPRequest в scoket на другом сервере (wamp server). Запрос отправляется в сокет, однако ответ XHR, похоже, блокируется.Как использовать JSONP для решения проблемы XSS?

Я слышал, что могу использовать 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); 

} 

Я знаю, что сокет РНР ПОЛУЧАТЬ пост, как, когда я проверил журнал сервера я получаю 200 по запросу ГЭТ.

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

+0

Это не имеет ничего общего с межсайтовый скриптинг (XSS); Другими словами, такая проблема межсайтовых операций не относится к термину XSS. – Pointy

+0

А - Я думаю, что вижу. Между версиями 1.5.2 и 1.6.4 сам jQuery начал удалять «пустые» параметры вроде этого. Я не знаю, почему, поэтому я могу закончить регистрацию ошибки. – Pointy

ответ

7

Техника 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/

+1

Что касается «с доступом к любым активным сеансам (ами) вашего клиента с другими защищенными сайтами» ... это правильно? Я думал, что это будет ограничено контекстом страницы, которая выдала запрос, а не другими возможными открытыми сайтами в разных вкладках/windows/iframes. – jjmontes

+1

Ну, это JavaScript, который импортируется на вашу страницу, и он может делать все, что может сделать любой другой JavaScript. Обратите внимание, например, что ваши страницы могут загружать что-то вроде jQuery из Google, и эта копия jQuery имеет столько же возможностей, сколько jQuery, загружаемых с вашего собственного сайта.Но вы правы, что все это зависит от каждого окна/вкладки, поэтому код на одной вкладке не имеет видимости или доступа к окну Home Banking (хотя, если он отправляется на сайт Home Banking, браузер ** будет * * отправлять любые открытые файлы cookie и т. д., на что полагаются атаки CSRF). – Pointy

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