Рейтинг:0

как разрешить POST для php-файла в apache только из того же источника?

флаг jp
Tai

У меня есть веб-сайт с HTML-формой, которая при отправке успешно отправляет запрос POST в файл .php на сервере (Apache 2.4.48).

Однако, когда я разрешаю Javascript обрабатывать отправку через JS fetch(), сервер отвечает ошибкой 405.

Итак, я проанализировал заголовки запроса и ответа для двух POST, и они почти идентичны, поэтому я не понимаю, почему работает первый метод, а другой получает отказ.

Ниже приведен запрос/ответ при отправке через HTML-форму (восклицательные знаки там, где POST-запросы отличаются):

ГЕНЕРАЛЬНЫЙ
URL запроса: https://example.com/php/script.php
Метод запроса: POST
Код состояния: 302 
Удаленный адрес: 160.153.133.187:443
Политика реферера: происхождение-при-перекрестном происхождении


ЗАГОЛОВКИ ОТВЕТОВ
управление кешем: max-age=0 !
длина содержимого: 0
тип содержимого: текст/html; кодировка = UTF-8
дата: сб, 14 августа 2021 г., 23:21:34 по Гринвичу
истекает: сб, 14 августа 2021 г., 23:21:34 по Гринвичу
местоположение: https://example.com/pages/form-submitted.html#submitted
сервер: Апач
различаться: User-Agent
x-на основе: PHP/8.0.8


ЗАГОЛОВКИ ЗАПРОСА
:авторитет: example.com
:метод: ПОСТ
:путь: /php/script.php
:схема: https
принимать: текст/html, приложение/xhtml+xml, приложение/xml; q = 0,9, изображение / avif, изображение / webp, изображение / apng, */*; q = 0,8, приложение / подписанный обмен; v = b3; д=0,9 !
принять кодировку: gzip, deflate, br
принять-язык: en-GB,en;q=0.9,es-ES;q=0.8,es;q=0.7,it-IT;q=0.6,it;q=0.5
кеш-контроль: без кеша
длина содержимого: 96
тип контента: application/x-www-form-urlencoded !
днт: 1
происхождение: https://example.com
прагма: без кеша
реферер: https://example.com/contact
sec-ch-ua: "Chromium";v="92", "Не бренд";v="99", "Google Chrome";v="92"
сек-ч-уа-мобиль: ?0
sec-fetch-dest: документ!
sec-fetch-mode: навигация!
sec-fetch-site: того же происхождения
сек-выборка-пользователь: ?1
небезопасные запросы на обновление: 1
пользовательский агент: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/92.0.4515.131 Safari/537.36


ФОРМА ДАННЫХ
Название: Тай Дзен
электронная почта: [email protected]
номер телефона: 12345678910
согласие на конфиденциальность: включено
представить: 

Вместо этого ниже это запрос/ответ при отправке POST с использованием fetch():

ГЕНЕРАЛЬНЫЙ
URL запроса: https://example.com/php/script.php
Метод запроса: POST
Код состояния: 302 
Удаленный адрес: 160.153.133.187:443
Реферальная политика: тот же источник


ЗАГОЛОВКИ ОТВЕТОВ
кеш-контроль: max-age=2741
длина содержимого: 0
тип содержимого: текст/html; кодировка = UTF-8
дата: суббота, 14 августа 2021 г., 23:31:44 по Гринвичу
истекает: вс, 15 августа 2021 г., 00:17:26 по Гринвичу
местоположение: https://example.com/405
сервер: Апач
различаться: User-Agent
x-на основе: PHP/8.0.8


ЗАГОЛОВКИ ЗАПРОСА
:авторитет: example.com
:метод: ПОСТ
:путь: /php/script.php
:схема: https
принимать: */*
принять кодировку: gzip, deflate, br
принять-язык: en-GB,en;q=0.9,es-ES;q=0.8,es;q=0.7,it-IT;q=0.6,it;q=0.5
кеш-контроль: без кеша
длина содержимого: 471
тип содержимого: multipart/form-data; граница=----WebKitFormBoundary28YayN0mmqwdpQh0
днт: 1
происхождение: https://example.com
прагма: без кеша
реферер: https://example.com/contact
sec-ch-ua: "Chromium";v="92", "Не бренд";v="99", "Google Chrome";v="92"
сек-ч-уа-мобиль: ?0
пункт назначения сек-выборки: пусто
sec-fetch-mode: тот же источник
sec-fetch-site: того же происхождения
пользовательский агент: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/92.0.4515.131 Safari/537.36

ФОРМА ДАННЫХ
Название: Тай Дзен
электронная почта: [email protected]
номер телефона: 12345678910
согласие на конфиденциальность: включено
представить:

Должен ли я что-то изменить на стороне сервера, чтобы разрешить запросы POST к этому конкретному файлу?

Однако я бы хотел, чтобы он получал POST-запросы только от JS, который я написал, а не от внешних сущностей, но я точно не знаю, как это сделать. Я попробовал то, что было предложено на этот ответ, но не получилось, сервер выдал 500 ошибку. Я предполагаю, что это может быть из-за того, что я пользуюсь планом общего хостинга и не имею полного доступа к своим настройкам Apache, но я не уверен, что это причина.

Michael Hampton avatar
флаг cz
Первое, что нужно сделать, это отказаться от плана виртуального хостинга и получить собственный сервер.
Tai avatar
флаг jp
Tai
Но это более дорогое решение для размещения простого статического веб-сайта с одной контактной формой.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.