IE8 XSS / проблема JQuery

Все работает прекрасное в Firefox и Chrome, но кроме IE8 (8.0.6001.18702)

Это - тестовый код (JQuery 1.4.2) (та же проблема с $ .post):

$(function() {
   $.get("http://domain2.tld/some.php", {}, function(response) {
       alert(response);
   });
});

Этот код выполнен в domain1.tld, и он загружается из domain2.tld, этого пути:


Я добираюсь, "Разрешение отклонило" сообщение в IE8. Я попробовал до сих пор без успеха:

1) добавление в domain1.tld (php код):

header("X-XSS-Protection: 0");

2) отключение XSS просачивается опции IE8.

Я использую отладчик IE8, и он показывает ошибку в строке 5113:

xhr.open(type, s.url, s.async);

Если вместо того, чтобы назвать $ .get (domain2.tld...), я называю $ .get (domain1.tld...) нет никакой ошибки, которая подтверждает мне, что XSS "та же проблема" политики источника.

Мое единственное решение (я думаю), делает его через прокси (php код), но я предпочел бы не делать это, поскольку это влияет на производительность.

Кто-то имеет, знает об альтернативе/устранять этой проблеме?

Примечание: IE8 обновления не является опцией, поскольку я хочу протестировать его без обновлений.

Очень похожая проблема к моему: http://forum.jquery.com/topic/jquery-ui-tabs-ie8-and-injecting-elements-into-dom

7
задан lepe 2 August 2010 в 06:39
поделиться

3 ответа

(я рекомендую проверить список, который я публикую перед этим ответом)

Чтобы облегчить процесс, я взял подключаемый модуль CORS и изменил его. Вам не нужно будет изменять существующий код JQuery, если вы просто используете $ .get и $ .post. Я тестировал его в IE8, и он работает, как ожидалось. Для остальных браузеров будут использоваться обычные вызовы JQuery. Вы даже можете добавить этот код по запросу (с условными тегами). Прочтите первоначальные комментарии для получения дополнительной информации. Надеюсь, это поможет ...

Вот код (сохраните его, например, как jquery.xdomain.js ):

/*
 * XDR (non-XHR) extension functions for IE8+
 * Based in CORS plugin (http://plugins.jquery.com/project/cors)
 * Modified by A.Lepe (www.alepe.com, Aug 2010)
 * 
 * It supports calls using $.get and $.post only.
 * The main difference between the CORS plugin and this one are:
 *
 * 1) This method tries first to use XDR and if not available 
 * will try to use XHR. This is to prevent any alert or 
 * security message from IE.
 *
 * 2) To minimize size and target only IE8+ versions, this method
 * does not provides an alternative fall-back.
 * CORS version uses proxy_xmlhttp.js as fall-back option (see link #1 below).
 *  
 * If you want to support "OLD" browsers, an alternative fall-back 
 * can be easily implemented (instead the error alert).
 * For example, something like:
 *
 * ...
 * } catch(e) {
 *    data["proxy_url"] = url;
 *    $._get(proxy, data, callback, type);
 * }
 * ...
 *
 * in which "proxy" must be a URL where your proxy is located. 
 * Your proxy may look like:
 *
 * <?php
     //GET method example:
     $URL = $_GET["proxy_url"];
     unset($_GET["proxy_url"]);
     $params = http_build_query($_GET);
     echo file_get_contents($URL."?".$params));
 * ?>
 *
 * For POST method you may check link #2.
 *
 * NOTES:
 *
 * $.post() method it might not work as expected. XDR does
 * not send the data to the server in the same way XHR do
 * (am I missing something?). In order to have access to that
 * POST data you will need to:
 *
 * a) set:
 *      always_populate_raw_post_data = On
 *      register_long_arrays = On
 *
 * OR :
 *
 * b) import it manually (see link #3): 
    //-------- Import XDR POST data ---------
    if (isset($GLOBALS["HTTP_RAW_POST_DATA"])) {
        $data = explode('&', $GLOBALS["HTTP_RAW_POST_DATA"]);
        foreach ($data as $val) {
            if (!empty($val)) {
                list($key, $value) = explode('=', $val);
                $_POST[$key] = urldecode($value);
            }
        }
    }
 *
 * Remember to add the respective headers in the server that will
 * allow the XDR calls:
      header('Access-Control-Allow-Origin: *'); //Or http://example.com
      header('Access-Control-Max-Age: 3628800');
      header('Access-Control-Allow-Methods: GET, POST');
 */
