Любой в этой теме, кто предлагал смотреть на заголовки, так или иначе ошибается. Все в запросе (HTTP_REFERER, HTTP_X_REQUESTED_WITH) может быть подделано злоумышленником, который не является полностью некомпетентным, включая общие секреты [1].
Вы не можете запретить людям отправлять HTTP-запросы на ваш сайт. Что вы хотите сделать, так это убедиться, что пользователи должны пройти проверку подлинности, прежде чем они отправят запрос к какой-либо важной части вашего сайта с помощью файла cookie сеанса. Если пользователь делает неаутентифицированные запросы, остановитесь и дайте ему HTTP 403.
Ваш пример создает запрос GET, поэтому, я думаю, вы обеспокоены требованиями к ресурсам, указанными в запросе [2]. Вы можете выполнить несколько простых проверок работоспособности заголовков HTTP_REFERER или HTTP_X_REQUESTED_WITH в ваших правилах .htaccess, чтобы предотвратить появление новых процессов для явно ложных запросов (или глупых поисковых роботов, которые не будут слушать robots.txt), но если атакующий подделывает тем, вы захотите убедиться, что ваш процесс PHP завершается как можно раньше для неаутентифицированных запросов.
[1] Это одна из фундаментальных проблем с клиент-серверными приложениями. Вот почему это не работает: допустим, у вашего клиентского приложения есть способ аутентифицировать себя на сервере - будь то секретный пароль или другой метод. Информация, в которой нуждается приложение, обязательно доступна приложению (пароль где-то там скрыт или что-то в этом роде). Но поскольку он работает на компьютере пользователя, это означает, что они также имеют доступ к этой информации: все, что им нужно, это посмотреть на источник, или двоичный файл, или сетевой трафик между вашим приложением и сервером, и в конце концов они выяснят механизм, с помощью которого ваше приложение аутентифицирует и копирует его. Может быть, они даже скопируют это. Возможно, они напишут хитроумный хак, чтобы ваше приложение взяло на себя тяжелую работу (вы всегда можете просто отправить фальшивый пользовательский ввод в приложение). Но как бы там ни было, у них есть вся необходимая информация, и нет никакого способа помешать им получить ее, что не помешало бы и вашему приложению.
[2] GET-запросы в хорошо спроектированном приложении не имеют побочных эффектов, поэтому никто не сможет внести изменения на сервере. Ваши POST-запросы всегда должны проходить проверку подлинности с помощью сеанса плюс токен CSRF, чтобы их могли вызывать только прошедшие проверку пользователи. Если кто-то атакует это, это означает, что у него есть учетная запись, и вы хотите закрыть его.