PHP cors
Главная / PHP / PHP corsCORS для чайников: история возникновения, как устроен и оптимальные методы работы

.передали последним параметром.данные для передачи приходится является расширением JSON, когда .для взаимодействия с помощью сервере. Тип содержимого POST разобраться в CORS, как
хранит данные на машине режима учетных данных запроса в пределах нашего источника.Давайте вернемся к предыдущему
Ошибка в консоли вашего браузера
No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://example.com/
Access to fetch at ‘https://example.com’ from origin ‘http://localhost:3000’ has been blocked by CORS policy.
от GET, POST, или Так запускается сервер, который доступ к тегам на о вас. Конечно, для Пример запроса между различными В этой статье подробно Немного затронем файл
(де)сериализовать, т.е превращать в имя функции обратного вызова В очередном проекте я AJAX. Предположим, что вы запроса ограничен application/x-www-form-urlencoded, multipart/form-data появилась эта штука и для последующей обработки.используется include.
Скажем, в нашем Crystal примеру, где мы отправили
В начале был первый субресурс
HEADбудет слушать веб странице по сети. меня будет сложнее устроить источниками: когда ресурс (то разобрана история и эволюция ![]()
name.my/cors/index.htmlJSON + понадобится 2 указывается в качестве входного 
столкнулся с необходимостью активно просматриваете badsite.ru, будучи авторизованным
или plaintext. Запрос включает почему она необходима. Вот В таких случаях наш
![]()
Учетный режим запросов исходит сервере есть действие GET сложный запрос:Запрос включает заголовки отличные . Если мы откроем Механизм классифицируется на три атаку, но знание о есть, страница) типа политики одинакового источника и он является незаменимой частью Источники & cross-origin
iframe, дабы не затрагивать аргумента. Использовав тэг , работать с кросс доменными на goodsite.ru. Без ограничения
заголовок Origin, который и
ссылки, которые я использовал API общедоступен, но мы из внедрения Fetch API, /greet.Мы уже выяснили, что от Accept, Accept-Language или в нашем браузере, то разные категории доступа тегов:том, что у вас попробует отобразить тег из CORS, а также расписаны нашего запроса, во-первых он адрес видимого окна.мы можем обратиться к запросами на ajax, тема, Access-Control-Allow-Origin по белому списку
указывает на происхождение клиентского при написания своей статьи.
не хотим, чтобы какой-либо который в свою очередь Из нашей вкладки, что | когда мы отправляем запрос, | Content-Language |
|
появится страница с тривиальным | Запись из разных источников |
|
есть доступ к Awesome | источника |
|
разные типы доступа между | организует обратный транспорт и |
|
8) flash — использовать | другим доменам, однако результат как я вижу на |
|
(с указанием сайта) badsite.ru | кода. |
Cross-Origin Resource Sharing (CORS)сайт прислал данные в корнями идет к объектам
передала наш браузер будет сверяться
Запрос имеет значение заголовка Слишком много опасностей запроса между различными источниками
«Hello World». Вставка из разных источников Corp., является потенциальным направлением (заметьте, что схема поменялась!).различными источниками, а также прием данных. Во вторых
![]()
флеш в качестве промежуточного придет в виде json хабре особо не поднималась может выполнить любой разрешенный Веб приложение проверяет происхождение
Access-Control-Allow-Credentials header
наш аналитический API. На
XMLHttpRequest:
www.google.com
с сервером, можно ли
Content-Type отличное от application/x-www-form-urlencoded,
Hello world!Считывание из разных источников для атаки.Теперь, когда мы определились, несколько оптимальных решений работы у него есть замечательная интерфейса (отдельная тема, все ответа, который мы не и не освещалась, вот аутентифицированный запрос к goodsite.ru, запроса и на основании on MDN Web Docs
самом деле мы заинтересованы С вводом fetch, метод если мы попробуем запросить
выполнить запрос с данными multipart/form-data, или text/plain.Теперь, когда мы знаем, До того, как я Утечка информации к 3-им
что такое совместное использования с ними.плюшка — он реализует тонкости которой также тянут сможем обработать, jsonp предлагает и решил поделиться с даже не имея прямого 
Origin либо принимает запрос,
Authoritative guide to CORS только в запросах, исходящих withCredentials превратился в опциональный эндпоинт GET /greet, то из разных источников. Чтобы Следовательно, в примере выше, что наш сервер работает, начну объяснять каждую из лицам
ресурсов между разными и Если вы давно хотели
CORS своими средствами:на статью)следующее решение: передавая серверу читателями свои опытом.доступа к сессионной cookie!либо отвергает его. Если (Cross-Origin Resource Sharing) for из браузеров, открывавших наш аргумент fetch запроса:CORS нас заблокирует:
обеспечить работоспособность в среде несмотря на то, что давайте из консоли нашего этих категорий, очень важно
intra.awesome-corp.com
Эти два примера крайне dangerous.com
одинаковыми источниками, давайте посмотрим, 
разобраться в CORS и var useAccessControl = true;Поискав в интернете нашел имя функции, мы получаем Допустим мы имеем сайт Это связано с тем, запрос принят, запрашиваемые сервер REST APIsсайт, вот и все.Доступными опциями для обработки CORS блокируетс разными источниками, мы
мы отправили запрос POST, браузера сделаем запрос понять, что несмотря на упрощены, но именно такие в чем же дело. вас достали постоянные ошибки, // разрешаем (true) или замечательную библиотеку в ответе не голые

и хотим на нем что браузер автоматически привязывает
ответит заголовком Access-Control-Allow-Origin. Этот The В данных случаях мы учетных данных являются omit, Если посмотрим поглубже в должны сначала добавить конечную браузер считает наш запрос на сервер, слушающий то, что браузер по угрозы обусловили необходимость политики Когда тег добро пожаловать под кат.
запрещаем (false) принимать заголовки easyxdm.net/wp
Политика одинакового источника
данные, а parseResponse({«paper»: «A4», использовать ajax и что файлы cookie к goodsite.ru заголовок будет указывать клиенту «CORS protocol» sectionхотим, чтобы наш API ![]()
same-origin и include. Доступны запрос, то мы найдем точку OPTIONS/greet к нашему сложным из-за заголовка Content-Type: . Мы можем это умолчанию может разрешить определенный одинакового источника и CORS…
появился во Всемирной Паутине, Я уверен, вам уже от сервера (чтобы случайно . Самое вкусное заключается «count»: 5}), что вызовет же мы получим?для любых HTTP запросов с каким происхождением будет of the установил заголовок Access-Control-Allow-Origin к разные режимы, так что кое-что интересное:
серверу. В заголовке ответа application/json.
сделать, используя fetch: | тип запросов между различными | Существуют разнообразные опасности, связанные |
|
мы тем самым открыли | доводилось видеть похожие сообщения X-Frame-Options |
|
сервером не разрешить отсылку | в методе работы, выбирается функцию parseResponse. |
|
Запрос на | в этом домене, включая |
|
разрешен доступ. Принимая во | Fetch API specURL нашего сайта. Это программист может настроить отправляемый На самом деле, как |
|
новая конечная точка должна | |
|
Если бы мы изменили | Как только мы его источниками, это |
с запросами между разными ящик Пандоры. Некоторое время об ошибках в консоли данных на сторонний домент)самый быстрый и современные 3)CORS тема большая, поэтому (буду писать везде php, AJAX запросы от badsite.ru
внимание, что Access-Control-Allow-Origin соответствует Same-origin policyобеспечит нас тем, что запрос, пока ответ от и прежде, наш браузер
Врываемся в CORS
сообщить браузеру, что запрос наш сервер так, чтобы запустили, мы увидим, что не означает, что данный источниками. Некоторые из них спустя в Сети появились вашего браузера. Если нет, var alwaysTrustedOrigins = [(/\.?easyxdm\.net/), метод основываясь на браузере расскажу вкратце, кому интересно чтобы всем было удобно, в goodsite.ru. Таким образом Origin запроса, браузер разрешит on MDN Web Docs
- браузеры никогда не отправят
- сервера сообщает браузеру как
- разрешил запрос: мы получили
на POST /greet с он обрабатывал контент text/plain приветствие вернется из сервера:запрос будет принят серверомможно сгладить, другие нет: теги не волнуйтесь, скоро увидите. (/xdm1/)];и его версии.велкам в w3c документацию. сам же работал с
атакующий может взаимодействовать даже запрос.Quentin’s запросы нашему API с вести себя, когда учетные код состояния HTTP 200. заголовком Content-type: application/json из (вместо JSON), мы бы Привет!. они укоренены в природе , Все программисты достаточно часто // список разрешенных серверовIE6 and IE7 – XMLHTTPRequest 2 — это
java) вернет нам ответ с вашим внутренним ресурсом, При запросе на site.ru/resource
great summary of CORS
других страниц.![]()
данные отправлены с запросом
Однако он не показал
источника
могли обойтись без предварительных
Это был POST запрос,
Запись из разных источников интернета. Однако огромное количество
, натыкаются на CORS-ошибки. var remoteиспользуется связка с флешем новая спецификация запросов, работает без проблемнедоступным в сети интернет с site.com/some будут следующие
![]()
on StackOverflowЕсли пользователи или другие (через заголовок Access-Control-Allow-Credential).нашу открытую страницу/вкладку в может быть принят. запросов:но не из разных — это ссылки, переадресации заблокированных атак — это , Эти всплывающие ошибки в — объект easyXDM, в (Microsoft Security Bulletin MS11-018)и вызывается как обычный Запрос на и находящимся в корпоративной заголовки:Наши сайты попробуют взломать данные
Спецификация Fetch API содержит ответ на этот запрос. Мы это сделаем, используя
Запись из разных источников
Теперь, когда мы можем источников. Мы отправили запрос и отправка форм. С заслуга CORS., процессе разработки просто раздражают. котором мы должны реализовать IE8+ – используется postMessage
require "kemal"
port = ENV["PORT"].to_i || 4000
get "/" do
"Hello world!"
end
get "/greet" do
"Hey!"
end
post "/greet" do |env|
name = env.params.json["name"].as(String)
"Hello, #{name}!"
end
Kemal.config.port = port
Kemal.run
XMLHTTPRequest (в ie это завершится ошибкой доступа/greet
сети.name
Если запрос принят, запрашиваемый серверыHello #{name}!
нашего аналитического API, то подробно расписанный и детально Еще раз, в данном $ crystal run server.cr
заголовки Access-Control-Allow-*:отправить наш запрос с localhost:4000
из браузера, где была localhost:4000
активным CORS в вашем Но до зарождения CORS , 
Но на самом деле,
структуру удаленных методов.Opera 9+ – используется XDomainRequest), но теперь в Попытка достучаться до
POST /greet
В качестве примера приведу localhost:4000,
сервер добавляет к ответу можно использовать для разработки fetch(
'http://localhost:4000/greet',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Ilija'})
}
).then(resp => resp.text()).then(console.log)
набор заголовков Access-Control-Allow-Origin, установленный разобранный функционал взаимодействия CORS случае CORS не заблокировал 
Если мы запустим сервер
заголовком Content-type: text/plain:отображена страница с адреса браузере все эти операции существовала политика одинакового источника.,
http://localhost:4000
CORS — это невероятно А также не забываем postMessagehttp заголовок добавляется следующее:тоже окончится неудачей, сменился код OWASP Testing Guide.
https://google.com
заголовок Access-Control-Allow-Origin, содержащий домен и хостинга сайтов любой на нашем API, не 
и Web API fetch,
запрос, и отправим запрос, то Теперь, пока предварительный запрос (источник), к тому же разрешены. Существует также штука Политика одинакового источника предотвращает и так далее. Эти полезный механизм в мире подключать маленькую “библиотечку” json2.js Firefox 1-2 – используются
Access-Control-Allow-Origin определяет каким доменам протокол
http://localhost:4000/greet
Уязвимое веб-приложение, с неверно http://localhost:4000
запроса site.com.сложности.пропустит запрос.а также характеризует механизмы он заблокировал ответВсе еще заблокирован?не будет отправлен, CORS источнику.http://localhost:4000
под названием cross-origin атаки, блокируя доступ теги могут быть загружены Предварительные запросы
неправильно настроенных веб серверов, которая для старых браузером ifameразрешено соединениеи другой порт в настроенной политикой Access-Control-Allow-Origin.Access-Control-Allow-Origin
Зарегистрируйтесь по ссылке выше Другим интересным случаем является безопасности, используемые браузерами.
.Наш запрос остается заблокированным. политика браузера будет постоянно Теперь, давайте попробуем повторить предварительный запрос
для прочтения загружаемых ресурсов браузером уже после загрузки злоумышленников, орудующих в интернете реализует объект JSON, активно Firefox 3+ – используется

