Межсайтовый XMLHttpRequest - PullRequest
       30

Межсайтовый XMLHttpRequest

12 голосов
/ 27 декабря 2008

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

Рассмотрим index.html, размещенный на xyz.com, содержащий следующее:

<script type="text/javascript" src="http://abc.com/some.js"></script>

Сможет ли some.js использовать XMLHttpRequest для публикации данных на abc.com? Другими словами, abc.com неявно доверяют, потому что мы загрузили оттуда Javascript?

Ответы [ 3 ]

18 голосов
/ 27 декабря 2008

Сможет ли some.js использовать XMLHttpRequest для публикации данных на abc.com? Другими словами, abc.com неявно доверяют, потому что мы загрузили оттуда Javascript?

Нет, поскольку скрипт загружен в отдельный домен, он не будет иметь доступа ...

Если вы доверяете источнику данных, возможно, JSONP будет лучшим вариантом. JSONP включает в себя динамическое добавление новых элементов SCRIPT на страницу с SRC, установленным для другого домена, с обратным вызовом, установленным в качестве параметра в строке запроса. Например:

function getJSON(URL,success){
    var ud = 'json'+(Math.random()*100).toString().replace(/\./g,'');
    window[ud]= function(o){
        success&&success(o);
    };
    document.getElementsByTagName('body')[0].appendChild((function(){
        var s = document.createElement('script');
        s.type = 'text/javascript';
        s.src = URL.replace('callback=?','callback='+ud);
        return s;
    })());
}

getJSON('http://YOUR-DOMAIN.com/script.php?dataName=john&dataAge=99&callback=?',function(data){
    var success = data.flag === 'successful';
    if(success) {
        alert('The POST to abc.com WORKED SUCCESSFULLY');
    }
});

Итак, вам нужно разместить свой собственный скрипт, который может использовать PHP / CURL для публикации в домене abc.com, а затем вывести ответ в формате JSONP:

Я не слишком хорош в PHP, но может быть что-то вроде этого:

<?php
    /* Grab the variables */
    $postURL = $_GET['posturl'];
    $postData['name'] = $_GET['dataName'];
    $postData['age'] = $_GET['dataAge'];

    /* Here, POST to abc.com */
    /* MORE INFO: http://uk3.php.net/curl & http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html */

    /* Fake data (just for this example:) */
    $postResponse = 'blahblahblah';
    $postSuccess = TRUE;

    /* Once you've done that, you can output a JSONP response */
    /* Remember JSON format == 'JavaScript Object Notation' - e.g. {'foo':{'bar':'foo'}} */
    echo $_GET['callback'] . '({';
    echo "'flag':' . $postSuccess . ',";
    echo "'response':' . $postResponse . '})";

?>

Итак, ваш сервер, который вы контролируете, будет действовать как посредник между клиентом и abc.com, вы отправите ответ обратно клиенту в формате JSON, чтобы он мог быть понят и использован JavaScript ...

3 голосов
/ 27 декабря 2008

Самый простой вариант для вас - прокси-вызов через сервер, загружающий javascript. Поэтому some.js будет звонить на хост-сервер, и этот сервер перенаправит запрос на abc.com.

Конечно, если это не вариант, потому что вы не управляете хостером, есть несколько вариантов, но, похоже, он запутался в кросс-браузерных трудностях: http://ajaxian.com/archives/how-to-make-xmlhttprequest-calls-to-another-server-in-your-domain

0 голосов
/ 06 июля 2009

Вы можете использовать easyXSS . Это библиотека, которая позволяет передавать данные и вызывать методы через границы домена. Это довольно легко, и вы должны быть в состоянии использовать его. На сайте code.google.com много примеров

...