(function($) {
$._get = $.get;
$._post = $.post;
$.get = function (url, data, callback, type) {
    // try XDR
    if (jQuery.browser.msie && window.XDomainRequest) {
        var params = '';
        for (var key in data) {
            params += ((params || url.indexOf("?") != -1)?'&':'?')+key+'='+data[key];
        }
        // Use Microsoft XDR
        var xdr = new XDomainRequest();
        xdr.open("GET", url+params);
        xdr.onload = function() {
            callback(this.responseText, 'success');
        };
        xdr.send();
    } else {
        try {
            // Try using jQuery to get data
            $._get(url, data, callback, type);
        } catch(e) {
            alert(e.message);
        }
    }
}
$.post = function (url, data, callback, type) {
    // Try XDR
    if (jQuery.browser.msie && window.XDomainRequest) {
        var params = '';
        for (var key in data) {
            params += (params?'&':'')+key+'='+data[key];
        }
        // Use XDR
        var xdr = new XDomainRequest();
        xdr.open("POST", url);
        xdr.send(params);
        xdr.onload = function() {
            callback(xdr.responseText, 'success');
        };
    } else {
        try {
            // Try using jQuery to POST
            $._post(url, data, callback, type);
        } catch(e) {
            alert(e.message);
        }
    }
}
})(jQuery);

Ссылки:

5
ответ дан 6 December 2019 в 21:08
поделиться

Здесь я вынужден согласиться с jAndy, очень маловероятно, что у вас это вообще работает. Применяется та же политика происхождения (http://en.wikipedia.org/wiki/Same_origin_policy), лучше всего написать локальный прокси, который ваш скрипт будет опрашивать, а затем позволить прокси выполнять междоменные вызовы.

-1
ответ дан 6 December 2019 в 21:08
поделиться

Прошу прощения, если мой английский не идеален, поскольку я вижу, что я недостаточно ясно понял ... Один из моих основных опасений объяснил другой человек здесь: http://forum.jquery.com/topic/cross-domain-ajax-and-ie

Итак, какая альтернатива существует?

1) XDomainRequest

Лично я считаю, что это лучший способ реализовать межсайтовый скриптинг в IE8 + (поскольку он поддерживается изначально). Единственная проблема в том, что это единственный способ Microsoft. Но, как и многие другие вещи с семейством IE, мы можем легко расширить функциональность JQuery ajax.

Согласно документации, вам нужно будет указать некоторые дополнительные заголовки в domain1.tld, , например, в PHP следующим образом:

header("Access-Control-Allow-Origin: http://domain2.tld"); //use * for any

Может быть, следующая альтернатива будет полезна для реализации jquery-реализации XDomainRequest ;

Обновление (a): Существует библиотека XDR (не jquery), которая «заменяет» класс XHR, чтобы сделать его кроссбраузерным, он основан на pmxdr клиентская библиотека . Я еще не пробовал.

2) CORS

Единственная проблема с этим плагином заключается в том, что это не совсем расширение, поскольку его функции называются по-другому, поэтому вам нужно либо изменить свои коды, либо обернуть этот плагин.

Обновление (b): Я изменил подключаемый модуль CORS, чтобы упростить его. Проверьте другой мой ответ, чтобы получить код.

3) JsonP в JQuery

Это должен быть самый простой способ решить мою проблему (поскольку я контролирую оба сервера). Изначально большинство браузеров поддерживают межсайтовые сценарии, только если используется формат json (я считаю, что xml также можно использовать). В этом случае используется функция $ .getJSON (). Чтобы заставить его работать, вам нужно указать (как указано в документации) callback =? в URL-адресе, например:

$.getJSON("http://domain2.tld/index.php?callback=?",funciton(res){ ... }); 

Знак "?" после того, как "обратный вызов" будет заменен идентификатором ... в вашем файле php вам нужно получить этот идентификатор и окружить код Json следующим образом:

print_r($_GET["callback"])."(".json_encode($mydata).");";

(я получил этот пример из здесь )

Проблема с этим методом заключается в том, что если вы хотите получить только HTML, он должен находиться внутри объекта json, что делает процесс немного более сложным и утомительным.

4) плагин jquery.jsonp

Если вам нужны дополнительные проверки и функции для встроенной поддержки JSONP в JQuery, попробуйте этот плагин, который также упростит процесс.

5) xdomainajax

Этот плагин использует интересный подход с использованием службы Yahoo YQL, в которой любая веб-страница (или ее часть) может быть преобразована в Json, что позволяет импортировать ее в javascript. Этот способ хорош для тех ситуаций, в которых нельзя изменить исходный формат.

6) flXHR

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

7) xdajax

Это решение основано на реализации YUI вместе с подходом «Flash».

8) Если ни один из предыдущих вариантов вам не подходит, помните, что вы все равно можете использовать старый трюк с вставкой тега для импорта JS-кода.

9) Снижение безопасности IE до минимума также решает проблему. Но я думаю, что было бы нехорошо иметь такое сообщение: «Пожалуйста, снизьте настройки безопасности, чтобы использовать этот сайт» ... lol

Я надеюсь, что это поможет другим в подобной ситуации.

8
ответ дан 6 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: