18 марта 2020 г.
"Ежедневная серия вопросов 🚀"
Автор: Ван Эргоу
Блог:Наггетс,думаю нет,Знай почти,короткая книга,CSDN
Ставьте лайк и смотрите снова, сформируйте привычку, ежедневная серия вопросов будет постоянно обновляться, ваша поддержка - самая большая мотивация для меня продолжать делиться 😘
Та же политика происхождения
Прежде чем говорить о кросс-доменном, необходимо сначала понять концепцию”同源策略“
.
Что такое источник?
Источник = протокол + имя домена + номер порта.
если дваurl
Протокол, имя домена и номер порта точно такие же, тогда эти дваurl
является гомологичным.
мы можем пройтиwindow.origin
илиlocation.origin
Получить текущий источник.
https://wang.com
https://ergou.com
//不同源,域名不一致(记住:只有完全一模一样才算同源)
http://wang.com/index.html
http://wang.com/server.php
//同源
localhost 调用 127.0.1
//不同源
Что такое политика единого происхождения?
политика того же происхождения: страницы из разных источников не имеют доступа к данным друг друга.
Характеристики браузера: еслиJS
запустить на источникеA
, то можно получить только исходникA
данные, не могу получить источникB
data, то есть междоменное использование запрещено.
Предположениеwang.com/index.html
цитируетсяergou.com/1.js
Так что просто скажи1.js
запустить на источникеwang.com
внутри
Обратите внимание, что это иergou.com
хотя это не имеет значения1.js
скачал с него.
так1.js
просто получитьwang.com
данные, это то, что делают браузеры, и браузеры специально разработаны таким образом.
Почему существует политика того же происхождения?
Причина, по которой необходимо использовать политику одного и того же происхождения, заключается в защите конфиденциальности пользователей.
Взяв за пример WeChat, источникhttps://user.weixin.com
, предполагая, что текущий пользователь вошел в систему, иAJAX
просить/friends.json
Вы можете получить список друзей пользователя.
В это время пришел хакер и поставилhttps://user-winxin.com
Поделитесь этим с вами, на самом деле это фишинговый сайт, вы нажимаете на эту страницу, эта страница также запрашивает ваш список друзейhttps://user.weixin.com/friends.json。
Извините, ваш список друзей в это время был украден хакерами?
корень проблемы
Причина, по которой возникает эта проблема, заключается в том, чтоНеспособность отличить отправителя.
в WeChatJS
и хакерскийJS
отправленный запрос мало что меняет(referer
разница)
Но если разработчик в фоновом режиме не проверяетreferer
, то абсолютно никакой разницы.
Поэтому, если нет политики одного и того же происхождения, любая страница может украсть данные в WeChat и даже баланс в Alipay.
принципы безопасности
Некоторые друзья могут спросить, так какreferer
Есть разница, тогда проверяйreferer
Разве это не будет хорошо?
принципы безопасности: Прочность цепи безопасности зависит от самого слабого звена в цепи безопасности.
Кроме того, что, если бэкэнд-разработчик этого веб-сайта идиот?
Поэтому браузеры должны активно предотвращать кражу данных такого рода.
Короче говоря, чтобы защитить конфиденциальность пользователей, браузеры устанавливают строгую политику одного и того же происхождения.
Если браузер не ограничивает междоменный доступ, это должен быть именно этот браузер.bug
.
перекрестный домен
Что такое междоменный домен?
Междоменный, когда браузер пытается выполнить скрипты с других веб-сайтов. Однако из-за ограничения политики одного и того же источника мы не можем добиться междоменного доступа.
Несколько вопросов о междоменном
Зачемa.wang.com
доступwang.com
Также считается междоменным?
Потому что в истории были разные компании, использующие доменные имена,a.wang.com
а такжеwang.com
Не обязательно тот же веб-сайт, браузеры осторожны и считают, что это другой источник.
Почему разные порты считаются перекрестными достоянием?
По той же причине порт не является ситуацией компании, нет.
запомнить: Прочность цепи безопасности зависит от самого слабого звена, и ко всем вопросам, связанным с безопасностью, следует относиться с осторожностью.
почему два сайтаIP
То же самое, тоже считается междоменным?
По той же причине, посколькуIP
также можно поделиться.
Почему его можно использовать в разных доменахCSS
,JS
и фотографии и т.д.?
Политика того же происхождения ограничивает доступ к данным, цитируемCSS
,JS
А когда дело доходит до картинок, мы на самом деле не знаем их содержания, мы просто цитируем.
Перекрестный домен CORS
Что такое КОРС?
CORS
Полное название "Совместное использование ресурсов между источниками"(Совместное использование ресурсов из разных источников). Это позволяет браузеру отправлятьXMLHttpRequest
запрос, тем самым преодолеваяAJAX
Ограничение только для гомологичного использования.
Как понять КОРС?
еслиwang.com
а такжеergou.com
Оба сайта мои, я просто хочуwang.com
посетитьergou.com
Что мне делать с данными в нем?
нужно толькоwang.com
напишите в шапке ответаergou.com
можно получить доступ. ЭтоCORS
.
выполнитьCORS
Ключом к общению является сервер. Пока сервер реализуетCORS
интерфейс, вы можете общаться через происхождение.
две просьбы
CORS
Существует два типа междоменных запросов, один из нихпростой запросДругойсложный запрос.
простой запрос
Простой запрос выполняется, если выполняются следующие условия:
- Метод запроса
HEAD
,POST
илиGET
- Информация заголовка http не превышает следующих полей:
Accept
,Accept-Language
,Content-Language
,Last-Event-ID
,Content-Type
(Ограничено тремя значениями:application/x-www-form-urlencoded
,multipart/form-data
,text/plain
)
Реализация простого запроса заключается в добавленииOrigin
Поле:
GET /cors HTTP/1.1
Origin: http://wang.com
Host: api.ergou.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0
...
Origin
Функция состоит в том, чтобы указать, из какого источника пришел запрос, и серверOrigin
значение, чтобы определить, следует ли принять запрос.
еслиOrigin
Указанный источник не принимается сервером, то есть браузер считает, что заголовок ответа не содержитAccess-Control-Allow-Origin
поле, автоматически выдается ошибка.
Примечание. Ошибку такого типа невозможно идентифицировать по коду состояния, который такжеCORS
Недостаток реализации междоменных запросов.
еслиOrigin
Указанный источник принимается сервером, и сервер возвращает следующий ответ:
Access-Control-Allow-Origin: http://api.ergou.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
-
Access-Control-Allow-Origin
: Это поле обязательно к заполнению. Его значение либо при запросеOrigin
значение поля, либо*
, что означает, что принимаются запросы с любого доменного имени -
Access-Control-Allow-Credentials
: Это поле является необязательным. Его значение является логическим значением, указывающим, разрешать ли отправкуCookie
. по умолчанию,Cookie
не входит вCORS
в запросе. установить какtrue
, указывая, что сервер явно разрешает,Cookie
Можно включить в запрос и отправить на сервер вместе. Это значение такжеможно установить толькоtrue
, если сервер не хочет, чтобы браузер отправлялCookie
, удалите поле. (Примечание: если вы хотите отправитьcookie
, не только сделать вышеуказанные настройки, но иAJAX
установить в запросеwithCredentials
Атрибуты) -
Access-Control-Expose-Headers
: Это поле является необязательным.CORS
при запросе,XMLHttpRequest
объектgetResponseHeader()
Метод может получить только 6 основных полей:Cache-Control
,Content-Language
,Content-Type
,Expires
,Last-Modified
,Pragma
. Если вы хотите получить другие поля, вы должныAccess-Control-Expose-Headers
указано внутри.
сложный запрос
Так называемый сложный запрос, то есть запрос, не отвечающий вышеуказанным условиям, является сложным запросом.
Например, метод запросаPUT
илиDELETE
,илиContent-Type
Тип поляapplication/json
.
Сложный запрос сначала инициирует предварительный запрос, которыйoption
метод, через этот запрос, чтобы узнать, разрешает ли сервер междоменные запросы.
var url = 'http://api.wang.com/cors';
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xhr.setRequestHeader('X-Custom-Header', 'value');
xhr.send();
Приведенный выше запрос является сложным. Когда браузер обнаруживает, что это сложный запрос, он активно отправляет предварительный запрос, чтобы спросить сервер, разрешить ли запрос.
После того, как сервер получает предварительный запрос, он проверяетOrigin
,Access-Control-Request-Method
а такжеAccess-Control-Request-Headers
После подтверждения того, что кросс-оригинальный запрос разрешен, будет сделан соответствующий ответ.
Access-Control-Allow-Origin: http://api.wang.com
Content-Type: text/html; charset=utf-8
Проблемы с CORS
не поддерживаетсяIE8/9
, если вы хотитеIE8/9
использоватьCORS
Необходимо использовать кросс-доменыXDomainRequest
возражать против поддержкиCORS
.
кросс-доменный JSONP
Что такое JSONP?
Когда мы междомены, потому что текущий браузер не поддерживаетCORS
или потому что некоторые условия не поддерживаютсяCORS
, нам нужно использовать другой способ междоменного доступа, поэтому мы запрашиваемJS
файл, этоJS
Файл выполнит обратный вызов, а обратный вызов будет содержать нужные нам данные.
let script = document.createElement('script');
script.src = 'http://www.wang.cn/login?username=wang&callback=callback';
document.body.appendChild(script);
function callback(res) {
console.log(res);
}
Как называется функция обратного вызова?
Имя обратного вызова — это случайное число, которое может быть сгенерировано случайным образом, мы берем это имя какcallback
Параметры передаются фону, фон снова вернет нам эту функцию и выполнит
Междоменные преимущества JSONP
- совместимый
ie
- междоменный
Междоменные недостатки JSONP
- Так как это
script
теги, поэтому не могу прочитатьajax
Так что точный статус, не знаю, что такое код состояния или заголовок ответа, он знает только успех и неудачу. - не поддерживается
post
(потому чтоscript
теги, поэтому поддерживает толькоget
просить)
Напомните себе, что независимо от того, насколько вы устали, не забывайте учиться.Нет короткого пути к успеху, только один шаг за другим. взаимное поощрение!
Если в статье что-то не так, поправьте меня.
Спасибо всем~ 💘