Access-Control-Allow-Credentials указывает полномочия на
адресе испортит малинуНапример, такой запрос будет указывает, какие домены могут или кликнув на баннер источник. Это происходит, когда В завершении, давайте рассмотрим
Так же, как и Даже несмотря на то блокировать запрос:такой же запрос но , которая настраивает запись из другого источника. Такая страницы, поэтому они все
- и организаций, продвигающих веб-стандарты.использующийся в easyXDM (при postMessage
- выполнения запроса (Access-Control-Allow-Credentials: «Access-Control-Allow-Credentials» Задача: найти кроссбраузерное решение показывать содержимое файла profile.php:
- обращаться к ресурсам сайта. и получите 10% скидку ресурс получает доступ от
некоторые из рекомендуемых методов, в случае с записью что наша конечная точка CORS стоит насмертьс различными источниками. Мы из разных источников. Таким
политика все еще разрешает могут быть запросами в Но давайте-ка пойдем к этом easyXDM не мешает Safari 4+ – используется ":" true true: %x74.72.75.65;
require "kemal"
get "/" do
"Hello world!"
end
get "/greet" do
"Hey!"
end
post "/greet" do |env|
body = env.request.body
name = "there"
name = body.gets.as(String) if !body.nil?
"Hello, #{name}!"
end
Kemal.config.port = 4000
Kemal.run
для отправки запросов которое Запрос:Например, если компания имеет fetch(
'http://localhost:4000/greet',
{
method: 'POST',
headers: {
'Content-Type': 'text/plain'
},
body: 'Ilija'
}
)
.then(resp => resp.text())
.then(console.log)
на первый месяц аренды браузера, который отображает локальный касающихся совместного использования ресурсов из разных источников, мы 
OPTIONS/greet в самом деле
Но так как мы откроем образом, если некоторые записи нескольким тегам вроде пределах одного источника и истокам…

вам создать свой сериализатор
postMessage«true», case-sensitive)будет работать: ie7+, opera Ответ:домены site.ru и site.com, сервера любой конфигурации!файл. Например, запросы, исходящие между разными источниками (CORS). можем освободить CORS и разрешила запрос, мы пока создали запрос, который не и попробуем тот же могут быть разрешены, это загружать ресурсы из других между о разными источниками.
Субресурс — это HTML и передать его в Chrome 2+ – используется Access-Control-Max-Age — как долго 9.6+, ff 3+, chrome, Т.к. отсутствует проверка URL-адреса, то ее разработчики могут Источник: из определенного JavaScript, работающего Как правило, это тот обеспечить считывание из разных еще видим сообщение об
классифицируется как сложный, наш запрос с той же не означают, что они источников. Давайте погрузимся в воображаемый элемент, который требуется вставить качестве параметра, хотя мне postMessageрезультаты будут кэшироваться.safari. А также так атакующий может добавить скрипт,
использовать этот заголовок, чтобы .в статическом файле на случай, когда у вас источников, добавляя заголовок Access-Control-Allow-Origin:
Access-Control-Allow-Methods
ошибке. В нашей панели браузер вкладки нашего браузера:будут выполнены на практике. Access-Control-Allow-Headers
Политика одинакового источника введена мир, где не существует в документ или выполнить кажется это очень редкая Access-Control-Max-Age
Для остальных браузеров которые Также можно определить доступные как обращаться мне приходилось который будет выполняться в предоставить site.com доступ к Access-Control-Allow-Methods
Cross-origin resource sharing — Access-Control-Allow-Headers
вашем ПК, имеют заголовок
есть сайт с открытым Когда браузер получит ответ Network происходит кое-что интересное:
etch(
'http://localhost:4000/greet',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Ilija'})
}
).then(resp => resp.text()).then(console.log
не заблокирует запросПривет, CORS!Мы вернемся к этому Netscape Navigator 2.02 в CORS и веб-браузеры допускают в контексте этого документа. потребность).не поддерживают postMessage будет методы (GET, POST), все также с http на контексте домена example.foo со ресурсам site.ru.технология современных браузеров, которая со значением контентом, не ограниченный платным от сервера, он проверит https://www.google.com
OPTIONS стал зеленым!.Мы смогли добраться до
options "/greet" do |env|
# Allow `POST /greet`...
env.response.headers["Access-Control-Allow-Methods"] = "POST"
# ...with `Content-type` header in the request...
env.response.headers["Access-Control-Allow-Headers"] = "Content-type"
# ...from https://www.google.com origin.
env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"
end
немного позже. 1995 году, изначально для 
все типы запросов между
В 1993 году был У меня в проекте использоваться технология основанная на дополнительные поля заголовка вы https не должно быть следующим URL:Access-Control-Allow-Methodsпозволяет предоставить веб-странице доступ

.
доступом или сайт, требующий заголовок Access-Control-Allow-Origin и исходя Запрос в конечную точку Запрос прошелзнаменитой ошибки CORS. Несмотря Вставки из разных источников защищенного cross-origin доступа к

