2009-09-08 17 views
9

Recientemente comencé a codificar fuertemente scripts soportados por AJAX en PHP, es decir, los archivos a los que se accede por las llamadas AJAX también se pueden usar directamente, ¿cómo desactivarlos?AJAX only access

Respuesta

21

No puede evitar esto de manera confiable. La clave en realidad es no considerar a alguien accediendo a este archivo directamente como un problema de seguridad: planifique que esto sea posible y estará en un lugar mucho más seguro.

Algunas personas podrían recomendar código que se parece a esto (o similar):

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) 
    && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    // more code here 
} 

Sin embargo, el quid de la cuestión es que las cabeceras HTTP pueden ser falseadas con bastante facilidad y no son un medio de asegurar el código. En mis pruebas en un sitio concurrido hace un tiempo noté que estos encabezados en realidad no son tan confiables.

+0

Spot on. Alternativamente, puede pasar un parámetro (por ejemplo, '? Ajax'), pero esto es incluso más fácil de falsificar. –

0

No hay forma de denegar directamente el acceso. Dado que una consulta siempre se puede diseñar para que coincida con cualquier criterio que se le ocurra.

Si XmlHttpRequest se utiliza para consultar el servidor se añade una cabecera que puede ser detectada usando algo como:

/* AJAX check */ 
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //Do something here 
} 
-1

Uso Sesiones en su aplicación.

Edición:

  1. registrar su sitio en una sesión, utilizo UUID para eso.

  2. Establezca una cookie con el mismo valor, que utiliza en la sesión.

  3. Envíe su solicitud AJAX con un parámetro que también incluya este valor.

  4. Compara los valores de la sesión, la cookie y el parámetro.

+0

¿Qué pasa con mi respuesta? – Joerg

+0

No te voté, pero esta no es una manera confiable de hacerlo. Puede ser muy conveniente implementarlo, pero también puede ser falso. – Boldewyn

6

Como otras personas han sugerido en sus respuestas, esto no es posible. Esto se debe a uno de los principios básicos de la seguridad informática: nunca se puede confiar en el cliente. Es por eso que validamos todas las entradas del cliente, etc.

En lugar de tratar de impedir que otros clientes accedan a sus servicios, dedique tiempo a escribir servicios web defensivos. Es decir, asegúrese de que los usuarios malintencionados no puedan deslizar inyecciones u otros ataques a través de su lógica comercial. Ej., Asegúrese de que todos los correos electrónicos sean válidos, la gente no compre artículos por dólares negativos, etc.

¡Ah, y el hecho de que los servicios web estén abiertos es algo BUENO! Estás proporcionando una API abierta a tus usuarios, ¡lo cual es muy claro! Quizás en lugar de tratar de bloquear tu comunidad, lo aceptes, dales documentación sobre cómo interactuar con tus servicios y harán más clientes. En lugar de comprar el SDK de iPhone y pasar tiempo aprendiendo Objective C, uno de sus usuarios podría hacerlo.

+1

Es posible, pero no confiable. Aparte de eso, todos los puntos válidos –

0

Quizás debería usar alguna técnica de defensa XSS, como pasar alguna clave segura junto con la solicitud de ajax. Y solo proporcione la clave del javascript que realiza consultas asíncronas junto con la página cargada.

<script type="text/javascript"> 
    window.csrf_key = '<?php $user->getCsrf(); ?>'; 
</script> 

En este caso usted no tendrá que preocuparse por la gente que pasa peticiones a los archivos directamente, sólo si se mantienen las teclas de vigilancia, acceso POST para invocar las acciones y hacer comprobaciones de validez.