@zxqb

Как указать Access-Control-Allow-Origin в php?

Есть php файл, который принимает POST запрос.
До исполнения основного кода указано:
header('Access-Control-Allow-Origin: https://siteA.ru');

Но при пост запросе со стороннего сайта основной код выполняется и ошибок нет.
  • Вопрос задан
  • 1032 просмотра
Решения вопроса 2
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
CORS защищает от запроса не со стороннего сайта (сервера), а со стороннего клиента (браузера).

С помощью CORS мы даем команду "проверь, что ajax запрос был запущен со страницы, которую мы отправили клиенту", т.к. заголовок origin при ajax запросе будет равен домену, на странице которого находился браузер, когда запрос делал. Этот origin в итоге и проверяется на соответствие разрешенному.

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

Если вы хотите запретить запрос с другого сайта (сервера), это сделать геморойно и простейшая для реализации защита - это капча на случай если другой сервер делает слишком много запросов = условная проверка IP адреса, который сервер отсылает (но его можно подменить используя прокси, поэтому читай дальше)

Либо это набор букв-цифр (хеш), который ваш же сервер при первом запросе выдает другому серверу позволяя в дальнейшем делать запросы только дублируя выданное вами значение. По сравнению с проверкой IP это дает каждому клиенту свой собственный хеш, тогда как проверка IP может дать неожиданный результат, если люди сидят в компьютерном клубе и 10 человек будут считаться одним.

Первый раз без проверки и отсылается клиенту хеш, а все запросы логики можно сделать потом только если тот сервер передает вам поле, которое вы ему давали (да, это CSRF называется, правда под ним чаще понимают только защиту форм, но принцип именно такой, и можно не только формы проверять, а вообще любые запросы)

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

Полная защита может быть так сделана - все запросы логики разрешены только аяксом и стоят корсы, что только с вашего сайта. А все не-ajax и не-GET запросы проверяются на список разрешенных IP адресов. Но даже тут заголовки можно сгенерировать так "как будто это ajax запрос" и все равно пробить.
Ответ написан
Комментировать
thewind
@thewind
php программист, front / backend developer
CORS - это для браузера, а не для сервера. Вам нужен http_referer
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