Prevenir el acceso directo a una página PHP

¿Cómo evito que mis usuarios accedan directamente a páginas destinadas solo para llamadas ajax?

Pasar una tecla durante la llamada ajax parece una solución, mientras que el acceso sin la clave no se procesará. Pero también es fácil fabricar la llave, ¿no? Curse of View Source …

p / s: utilizando Apache como servidor web.

EDITAR: Para responder por qué, tengo jQuery ui-tabs en mi index.php, y dentro de esas tabs hay formularios con scripts, que no funcionarán si se accede directamente. Por qué un usuario querría hacer eso, no sé, me imagino que sería más amigable al evitar el acceso directo a formularios sin scripts de validación.

Como han dicho otros, la solicitud de Ajax puede emularse creando los encabezados adecuados. Si desea tener un cheque básico para ver si la solicitud es una solicitud de Ajax, puede usar:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { //Request identified as ajax request } 

Sin embargo, nunca debe basar su seguridad en este control. Eliminará los accesos directos a la página si eso es lo que necesita.

No hay forma de garantizar que estén accediendo a través de AJAX. Tanto el acceso directo como el acceso AJAX provienen del cliente, por lo que se puede falsificar fácilmente.

¿Por qué quieres hacer esto de todos modos?

Si es porque el código PHP no es muy seguro, haga que el código PHP sea más seguro. (Por ejemplo, si su AJAX pasa la identificación del usuario al archivo PHP, escriba el código en el archivo PHP para asegurarse de que es la identificación de usuario correcta).

Parece que podrías estar haciendo las cosas mal. Una llamada AJAX es como una solicitud de página estándar, solo por convención, la respuesta no está destinada a ser mostrada al usuario.

Sin embargo, sigue siendo una solicitud del cliente, por lo que debe alegrarse de que el cliente pueda ver la respuesta. Ofuscar el acceso usando una “llave” de esta manera solo sirve para complicar las cosas.

De hecho, diría que la “maldición” de la fuente de visión es una pequeña arma en la lucha contra la seguridad a través de la oscuridad.

Entonces, ¿cuál es tu razón para querer hacer esto?

Si el navegador llamará a su página, ya sea por solicitud normal o ajax, entonces alguien puede llamarla manualmente. Realmente no existe una diferencia bien definida entre las peticiones normal y ajax en lo que respecta a la comunicación entre el servidor y el cliente.

El caso común es pasar un encabezado al servidor que dice “esta solicitud fue hecha por ajax”. Si está utilizando Prototype, establece automáticamente el encabezado http “X-Requested-With” en “XMLHttpRequest” y también algunos otros encabezados, incluida la versión del prototipo. (Ver más en http://www.prototypejs.org/api/ajax/options en “requestHeaders”)

Agregar: en caso de que esté utilizando otra biblioteca AJAX, probablemente pueda agregar su propio encabezado. Esto es útil para saber qué tipo de solicitud era en el lado del servidor, y para evitar casos simples cuando se solicite una página AJAX en el navegador. No protege su solicitud de todos porque no puede.

LAS COOKIES no son seguras … prueba el $ _SESSION. Esa es una de las pocas cosas en las que realmente puede confiar en una página cruzada que no se puede falsificar. Porque, por supuesto, esencialmente nunca deja su control.

gracias, aunque yo uso

 define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); if(IS_AJAX) { //Request identified as ajax request } 

¡aclamaciones!

¿No está seguro de esto, pero posiblemente busque un encabezado de referencia? Creo que si alguien teclea manualmente su url, no tendría un encabezado de referencia, mientras que las llamadas AJAX sí (al menos en la prueba rápida que acabo de hacer en mi sistema).

Aunque es una mala forma de verificar. El referidor puede estar en blanco por muchas razones. ¿Estás tratando de evitar que las personas usen tu servicio web como un servicio público o algo así?

Después de leer sus comentarios de edición, si los formularios se cargarán a través de llamadas ajax, entonces podría marcar window.location para ver si la url es la url de su formulario ajax. si es así, vaya a la página correcta mediante document.location

Esto definitivamente no es útil para asegurar algo … pero creo que esto podría ser útil si quisieras tener una página php que generara una página completa si la página no fuera solicitada por ajax pero solo genere la parte que necesitabas devuelta cuando se usó ajax … Esto le permitiría hacer que su sitio no sea amigable para los ajax, por lo que si hacen clic en un enlace y se supone que carga una caja de comentarios, pero no tienen ajax, todavía los envía a la página que está luego se genera como una página completa que muestra los comentarios.

Pase sus solicitudes directas a través de index.php y sus solicitudes de ajax a través de ajax.php y luego no permita que el usuario busque directamente ningún otro archivo fuente – asegúrese de que index.php y ajax.php tengan la lógica apropiada para incluir el código que necesitan .

En el archivo javascript que llama al script:

 var url = "http://website.com/ajax.php?say=hello+world"; xmlHttp.open("GET", url, true); xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 

luego en el archivo php ajax.php:

 if($_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest") { header("Location: http://website.com"); die(); } 

Los geeks todavía pueden invocar el script ajax.php al forjar el encabezado, pero el rest del script requiere sesiones, por lo que la ejecución finaliza cuando no se detecta ninguna sesión válida. Necesitaba que esto funcionara para redirigir a las personas con sesiones hybridauth caducadas al sitio principal para volver a iniciar sesión porque terminaron siendo redirigidas al script ajax.