Как запретить выполнение php скрипта из адресной строки браузера

через js fetch post выполняю скрипт script.php, который обращается к бд mysql. Как запретить выполнение php скрипта из адресной строки браузера или програм. Читать заголовок является ли запрос от скрипта для fetch post запроса нельзя и не безопасно. Через htaccess пробовал не подходит, когда include используешь, то сразу выполняется script.php при загрузке index.php, а должен выполняться при нажатии кнопки, которая на странице index.php.


Ответы (3 шт):

Автор решения: Ivan Shatsky

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

Единственное, что вы можете сделать - это затруднить подобные действия. Например, WordPress использует для похожих ситуаций механизм, называемый nonce (number used once, единожды используемый номер). Описание этого механизма приведено в документации для разработчиков (на английском языке): Nonces, в конце статьи описаны детали реализации этого механизма. Однако стоит заметить, что основное его назначение - защита от CSRF-атак. Даже если вы внедрите у себя подобный механизм, и страница, на которой находится форма с кнопкой, будет включать в себя nonce, а PHP-скрипт на сервере будет проверять его корректность, ничто не помешает автоматизировать получение страницы с формой, чтение из неё nonce, и вызов вашего скрипта с использованием этого nonce. Хотя для предотвращения вызова скрипта из адресной строки браузера это действительно поможет.

Дополнение

Что же касается методов борьбы именно с автоматизацией заполнения форм, то наиболее распространённый метод для этого - это использование капчи на странице с формой. Детальное рассмотрение использования капчи выходит за рамки данного ответа, но как наиболее популярные, могу упомянуть следующие решения:

→ Ссылка
Автор решения: Solt

Делайте fetch с методами, отличными от GET - PUT, POST, PATCH, DELETE. А в PHP обрабатывайте с проверкой метода. Из браузера другие методы не вызвать. Но это только касается браузера, от злоумышленников не защитит.

→ Ссылка
Автор решения: Qwertiy

Как запретить выполнение php скрипта из адресной строки браузера

При открытии страницы в браузере значение заголовока accept начинается с text/html - в принципе можно даже проверить на вхождение, поскольку если не выставлять его явно в fetch, то там будет */*. Идея в том, что браузер не в курсе, что именно хочет получить fetch, но когда запрашивает сам, то его в первую очередь интересует html-страница.

или програм

Из программ, естественно, можно послать любой запрос - от этого защититься никак нельзя.

Читать заголовок является ли запрос от скрипта для fetch post запроса нельзя и не безопасно.

Не согласен. Браузер обычно (по идее с помощью расширения можно добавить) не шлёт левые заголовки при открытии страницы, так что от первого пункта добавленный заголовок вполне помогает.

→ Ссылка