2008-10-09 25 views
16

¿Cómo evito que mis usuarios accedan directamente a páginas destinadas solo para llamadas ajax?Impedir el acceso directo a una página PHP

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: Uso de Apache como servidor web.

EDITAR: Para responder por qué, tengo jQuery ui-tabs en mi index.php, y dentro de esas pestañas 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.

+2

No se preocupe por la facilidad de uso del usuario en este caso. De hecho, diría que es mejor que fracases antes de lo posible para que sea agradable. Por ejemplo, supongamos que lo redirige a index.php para visitas que no son AJAX. Resultado: alguien tiene la garantía de marcar la secuencia de comandos AJAX, ya que los lleva a su página de inicio. –

+0

Las cookies también pueden ser falsificadas – AlBeebe

Respuesta

21

Como han dicho otros, se puede emular la solicitud de Ajax para crear los encabezados adecuados. Si usted quiere tener una comprobación básica para ver si la petición es una petición Ajax que puede utilizar:

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

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

+1

obtengo índice indefinido: HTTP_X_REQUESTED_WITH. ¿Quiere decir que tengo que asignar ese valor yo mismo? – syaz

+0

¿Qué marco está utilizando para los requets de Ajax? (Espero que no estés usando una solución casera ...) –

+0

Y, también ese parámetro SÓLO estará disponible dentro de la solicitud de Ajax. Es posible que desee agregar una comprobación isset() si no desea el error de índice indefinido –

34

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).

+4

No se puede decir nada más. Nunca, * nunca * confíes en lo que el cliente te envía. Dado que los métodos AJAX están destinados a devolver cosas al navegador, asegúrese de que solo se pueden devolver los datos autorizados en el servidor. –

+0

Lo único que lamento es que solo tengo un voto para dar para esta respuesta. –

+4

Lo único que lamento es que tengo huesos. – scronide

8

Parece que podría 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 estar contento de que el cliente pueda ver la respuesta. Ofuscar el acceso usando una "llave" de esta manera solo sirve para complicar las cosas.

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.

¿Cuál es el motivo por el que quieres hacer esto?

+0

me gusta "una pequeña arma en la lucha contra la seguridad a través de la oscuridad". parte - ¿te importa si lo cito alguna vez? :) –

+0

jeje, ve por ello. – Draemon

4

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.

0

No estoy seguro de esto, pero posiblemente verifique si hay 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 comprobarlo. 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 puede marcar la ventana.ubicación para ver si la url es la url de su formulario Ajax. si lo es, vaya a la página correcta a través de document.location

+0

Es muy fácil simular el encabezado de referencia. –

+0

@Alex Derecha, que sería una de las razones incluidas en la declaración "puede estar en blanco por muchos motivos". Alguna vez se puede fingir la respuesta en esta página, porque todos son métodos de entrada del cliente, datos que el cliente envía al servidor. Marque cada respuesta en esta página negativa. –

0

Esto definitivamente no es útil para asegurar algo ... pero creo que esto podría ser útil si quisieras tener una página de php que generara una página completa si la página no fuera solicitada por ajax pero solo generara la parte que necesitabas regresar cuando se usara ajax. Esto te permitiría hacer que tu sitio no sea amigable para los ajax, así que si dices que 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 luego se genera como una página completa que muestra los comentarios.

1

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.

0

Pase sus solicitudes directas a través de index.php y sus solicitudes 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.

1

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 
} 

saludos!

0

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'); 

a continuación en el archivo PHP ajax.php:

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

frikis todavía puede llamar al script ajax.php mediante la creación de la cabecera, pero el resto de mi secuencia de comandos 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.

Cuestiones relacionadas