Cualquiera en este hilo que sugiriera mirar los encabezados está mal de una manera u otra. Cualquier cosa en la solicitud (HTTP_REFERER, HTTP_X_REQUESTED_WITH) puede ser falsificada por un atacante que no sea del todo incompetente, incluidos los secretos compartidos [1].
No puede evitar que las personas realicen una solicitud HTTP a su sitio. Lo que quiere hacer es asegurarse de que los usuarios se autentiquen antes de realizar una solicitud a una parte sensible de su sitio, por medio de una cookie de sesión. Si un usuario realiza solicitudes no autenticadas, deténgase allí y bríndeles un HTTP 403.
Su ejemplo hace una solicitud GET, así que supongo que le preocupan los requisitos de recursos de la solicitud [2]. Puede hacer algunas comprobaciones de cordura simples en los encabezados HTTP_REFERER o HTTP_X_REQUESTED_WITH en sus reglas .htaccess para evitar que se generen nuevos procesos para solicitudes obviamente falsas (o robots de búsqueda tontos que no escuchen el archivo robots.txt), pero si el atacante falsifica aquellos, querrá asegurarse de que su proceso de PHP finalice lo más pronto posible para las solicitudes no autenticadas.
[1] Es uno de los problemas fundamentales con las aplicaciones cliente/servidor. He aquí por qué no funciona: supongamos que tiene una forma para que su aplicación cliente se autentique en el servidor, ya sea una contraseña secreta o algún otro método. La información que necesita la aplicación es necesariamente accesible para la aplicación (la contraseña está escondida en alguna parte, o lo que sea). Pero debido a que se ejecuta en la computadora del usuario, eso significa que también tienen acceso a esta información: todo lo que necesitan es mirar el origen, el binario o el tráfico de red entre su aplicación y el servidor, y eventualmente se darán cuenta el mecanismo por el cual su aplicación se autentica y la replica. Quizás incluso lo copien. Tal vez escriban un truco ingenioso para hacer que su aplicación haga el trabajo pesado (siempre puede enviar una entrada falsa del usuario a la aplicación). Pero no importa cómo, tienen toda la información necesaria, y no hay forma de evitar que la tengan, lo que tampoco evitaría que tu aplicación la tenga.
[2] Las solicitudes GET en una aplicación bien diseñada no tienen efectos secundarios, por lo que nadie que las realice podrá realizar cambios en el servidor. Sus solicitudes POST siempre deben estar autenticadas con la sesión más el token CSRF, para permitir que solo los usuarios autenticados los llamen. Si alguien lo ataca, significa que tiene una cuenta contigo y quieres cerrar esa cuenta.
¿Así que básicamente quiere que su script esté accesible a través de AJAX pero no si escribo el URI? –
sí, eso es exactamente – jriggs
¿Hay algún motivo por el que no pueda utilizar el .htaccess descrito en el enlace que publicó? –