2014-02-19 4 views
6

В качестве примера случай давайте рассмотрим этот адрес: (! CORS не активен на этом сервере) http://api.duckduckgo.com/?q=computer&format=jsonCross Origin совместного использования ресурсов (CORS) и Javascript

  1. Мы можем получить доступ к содержимому из этого URL из любого популярного браузера как обычный URL, браузер не имеет проблем с открытием этого URL-адреса, и сервер не возвращает никаких ошибок.

  2. Язык на стороне сервера, такой как PHP/RoR, может извлекать содержимое из этого URL-адреса без добавления дополнительных заголовков или специальных настроек сервера. Я использовал следующий PHP-код, и он просто работал.

    $url='http://api.duckduckgo.com/?q=computer&format=json'; 
    $json = file_get_contents($url); 
    echo $json; 
    
  3. Я только начал работать в JavaScript рамки, AngularJS. Я использовал следующий код ...

    delete $http.defaults.headers.common['X-Requested-With']; 
    var url="http://api.duckduckgo.com/?q=computer&format=json"; 
    $http.get(url) 
        .success(function(data) { 
         $scope.results=data; 
         }) 
    

    С выше кодом AngularJS, я получил следующее сообщение об ошибке:

    XMLHttpRequest cannot load http://api.duckduckgo.com/?q=computer&format=json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.

  4. AngularJS использует JQuery, так что я попробовал то же самое в JQuery с помощью следующего кода:

    var url="http://api.duckduckgo.com/?q=computer&format=json"; 
    $.getJSON(url , function(data) { 
        console.log(data); 
    }); 
    

    Это также вызвало ту же ошибку, что и код AngularJS.

  5. Тогда мои дальнейшие исследования привели меня к сути, что на самом деле это не характерно для JQuery и AngularJS. Оба они наследуют эту проблему от Javascript!



Так что мой вопрос не то, что CORS есть. Мой вопрос

  1. Я понимаю, что, является ли это веб-браузер, или это PHP/RoR или это Javascript рамки, все делают запросы на URL с помощью той же HTTP или HTTPS, не так ли? Конечно, да. Тогда почему http должен быть более безопасным, когда запросы поступают из javascript? Как http и сервер знают, что запрос поступает из javascript?

  2. Когда веб-браузер может открыть URL-адрес, а PHP/RoR (или любой серверный язык) может получить доступ к этому URL-адресу без каких-либо дополнительных настроек/заголовков, почему не может AngularJS, JQuery (или в одном слове javascript) получить доступ к этому URL-адресу, если только сервер не установил заголовок Access-Control-Allow-Origin для запроса root?

  3. Что это за особенность (что PHP/RoR есть и) отсутствует в Javascript, чтобы он не мог получить доступ к одному и тому же URL-адресу в тех же браузерах, которые могут открывать этот URL без каких-либо проблем из своих адресных баров?

Просто отметим, что я в основном разработчик iOS и недавно начал изучать веб-разработку, особенно AngularJS. Поэтому мне интересно, что все это происходит и почему!

+7

«* Тогда почему http должен быть более безопасным, когда запросы поступают из javascript?» «Поскольку запросы Ajax создаются * как * пользователь, с их файлами cookie, включая любые для сеансов и т. Д. Таким образом, вредоносное веб-приложение может сделать запрос Ajax для вашего банковского баланса и выписки и преуспеть, если вы вошли в систему, а перекрестное происхождение по умолчанию было разрешено по умолчанию. –

+0

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

+0

@Nunners. Как пользователь, вы понятия не имеете, разрешено ли домен A разговаривать с доменом B, вы не можете сказать в этом рукопожатии [CORS]. – epascarello

ответ

5

Он отключен из javascript из соображений безопасности. Вот один из сценариев:

  • Предположим, что у Facebook есть сообщение «post message on timeline» api, требующее аутентификации пользователя.
  • Вы вошли в Facebook, когда посетили сайт badsite.com.
  • Сайт badsite.com использует javascript для вызова Facebook api. Поскольку браузер делает действительный запрос в Facebook, ваш cookie аутентификации отправляется, и Facebook принимает сообщение и публикует объявление badsite на вашей временной шкале.

Это не проблема с сервера, так как сервер badsite.com не имеет доступа к вашему файлу cookie для проверки подлинности Facebook и не может подделать действительный запрос от вашего имени.

+0

Да, это имеет смысл! – Atif

+0

Итак, зная, что JS имеет доступ к файлам cookie и сеансам на клиентской машине, существуют ли какие-либо другие функции HTTP, кроме CORS, которые были отключены для javascript? Существуют ли другие возможные уязвимости безопасности? – Atif

+1

Не уверен, что вы просите, но есть много возможных уязвимостей безопасности. Посмотрите на [OWASP Top 10] (https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project). –

1

Вы помните, что все запросы javascript обрабатываются браузером. Таким образом, браузер обнаруживает, что запрос кросс-происхождения прост.

Запрос от javascript не имеет никакого отношения к PHP/RoR, он отклоняется браузером.

Код сервера может принимать кросс-начальный запрос javascript по заголовку «Access-Control-Allow-Origin», поскольку до отклонения запроса javascript браузер отправит запрос «ОПЦИИ» на сервер, чтобы спросить заголовок «Access-Control-Allow- Происхождение "в ответ. Если значение соответствует текущему началу, браузер будет принимать запрос javascript и отправлять серверу.

Все браузер являются реализовать эту политику Same Origin Policy

+0

upvote для указания «OPTIONS» и того, как браузер разрешает запрос javascript, спасибо :) – Atif

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

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