2010-07-29 29 views
25

Actualmente estoy compilando una aplicación web en la que los archivos PHP se cargan en un archivo principal utilizando la función $ .ajax de jQuery. Sin embargo, los archivos PHP obviamente todavía están disponibles fuera de la aplicación, simplemente escribiendo el nombre de los archivos en la barra de direcciones.Pregunta de seguridad de PHP y AJAX

Así que mi pregunta es cuál sería la mejor manera de hacerlo para que el archivo PHP 'ajaxed' sepa que está contenido en la página correcta y funcionará correctamente, pero si se accede de otra manera (incluso si alguien fuera a hacer su propio sitio web y AJAX en mi archivo PHP), entonces el archivo debería decir "acceso denegado" o algo así.

Gracias de antemano

Respuesta

10

Citando Eran Galperin de un similares discussion

Como han dicho otros, petición Ajax pueden ser emuladas sea la creación de las adecuadas cabeceras. Si usted quiere tener un comprobación básica para ver si la petición es una petición Ajax puede utilizar:

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

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

Por favor, tome esta respuesta por Jeremy Ruten también en cuenta:

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

¿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 el ID de usuario en el archivo PHP, código de escritura en el archivo PHP para hacer seguro de que es la correcta identificación del usuario.)

pensamientos más inteligentes en la discusión vinculado anteriormente .

+0

Entonces, ¿cómo se supone que alguien debe acceder a esta página con XMLHttpRequest? ¿Conoce la misma política de origen? – rook

+0

Conozco la misma política de origen. El control de XMLHttpRequest se puede realizar para saber si el script se ha llamado a través de AJAX (es decir, su propio script) o si alguien apuntó su navegador a esta ubicación. Sin embargo, llamar al script desde la consola de Firbug de su propio sitio es una historia diferente. – middus

1

No es simple y probablemente no hay forma de hacerlo. Puede solicitar algunas variables POST en su archivo php y enviarlas en su solicitud AJAX. Esto lo protegerá de alguien que simplemente pegue URL en su navegador.

Nadie puede AJAX su sitio desde otro dominio (problemas de seguridad), pero siempre puede conectarse y enviar de forma remota una solicitud http, por ejemplo, mediante cURL.

Puede crear algunos tokens en las cookies, que también se verán desde la solicitud de jquery, pero esa solución también puede ser pirateada.

2

JavaScript ejecutando en otro dominio no puede acceder a cualquier página de su dominio porque se trata de una violación del Same-Origin Policy. El atacante tendría que explotar una vulnerabilidad XSS para poder lograr esto. En resumen, no necesita preocuparse por este ataque específico, solo los mismos ataques antiguos que afectan a todas las aplicaciones web.

5

de alguna manera son necesarios para la conexión segura ajax y php. puede utilizar

if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") 
{ 
//Request identified as ajax request 
} 

No se olvide de asegurar archivo PHP, ya que con el enrollamiento puede falsificar encabezados.

53

Concluido ¡Respuesta después de googlear mucho!

Paso 1: Generar Sistema de emergencia para todo el Web-Service:

Generación de Token:

<?php 
    session_start(); 
    $token = md5(rand(1000,9999)); //you can use any encryption 
    $_SESSION['token'] = $token; //store it as session variable 
?> 

Paso-2: se utiliza al enviar llamada AJAX:

var form_data = { 
    data: $("#data").val(), //your data being sent with ajax 
    token:'<?php echo $token; ?>', //used token here. 
    is_ajax: 1 
}; 

$.ajax({ 
    type: "POST", 
    url: 'yourajax_url_here', 
    data: form_data, 
    success: function(response) 
    { 
    //do further 
    } 
}); 

Step-3 : Ahora, vamos a asegurar archivo controlador de PHP AJAX con,

session_start(); //most of people forget this while copy pasting code ;) 
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
    //Request identified as ajax request 

    if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") 
    { 
    //HTTP_REFERER verification 
    if($_POST['token'] == $_SESSION['token']) { 
     //do your ajax task 
     //don't forget to use sql injection prevention here. 
    } 
    else { 
     header('Location: http://yourdomain.com'); 
    } 
    } 
    else { 
    header('Location: http://yourdomain.com'); 
    } 
} 
else { 
    header('Location: http://yourdomain.com'); 
} 

NOTA: Lo siento por JERARQUIZADAS if..else, pero aumenta la comprensibilidad. PUEDE SIMPLIFICAR LOS TRES EN UNO SI NO. 85% de seguridad mejorada

+0

+1 para una respuesta clara, sucinta y efectiva :) –

+0

@ wardha-Web: muchas gracias :) –

+0

The $ token = md5 (rand (1000,9999)); línea hace que mi PHP local 20 segundos para volver a cargar la página. – arlg

0

acaba de establecer una sesión en la aplicación y comprobar si el isset sesión

session_start(); 
if(!isset($_SESSION['gebruikersnaam'])) { 
    header('Location: path/to/app/home'); 
} 
//Do stuff 

También puede utilizar esto:

if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
header('Location: path/to/app/home'); 
} 

pero no todos los navegadores apoyar HTTP_X_REQUESTED_WITH

para mayor seguridad, puede verificar si la llamada ajax está llegando de su aplicación

if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") { 
    header('Location: path/to/app/home'); 
}