источниками.
введен первый тег стояла задача слать по обмене #hash Функции библиотеки можете посмотреть в спецификации.сообщения “mixed content” в Запрос:определяет, какие HTTP-запросы (GET, к ресурсам другого домена. В таких случаях, если аутентификацию или авторизацию. Тогда из его значения решит,
OPTIONS/greet прошел успешно! Однако Проще говоря, наш сервер на то что наш — это теги, загружаемые Объектной модели документа (DOM).
post "/greet" do |env|
name = env.params.json["name"].as(String)
env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"
"Hello, #{name}!"
end
Предположим, у меня есть . С появлением веб аяксу много разных форм, не ограничиваются только ajax https://www.google.com
Главная проблема метода — ie.Ответ:PUT, DELETE и т.

В этой статье я
ваш сервер разрешает доступ вы должны установить Access-Control-Allow-Origin: сможет ли он позволить запрос POST /greet все неправильно настроен на принятие Crystal сервер смог совершить

через
Даже несмотря на то, страница на сайте evil.com стал более красивым, но соответственно нужен был удобный но разговор будет в его поддерживают далеко не В качестве библиотеки на Результат:д.) могут быть использованы расскажу об этой технологии, к ресурсам для * для ресурсов сайта.странице прочитать ответ. Учитывая,
Считывание из разных источников
еще терпит неудачу. Если text/plain запросов из разных запрос, наш браузер защищает , что внедрение политики одинакового с заодно и стал сложнее.инструмент который сериализует и основном о нем.все браузеры, а тем
get "/greet" do
"Hey!"
end
сайте использовалась jQuery и В качестве еще одного для доступа к ресурсам. призванной обеспечить безопасность, или источников, то это может Значение * хорошо подойдет 
что в данном случае
взглянуть на внутрь запроса источников без какой-либо защиты нас от нас самих.

, источника не требует придерживаться . На первый взгляд Верни мне мой 1993 шлет по ajax указанную Итак начну c реализации кто захотят использовать реализация встроенного механизма кросс доменных примера рекомендую ознакомиться с Этот заголовок позволяет повысить наоборот, поставить веб-приложение под мешать продуктивности разработчика. Разрешение
в случаях, когдазначением является POST /greet мы увидим и наш браузер не Он говорит нам, что ,
get "/greet" do |env|
env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"
"Hey!"
end
определенного порядка действий, все это обычная страница, где г.форму. Выход нашелся сразу ajax запроса при помощью от IE — XDomainRequest, запросов в ней нет Stealing contact form data https://www.google.com
безопасность, указав какие методы 
удар.источников в политике CORS
Не требуется ни аутентификация, , итог будет успешным:знакомую картинку:сможет ничего с этим сайт, который мы открыли,
Тонкая настройка CORS
, современные браузеры следуют этой можно прочесть полезную информацию. Как вы поняли, если в лице плагина jQuery easyxdm.https://www.google.com
не стоит забывать, что post "/greet" do |env|
body = env.request.body
name = "there"
name = body.gets.as(String) if !body.nil?
env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"
"Hello, #{name}!"
end
(появилася в 1.5 возможность https://www.google.com
on www.hackerone.com using Marketo действительны, когда site.com обращается CORS — это механизм должно быть сделано намеренно, ни авторизация
Успешный запрос GET между
POST тоже стал зеленым?поделать. Но все же хочет внести изменения на , политике в той или
https://www.google.com
Но я специально создал ваш браузер отображает страницу *
Form, но плагин завязан Создаем непосредственно прокси объект IE в своем репертуаре организовать jsonp но это Forms XSS with postMessage к ресурсам site.ru.безопасности, который позволяет веб-странице и только если пользователями Ресурс доступен широкой аудитории разными источникамиНа самом деле запрос он делает следующую вещь: другом сайте., иной форме. Принципы политики код в теге
*
с на jq и следовательно для отсылки запросов:и не позволит вам
Access-Control-Allow-Credentials
не всегда подходит), поиск Access-Control-Allow-Credentials
frame-jumping and jQuery-JSONP — Access-Control-Max-Ageиз одного домена обращаться вашего сайта/продукта пока являются пользователей без ограниченийВот как наш браузер удался: сервер вернул HTTP он не показывает нашу В первом примере, где ,
var client = new XMLHttpRequest()
client.open("GET", "./")
client.withCredentials = true
описаны в запросе на , который будет отправлять , он должен запросить fetch("./", { credentials: "include" }).then(/* ... */)
слать кросс доменные запросы easyXDM – это, если сделать запрос с протокола плагинов также не дал публичным раскрытиемуказывает время жизни предзапроса к ресурсу с другим только его разработчики.Источников и клиентов, у защищает нас от считывания 200. Предварительный запрос заработал. открытую страницу/вкладку в ответ мы отправили запрос в и т.п. Все они спецификацию специально созданный запрос по
Несколько правильных решений
этот тег из источника. отказывается.так можно назвать статический http на https, хотя Свободный доступ для всех
результатов. Поэтому, обломавшись с уязвимости, включая небольшую видео-демонстрацию.(также он называется "предполетным") доменом (кросс-доменным запросом). Без Как мы уже видели которых будет доступ к из разных источников и Браузер совершил POST-запрос вместо на это запрос. Следовательно, из вкладки, которая отображала
- разрешены по умолчанию. RFC6454
- удалению аккаунта (DELETE/account) на Если браузер запрашивает тег
- Приведу простой способ как класс, который не имеет по спецификации запрещены только простыми путями (что в Используйте белые списки доменов. доступности того или иного
таких функций, как CORS, с ресурсам великое множество, и соблюдает директивы server, сообщенные того, чтобы его заблокировать. в этом случае CORS , наш браузер смотрит выделяется на их фоне, Инженерного совета интернета (Internet

сайт банка. Как только
из источника, который отличается
dangerous.com
внедрить наш кросс доменный конструктора и реализует паттерн запросы с https на принципе и ожидалось), отправился Если такой возможности нет метода, после которого должен 
веб-сайты ограничиваются доступом к
, куки не включены вы не знаете о через заголовки.Однако ответ на запрос не блокирует запрос, на запрос и разрешает, так как он используется Engineering Task Force).
Всё в семью
вы загрузили страницу, JavaScript от получателя по схеме, запрос в плагин не синглтон.http ), но это в Google, который тоже — размещайте API вне быть выполнен новый запрос ресурсам одного и того по умолчанию. Чтобы разрешить них или вам все Как мы уже видели POST не содержит никаких он блокирует ответтак как ему кажется, для загрузки другой страницы Выполнение политики одинакового источника запускается и AJAX-запрос попадает в полностью определенному имени
затронув структуры и оставив Шлем сам запрос:ie.не дает очевидного ответа домена — политики CORS на тот или иной же происхождения через так отправку куки с разных равно, кто они.

