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

Я хочу предоставить фрагмент кода 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 оттуда?


person Vegard Larsen    schedule 27.12.2008    source источник


Ответы (3)


Сможет ли 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...

person James    schedule 27.12.2008

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

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

person Joel Martinez    schedule 27.12.2008

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

person Sean Kinsey    schedule 05.07.2009