В качестве примера случай давайте рассмотрим этот адрес: (! CORS не активен на этом сервере) http://api.duckduckgo.com/?q=computer&format=json
Cross Origin совместного использования ресурсов (CORS) и Javascript
Мы можем получить доступ к содержимому из этого URL из любого популярного браузера как обычный URL, браузер не имеет проблем с открытием этого URL-адреса, и сервер не возвращает никаких ошибок.
Язык на стороне сервера, такой как PHP/RoR, может извлекать содержимое из этого URL-адреса без добавления дополнительных заголовков или специальных настроек сервера. Я использовал следующий PHP-код, и он просто работал.
$url='http://api.duckduckgo.com/?q=computer&format=json'; $json = file_get_contents($url); echo $json;
Я только начал работать в 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.
AngularJS использует JQuery, так что я попробовал то же самое в JQuery с помощью следующего кода:
var url="http://api.duckduckgo.com/?q=computer&format=json"; $.getJSON(url , function(data) { console.log(data); });
Это также вызвало ту же ошибку, что и код AngularJS.
Тогда мои дальнейшие исследования привели меня к сути, что на самом деле это не характерно для JQuery и AngularJS. Оба они наследуют эту проблему от Javascript!
- Вот отличный ресурс с объяснением того, что CORS и как справиться с этим: http://enable-cors.org/index.html.
- А также W3C имеет свои официальные спецификации CORS: http://www.w3.org/TR/cors/
Так что мой вопрос не то, что CORS есть. Мой вопрос
Я понимаю, что, является ли это веб-браузер, или это PHP/RoR или это Javascript рамки, все делают запросы на URL с помощью той же HTTP или HTTPS, не так ли? Конечно, да. Тогда почему http должен быть более безопасным, когда запросы поступают из javascript? Как http и сервер знают, что запрос поступает из javascript?
Когда веб-браузер может открыть URL-адрес, а PHP/RoR (или любой серверный язык) может получить доступ к этому URL-адресу без каких-либо дополнительных настроек/заголовков, почему не может AngularJS, JQuery (или в одном слове javascript) получить доступ к этому URL-адресу, если только сервер не установил заголовок
Access-Control-Allow-Origin
для запроса root?Что это за особенность (что PHP/RoR есть и) отсутствует в Javascript, чтобы он не мог получить доступ к одному и тому же URL-адресу в тех же браузерах, которые могут открывать этот URL без каких-либо проблем из своих адресных баров?
Просто отметим, что я в основном разработчик iOS и недавно начал изучать веб-разработку, особенно AngularJS. Поэтому мне интересно, что все это происходит и почему!
«* Тогда почему http должен быть более безопасным, когда запросы поступают из javascript?» «Поскольку запросы Ajax создаются * как * пользователь, с их файлами cookie, включая любые для сеансов и т. Д. Таким образом, вредоносное веб-приложение может сделать запрос Ajax для вашего банковского баланса и выписки и преуспеть, если вы вошли в систему, а перекрестное происхождение по умолчанию было разрешено по умолчанию. –
Одной из возможных причин может быть инъекция скриптов, если вы являетесь стандартным пользователем и переходите на веб-страницу, вы доверяете ** этой ** странице. Если эта страница пытается привлечь другой домен, тогда вам потребуется доверять ей, по умолчанию она отклоняется, а не запрашивает разрешение. (Это мое личное понимание, исправьте меня, если я ошибаюсь). – Nunners
@Nunners. Как пользователь, вы понятия не имеете, разрешено ли домен A разговаривать с доменом B, вы не можете сказать в этом рукопожатии [CORS]. – epascarello