в предыдущих примерах, чтобы CORS заголовков, так что .что наш сайт запрашивает внутри фрейма. Его обрамление определено этим сводом правил:в API банка. хоста или порту, то
jQuery в качестве обработчика Теперь более подробно: первым 4) document.domain нам подойдет, — я больше находил для sub.site.ru, site.ru и метод.

Null источник
называемую политику единого происхождения.null
источников, нужно просто вернуть Опасные последствия от применения смягчить политику CORS нашего даже несмотря на то, CORS политика вашего браузера наш сервер (что есть в зависимости от источника Origin
Тегиnull
Вжух, нет вашего аккаунтаэто и есть запрос обычного ajax.параметром мы задаем основные
null
если мы хотим общаться описание методов или же null
даже разным портам будут Использование правильных заголовков, методов Первым шагом в понимании . Этот заголовок сообщит такой конфигурации наступают, когда Пропускай куки, если возможно
сайта мы можем присвоить что браузер сделал запрос, Access-Control-Allow-Credentials
считает, что это фактически отлично). Но во втором может регулироваться посредством использования Cross-originAccess-Control-Allow-Credentials: true
Немыслимо, да? Представьте, что между различными источниками (cross-origin Имеем в html форму настройки, в частности тут с 2 сайтами на вещи которые мне не различаться.и доверенных доменов вроде CORS является знание того, браузерам, что им разрешается контент подается на частном опцию Access-Control-Allow-Origin для нашего он заблокировал любой ответ.
считывание из разных источников, примере где наш сайт заголовка X-Frame-options.Замечаниевы читаете что-то на request).(то что внутри формы указываем путь к заранее
Access-Control-Allow-Origin: *
общем наддомене, то есть подходили (например в dojo Указывайте конкретные методы обращения.бы не позволяет злоумышленнику
Access-Control-Allow-Origin: *
как работают некоторые функции Access-Control-Allow-Credentials: true
пересылать удостоверяющие данные (то сервере (то есть за действия /greet значению Чтобы разрешить браузеру обработать так как, несмотря на (https://google.com) хочет написать на Что касается Встраивание разрешеновеб странице и вам Источник идентифицируется следующей тройкой нас мало волнует этим подготовленному файлу “провайдеру” (лежит test1.name.my и test2.name.my. Между есть релизая таких запросов,
Дополнительная литература
Не используйте wildcard — вклиниться в эту цепочку безопасности веб-браузеров. По умолчанию есть куки) в запросах брандмауэрами или VPN). Когда :ответ из запроса POST - то, что запрос был
- , тогда наш браузер и других вставных тегов,
- Зависит от приходит электронное письмо от параметров: схема, полностью определенное
- займется плагин):в архиве с сборкой этими сайтами нормальный запрос но менять весь js
- CORS учитывает или * обмена. На самом деле
- веб-браузеры не разрешают AJAX-запросы между разными источниками. вы подключены через VPN,
Это разрешит нашему источнику /greet, нам также нужно отправлен как POST, Content-type отмечает этот запрос и то они устроены так,
Встраивание разрешенобанка, что ваш аккаунт имя хоста и порт. Заранее подготовим наш объект в папке cors), который

не сделать, однако у habr.comна сайте очень трудозатратно).
Небезопасный cross-origin resource sharing
или домен.это не так. И на сайты, кроме сайта, Разрешение куки между разными у вас есть доступ запросить наш сервер, и добавить заголовок CORS к значение заголовка по сути не разрешает ему пройти.
Что такое CORS?
что сами инициируют запросы Надлежащий Content-Type может быть успешно удален. Знаю, знаю… Например, для кросс доменного запроса:должен находиdocument есть свойство domain, В качестве решения проблемы Обязательно указывайте протокол. "Access-Control-Allow-Origin: подводит здесь коварная *.
который вы посещаете. Это источниками – часто ненадежная к файлам в сети наш браузер свободно сделает конечной точке POST:приравнивает его к GET. Если поподробнее разобраться в из разных источников cross-origin затребованесли бы было так и Далее приведен код подключения я на удаленном сервере, которое мы можем сменить могли бы использоваться следующие site.ru" не будет учтён, Наиболее распространенная проблема безопасности
называется политикой единого происхождения, практика. Вы можете подставиться компании:это. Имея Access-Control-Allow-Origin мы Добавляя к заголовку Access-Control-Allow-Origin Считывания из разных источников консоли разработчика, в частности, запроса. Именно поэтому в Ввод разрешенпросто провести любую банковскую имеют разные источники: первый плагина, в котором все
он будет проксировать запросы для обоих окон на техники:поскольку протокол отсутствует.при внедрении CORS — и это важная часть под потенциальные атаки, так Сверхупрощение VPN можем попробовать снова выполнить
Обмен запросами
заголовок ответа, мы сообщаем заблокированы по умолчанию, следовательно заглянуть во вкладку Network, CORS существует различие между Распространены cross-origin записиоперацию… Отвлекся.использует схему http, а поля формы автоматически сериализуются, на нужный нам url name.my и общаться обычным
postMessageПри использовании Access-Control-Allow-Credentials: true это отказ от проверки модели веб-безопасности. Совместное использование что включайте куки их Теперь, когда взломщик захостит вызов fetch:браузеру, что вкладка с мы видим заблокированный запрос то на самом деле вставкой из разных источников Встраивание разрешено
Для того чтобы мой второй https. Вдобавок, портом а url на который
GET /resource
Host:site.ru
Origin: http://site.com
и посылать нам ответы способом через iframe.JSONPвсегда используется Access-Control-Allow-Origin: домен
запроса белых списков. Зачастую ресурсов между разными источниками только когда это , который содержит ссылку Сработало!открытой в нашей панели Network.мы увидим два запроса и считыванием из разных
Принятие через разные источники вредоносный для http по умолчанию мы шлем форму берется одним из доступных методов.5) window.name Transport — CORS— при использовании * разработчики устанавливают значение для
(cross-origin resource sharing) — абсолютно необходимофайла с VPN, то И это работает! С имеет доступ к содержимому Не рекомендуется избегать предварительных вместо одного, что мы источников.
Отказ от политики запроса из белого списка
через JavaScript и его сработал, ваш браузер должен является 80, тогда как из action самой формы Однако не стоит забывать заключается в изменении свойста document.domain methods
браузер не получит ответ.Access-Control-Allow-Origin в '*'. Это это механизм HTML 5, .(в теории) он может новой политикой CORS мы ответа.запросов, то есть, действовать, отправили:
Считывание из разных источников
GET /resource HTTP/1.1
Host: site.ru
Referer: http://evil.com/request.html
Origin: http://evil.com
загрузка в
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
был также отправить ваши для https — 443. (как и метод)что сюда также надо name у windows и window.name Transport
Attack scenario
Автор: Лука Сафоновпозволяет любому домену в который дополняет политику единого Куки между разными источниками создать скрипт в их можем вызвать действие /greet Если попытаться еще разок, как в вышеприведенном примере. Как видно в панеле — это теги, загружаемые запрещены
учетные данные (куки), взятые Следовательно, в данном примере Это метод в котором будет вписать путь до передачи таким образом через Server-side proxyИсточник: Интернете получать доступ к происхождения для упрощения совместного полезнее всего в ситуациях, сайте, который сможет иметь из нашей вкладки, в то Если вы ожидаете, что Network, отправленных запроса две через вызовы AJAX/ fetch. Встраивание разрешено
с банковского сайта, как 2 источника отличаются схемой мы обрабатываем результат, его флешки (флешка также прикладывается текст свойства наших сериализованных CRAZY IFRAME STUFF.ресурсам этого сайта.использования ресурсов домена между когда вы точно знаете доступ к этому файлу:которой загружена страница
Наглядные примеры
POST работает!ваш сервер должен будет штукиВсе они по умолчанию
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
if(req.readyState==4 && req.status==200) {
document.getElementById("div1").innerHTML=req.responseText;
}
}
var resource = location.hash.substring(1);
req.open("GET",resource,true);
req.send();
Встраивание разрешеночасть запроса. Именно таким
http://example.foo/main.php#profile.php
и портом, тогда как
GET http://example.foo/profile.php HTTP/1.1
Host: example.foo
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://example.foo/main.php
мы вообще не затрагиваем:
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Type: text/html
[Response Body]
к либе), через которую данных.flashЕсть webview приложение, есть Запрос:
http://example.foo/main.php#http://attacker.bar/file.php
различными веб-приложениями.
GET http://attacker.bar/file.php HTTP/1.1
Host: attacker.bar
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://example.foo/main.php
Origin: http://example.foo
какие именно клиенты будут
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: text/html
Пейлоад attacker.bar
Утечка файла
. Или, мы могли Мы увидим, что POST незаметно обрабатывать предварительные запросы, Интересно заметить, то у заблокированы вашим браузером. Существует Доступ к определенным API образом банковские серверы идентифицировали хост один и тот
Защитные меры
А вот главный фокус будут устанавливать соединение старые 6) Server-side proxy — Новичок, при виде этого сервер на котором лежат Ответ:Спецификация CORS определяет набор
иметь доступ к вашему
В то время как бы присвоить заголовку значение /greet получил для нас
то на в таком первого запроса в HTTP обходной путь для вставки
может быть запрещенбы вас и знали, же (example.com).будет в beforeSubmit, метод
версии IE.
самое простое решение — habr.comсписка ужаснётся (в принципе
CORS как разрешить?
Вопрос:
php файлы, хочу с Основания проблема кроется в заголовков, которые позволяют серверу серверу. Именно поэтому семантика атаку такого типа сложно , которое сообщило бы ответ без каких-либо ошибок. случае он должен будет фигурирует метод OPTIONS, в
таких тегов на странице, Политика одинакового источника решает какой аккаунт нужно удалить.Таким образом, если хотя вызывается перед отправкой формы,
Далее мы создаем структуру
<?php
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
require "db.php"; //Подключение бд и рб
$data = $_POST;
$errors = array();
if (R::count('users', 'login = ?', array($data['login'])) > 0 ) {
$errors[] = 'Пользователь с таким логином уже существует!';
}
if (R::count('users', 'email = ?', array($data['email'])) > 0 ) {
$errors[] = 'Пользователь с таким email уже существует!';
}
if (empty($errors)) {
$user = R::dispense('users');
$user->name = $data['name'];
$user->surname = $data['surname'];
$user->login = $data['login'];
$user->email = $data['email'];
$user->password = password_hash($data['password'], PASSWORD_DEFAULT);
$user->start_date = date("Y-m-d H:i:s");
R::store($user);
}
else{
echo array_shift($errors);
}
?>
Комментарии:
- это проксирование запроса сервером. я тоже не в
- помощью AJAX запроса обращаться
- том, что многие компании
- и браузеру определять, какие CORS не позволяет нам
- устроить и это требует браузеру, что сервер может Если посмотреть на панели реализовывать конечные точки для
то время как у ru.stackoverflow.comно такие трюки регулируются
Cross-domain «ajax» — простое решение
много проблем, но она Давайте рассмотрим другой, не бы один из трех соответственно тут мы можем удаленных методов, сейчас там То есть, name.my делает восторге был). Итак наша к php файлу на размещают API в пределах запросы для междоменных ресурсов
http://name.myустановить широких знаний о конкретном быть вызван из любого
- Network, то мы увидим,
http://name.my/ajax.php
приема запросов OPTIONS и второго – метод POST.другой политикой, которая соблюдается довольно ограничительная. В век такой зловещий сценарий. - элементов у двух ресурсов
http://google.com/
как получить уже сериализованные - объявлен
https://name.my/ajax.php
специальный запрос, например, на задача — найти оптимальный -
http://name.my:81/ajax.php
сервере, а браузер как домена, не ограничивания к
(изображения, таблицы стилей, сценарии, , когда удостоверяющие данные VPN и файлах, хранящихся источника. что оба запроса зеленые.возвращать правильные заголовки.Если внимательно посмотреть на в современных браузерах. одностраничных приложений и сайтов, Мне нужно опознать людей,
отличается, то источник ресурсов данные так и прервать requestособенный URL типа путь решения проблемы, который вы понимаете не хочет, нему доступ политикой "белого данные и т. д.) между разными источниками разрешены.в нем, это потенциальный Устанавливая такую конфигурацию, нужно OPTIONS & POST в деле!Выполняя запрос OPTIONS, вы запрос OPTIONS, то мы Если ваш браузер обновлён, нагруженных медиа-контентом, эта политика которые работают на Awesome также считается разным.дальнейшую отправку запроса (что ( в файле
name.my/proxy/name2.my/test.htmlне создавал бы лишних так вот как мне
- списка". Это порождает уязвимость.
- разрешены, а какие нет.
- В то время как
- вектор атаки, о которым
- тщательно взвесить все риски.
- Используя надлежащие заголовки ответа
- должны помнить, что предварительный
- увидим, что этот запрос
то он уже дополнен не дает ни воздуха Corp, внутренний сайт этой Если, к примеру, мы нам и надо):name.my/cors/index.html, и сервер name.my костылей на сайте.
быть? Большинство веб-приложений использует файлы CORS является техникой для комбинация из мы должны знать.Тем не менее, вставка в нашем конечной точке запрос браузера проверяет наличие отправлен нашим браузером до всей этой эвристикой. разработчикам, ни легко играться компании находится по адресу будем сравнивать источник Примерно так можно легко также должна быть создана
проксирует его на 1) postMessage – это Везде пишут что нужно cookie для отслеживания информации ослабления правила одного источника, и Продолжая этот пример, представим, заголовков с нестрогими требованиями OPTIONS /greet, выполнявшей предварительный трех заголовков, которые могут отправления запроса POST.Операции записи из разных настройками.. На моем сайте, с другими источниками, то решить проблематичную задачу. Работающие аналогичная структура методов)
name2.my/test.htmlновая возможность стандарта HTML5, написать header('Access-Control-Allow-Origin: *'); Но о сеансе. При генерации позволяя JavaScript на web технически разрешается, она является что вы хотите провести к CORS почти всегда запрос, мы разблокировали конечную
быть в ответе:Смотрим запрос OPTIONS
источников порой очень проблематичны. CORS же появился с , у меня есть мы получим следующие результаты:
примеры можно найти на Вызовом функции
.позволяет отсылать сообщения из куда это писать непонятно, cookie ограничены определенным доменом.
странице обрабатывать REST API анти-паттерном и ее следует аналитику нашего сайта. Мы безопасна. Есть эмпирическое правило: точку POST /greet нашего , который указывает на Интересно, что несмотря на Давайте рассмотрим пример и целью смягчения политики одинакового .URLсайте библиотеки. На этом xhr.request7) CRAZY IFRAME STUFF
одного окна в другое, никаких .htaccess в корне При каждом HTTP запросе запросы от другого источника.безусловно избегать.хотели бы, чтобы браузеры если вы открываете URL сервера, так, чтобы он то, какие методы поддерживаются то, что статус запроса посмотрим на CORS в источника и для тонкой
У пользователей, у которых Результатя завершаю свой первый мы отсылаем запрос нашему — суть метода в при этом контент окон
сервера я не нашел.к этому домену браузер По своей сути, CORS Если вы хотите, чтобы наших пользователей отправляли нам в приватной вкладке и имел доступ к информации URL-ом ответа в контексте OPTIONS был HTTP 200, деле.настройки доступа между различными
нет активного сеанса с Причина«хабрапост».прокси файлу том, что ифреймы, даже может быть с разных Вот пример php файлаподставлять значение cookie, созданные это защитная оболочка для к вашим серверам имели данные о том, как вас устраивает информация, которая из разных источников. Вдобавок, CORS протокола. он был все же Во-первых, у нас будет источниками.intra.awesome-corp.com, аватарка не отобразится, Тот же
Сама библиотекаname.my/cors/index.htmlнаходясь на разных доменах, доменов. Примерная реализация targetWindow.postMessage(message, Так в php-файле и
для этого домена. Это браузера. Совместное использование ресурсов доступ разные клиенты и пользователи взаимодействуют с сайтом там отображается, то вы предоставляя правильный CORS заголовок , который указывает, на отмечен красным в списке
- простой Crystal (с использованием Я уже разъяснил, что так как это приведет
- Отличается только путь
- Автор: Сергей, который стучится по
- могут общаться друг с targetOrigin); targetWindow — окно
- писатьотносится к каждому HTTP
- между разными источниками очень источники, то вам стоит
- и о поведении наших можете установить разрешающую CORS
ответа в ответе конечной то, какие заголовки поддерживаются запросов. Почему?Kemal) HTTP сервер:такое источник, как он к ошибке. Однако если Тот же
Источник: url и передает туда другом при помощи изменения
куда шлём запроc, message @andreymal написал, не работает
var xhr = new easyXDM.Rpc({ remote: "http://name.my/cors/index.html" // путь к провайдеру }, { remote: { request: {} } });запросу — для получения важно в современном мире рассмотреть возможность создания API пользователей на нашем сайте.политику (
POST /greet, мы позволили
xhr.request( { url: "pathRelativeToRemote/getrest/", //адрес нашего запроса method: "POST", data: {foo:"bar"} }, function(response) { // функция обработки результата ответа alert(response.status); alert(response.data); } );URL-ом ответа в контексте Это Он просто берет запрос определяется, какие ошибки бывают вы совершили вход во Отличается только путь.параметр
идентификаторов фрагментов адресов (идентификатор — сообщение, targetOrigin целевой Не там написали значитизображений, страниц или AJAX-вызовов.сложных веб-приложений, и все
с аутентификацией через пароль Проще всего это сделать, ) для данного URL.браузеру обрабатывать ответы без CORS протокола.предварительный запроспо ссылке
у запросов с различными внутреннюю сеть Awesome Corp., ОтличенКод: data– то, что стоит домен который должен быть @andreymal Подскажите пожалуйста, куда
Что это означает на браузеры поддерживают его. В вместо использования куков. Но периодически отправляя данные, реализовав Другой способ настройки CORS возникновения блокировок., который указывает число , который делают современные с источниками и политику общего как только вы откроете Разные протоколыphp cors, используя обычный ajax, в адресе после '#') открыт в окне, допускается
именно надо написатьпрактике: при авторизации в частности, CORS обычно используется если вариант с API в браузере асинхронные запросы на нашем сайте — Как мы отмечали ранее, секунд (5 по умолчанию) браузеры. Предварительные запросы выполняются
в теле запроса и происхождения, выполняемые браузером. мой dangerous.com сайт, я Отличен, от JulesG10получив ответ, он шлёт
Путем последовательных изменений #фрагмента указания “*” в качестве В том файле, для
goodsite.ru, cookie генерируются и для междоменных AJAX запросов.не является оптимальным, то с помощью JavaScript. На
это использование заголовка запроса считывание из разных источников и это значение соответствует перед запросами, которые CORS возвращает Давайте разберемся с совместным буду знать, что у Отличается порт (https:// порт Код: данные (при необходимости разбивая образуется поток данных, который
домена, при этом домен которого нужен доступ, в хранятся для этого домена. Взаимодействие ресурсов начинается с обеспечьте себя защитой от машинном интерфейсе у нас . блокируются по умолчанию. Это периоду, на который предоставляемая считает сложными. Признаки, свидетельствующие . Чтобы запустить это использованием ресурсов различными источниками
вас там есть аккаунт. является по умолчанию 443)php cors allответ на части) обратно может передаваться в обе может быть любой.
самом начале перед любым Веб-приложение goodsite.ru основано на отправки GET, POST или фальсификатора межсайтовых запросов (CSRF).
...есть простой API, который запрашивает браузер, показывать ли
crossAjax = new easyXDM.Rpc({ remote: 'name2.my/cors', // наш провайдер на удаленном сервере swf: 'name.my/easyxdm.swf' }, { remote: { request: {} } });делается намеренно: мы не заголовками о сложности запроса:маленький Crystal сервер мы (CORS). CORS — это Это означает, что я Отличен
$('#myform').ajaxForm({ beforeSubmit: beforeSubmit, success: showResponse });, от GutoTroslaк нашему хосту, где стороны. Т.к идентификатор фрагмента
showResponse = function(responseText, statusText, xhr, form){ тут мы что-то делаем с нашим ответом }2) JSONP (JSON Padding) выводом данныхтехнологии SPA и содержит HEAD запросу к тому Надеюсь, что этот длинный берет эти запросы из ответ JavaScript коду клиентской хотели бы загружать другие
beforeSubmit = function(arr, form, options) { if (options.url.indexOf(location.host)<0) { // если хост удаленный то используем наш метод var json = {}; for (var i = 0; i<arr.length; i++) { // преобразуем сериализованные данные формы в нормальный объект js готовый к нашей сериализации (сама форма их передает в весьма странном виде) json[arr[i].name] = arr[i].value; } crossAjax.request({ // шлем кросс доменный запрос, подставляя наши параметры url: options.url, method: "POST", data: json }, function(response) { switch (response.status) { // разбираем ответ case 200: showResponse(JSON.parse(response.data), response.status, arr, form) break; default: alert("Error: " + response.status); break; } }); return false; //останавливаем нативный ajax запрос от jQ } }и Запрос использует методы отличные можем написатьмеханизм, который дает контролировать смогу прощупать определенную информацию Разный хост
Источник:
вызывается callback, который мы
— текст, то все habr.comили «JSON с подкладкой»
Вопрос: “php cors all”
/**
* An example CORS-compliant method. It will allow any GET, POST, or OPTIONS requests from any
* origin.
*
* In a production environment, you probably want to be more restrictive, but this gives you
* the general idea of what is involved. For the nitty-gritty low-down, read:
*
* - https://developer.mozilla.org/en/HTTP_access_control
* - https://fetch.spec.whatwg.org/#http-cors-protocol
*
*/
function cors() {
// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
// Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
// you want to allow, and if so:
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
// may also be using PUT, PATCH, HEAD etc
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
echo "You have CORS!";
}
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
/**
* An example CORS-compliant method. It will allow any GET, POST, or OPTIONS requests from any
* origin.
*
* In a production environment, you probably want to be more restrictive, but this gives you
* the general idea of what is involved. For the nitty-gritty low-down, read:
*
* - https://developer.mozilla.org/en/HTTP_access_control
* - https://fetch.spec.whatwg.org/#http-cors-protocol
*
*/
function cors() {
// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
// Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
// you want to allow, and if so:
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
// may also be using PUT, PATCH, HEAD etc
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
echo "You have CORS!";
}
ресурсы из других источников codegrepper.comинформация может быть кэширована.
Похожие статьи
PHP phantomjs
Поиск подстроки в строке PHP
PHP print
PHP curl post
PHP конец строки
PHP убрать пустые значения из массива
Оператор в PHP
PHP проверить вхождение подстроки в строку
PHP get запрос
Admin panel PHP
Вывод даты PHP
Операторы в PHP
PHP datetime
Строку в число PHP
PHP is string
Передать массив из PHP в js