Cross-site XMLHttpRequest

Chcę dostarczyć kawałek kodu Javascript, który będzie działał na każdej stronie internetowej, gdzie jest on zawarty, ale zawsze musi uzyskać więcej danych (lub nawet zmodyfikować dane) na serwerze, na którym jest hostowany Javascript. Wiem, że istnieją ograniczenia bezpieczeństwa z oczywistych powodów.

Rozważmy indeks.html hosted on xyz.com zawierające:

<script type="text/javascript" src="http://abc.com/some.js"></script>
/ Align = "left" / js może używać XMLHttpRequest do wysyłania danych do abc.com? innymi słowy, jest abc.com dorozumiane zaufanie bo załadowaliśmy stamtąd Javascript?
Author: Vegard Larsen, 2008-12-27

3 answers

/ Align = "left" / js może używać XMLHttpRequest do wysyłania danych do abc.com? innymi słowy, jest abc.com bezwarunkowo zaufane, ponieważ załadowaliśmy stamtąd Javascript?

Nie, ponieważ skrypt jest załadowany na oddzielną domenę, nie będzie miał dostępu...

Jeśli ufasz źródłu danych, może JSONP byłby lepszym rozwiązaniem. JSONP polega na dynamicznym dodawaniu do strony nowych elementów skryptu z ustawionym SRC do innej domeny, z ustawionym callbackiem jako parametrem w ciąg zapytania. Na przykład:

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');
    }
});

Więc będziesz musiał hostować swój własny skrypt, który mógłby używać PHP / CURL do publikowania na abc.com domeny, a następnie wyświetli odpowiedź w formacie JSONP:

Nie jestem zbyt dobry w PHP, ale może coś takiego:

<?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 . '})";

?>

Więc twój serwer, nad którym masz kontrolę, będzie działał jako medium między Klientem a abc.com, odpowiedź wyślesz do Klienta w formacie JSON, aby mogła być zrozumiała i użyta przez JavaScript...

 18
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-05 08:04:41

Najprostszą opcją dla Ciebie byłoby proxy połączenia przez serwer ładowania javascript. Więc trochę.js wykonałby połączenie z serwerem hostingowym, a ten serwer przesłałby żądanie do abc.com.

Oczywiście, jeśli nie jest to opcja, ponieważ nie kontrolujesz hosta, istnieją pewne opcje, ale wydaje się, że jest to przepełnione trudnościami między przeglądarkami: http://ajaxian.com/archives/how-to-make-xmlhttprequest-calls-to-another-server-in-your-domain

 3
Author: Joel Martinez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-27 14:37:38

Możesz użyć easyXSS . Jego biblioteka, która umożliwia przekazywanie danych i wywoływanie metod w obrębie domeny. Jest to dość łatwe i powinno być w stanie go używać. Istnieje wiele przykładów na code.google.com Strona

 0
Author: Sean Kinsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-05 21:53:01