2010-08-26 18 views
8

Por ejemplo, cuando quiero actualizar una parte de mi página con AJAX, normalmente hago la llamada correspondiente a getPost.php, que devolvería el marcado para insertarlo en mi página. ¿Hay alguna manera de evitar que un usuario acceda a esta página directamente (por ejemplo: example.com/getPost.php con los argumentos GET o POST apropiados) y obtener solo una parte de la página, ya que esto debe usarse con AJAX como parte de un todo , ¿no solo?¿Hay alguna forma de evitar que las páginas de AJAX se vean solos en un navegador?

No creo que se puedan establecer permisos en el archivo ya que es el cliente que solicita la página, pero ¿hay alguna manera de hacerlo al pasar un argumento adicional que puede servir como un dígito de verificación de tipo.

+0

Sin motivo en particular. No es algo que deba ser súper seguro, pero sí suficiente para que el usuario no tropiece con una parte de una página web en lugar de con la totalidad. O al menos para que alguien no envíe solicitudes a una página php que envía información a una base de datos. – alexcoco

Respuesta

8

Puede echar un vistazo a los encabezados de solicitud e imponer que se establezca un encabezado para las solicitudes AJAX (a menudo las personas usan X-Requested-With con un valor como XMLHttpRequest). Tenga en cuenta que este encabezado no se establecerá a menos que lo configure usted mismo cuando realice su solicitud AJAX (o use una biblioteca Javascript que lo haga automáticamente). Sin embargo, no hay forma de garantizar que alguien no agregue ese encabezado por su cuenta si así lo desean.

El valor del encabezado X-Requested-With se puede encontrar en $_SERVER['HTTP_X_REQUESTED_WITH'].

+0

Gracias por la respuesta rápida, ¡no sabía de esto! – alexcoco

3

Puede marcar el encabezado $ _SERVER ['HTTP_X_REQUESTED_WITH']. Debería ser igual al valor 'XMLHttpRequest' si es una solicitud de Ajax.

Editar - como dijo Daniel Vandersluis, no hay forma de hacer cumplir esto completamente. Puede falsificar el agente de usuario, el remitente, cualquier cosa que entre con la solicitud.

1

Dado que no hay forma de estar 100% seguro de quién hace la pregunta, puede restringirla.

La implementación de esto dependerá de la página, por supuesto.

Por ejemplo, digamos que está ejecutando el comando curl en una url, puede restringir la variable entrante a un dominio determinado.

<?php 
if (substr($_GET["url"], 0, 19) !== "http://example.com/") 
{ 
    die(); 
} 
// otherwise carry on 
?> 
1

¿No debería esto hacer?

if(preg_match("/getPost\.php/", $_SERVER['PHP_SELF'])){ 
    // Access to file directly, quit.. 
    die(); 
} 
+0

Del manual: '$ _SERVER ['PHP_SELF'] en una secuencia de comandos en la dirección http://example.com/test.php/foo.bar sería/test.php/foo.bar' ... que realmente no ayuda, ya que solo da la página AJAX. El script que se llama es la página de AJAX, no la página de solicitud original. –

2

lo que cada vez que usted solicite al servidor, se almacena la información en $_SERVER variables

para comprobar qué información esta variable almacena tratan este uso

print_r($_SERVER); 

//you will see the difference in http and ajax request 

esta variable para comprobar como bramido

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //ajajx request 
} 
else { 
    //not an ajajx request 
} 
0

Creo que puede (al menos parcialmente) resolver su problema m con criptografía.

Supongamos que tiene una página main.php que incluye JS para llamar a otra página llamada ajax.php. Cuando se accede a la página main.php, use un $browserKey y un $salt para crear un $_SESSION["tempHash"]. (También necesita almacenar la sal). A continuación, proporcione la clave del JavaScript que hace la solicitud a su página ajax.php, y verifique que la clave y la sal den el mismo hash que antes.En main.php, hacer algo como esto:

<?php 
session_start(); 
// authorize user here 
$salt = time(); 
$browserKey = mt_rand(); 
$hash = sha1("$browserKey$salt"); 
$_SESSION["tempSalt"] = $salt; 
$_SESSION["tempHash"] = $hash; 
// ... code ... 
?> 
<!doctypehtml> 
<html> 
<!-- html --> 
<script> 
// ... ajax call ... 
var params = "param1=val1&param2=val2&...&browserKey=<?= $browserKey ?>"; 
request.send(params); 
</script> 
</html> 
<?php session_write_close(); ?> 

Luego, el ajax.php, sólo tiene que hacer

<?php 
$validated = false; 
if(sha1($_POST["browserKey"] . $_SESSION["tempSalt"]) === $_SESSION["tempHash"]) { 
    $validated = true; 
} 
// and unset the salt and hash 
$_SESSION["tempSalt"] = $_SESSION["tempHash"] = null; 
if(!$validated) { 
    // taken from another SO answer: 
    // http://stackoverflow.com/a/437294/2407870 
    header('HTTP/1.0 404 Not Found'); 
    echo "<h1>404 Not Found</h1>"; 
    echo "The page that you have requested could not be found."; 
    exit(); 
} 
// else, continue normal processing here 
?> 

No soy un experto en este campo, así que tome mi consejo con un grano de sal . (Heh, broma de criptografía.)

Una vulnerabilidad potencial con este enfoque es que la persona puede cargar la página main.php y luego esperar cinco horas y llamar a la página ajax.php. Sin embargo, solo les permitirá acceder a él una vez. Y puedes hacer otras cosas para evitar esto. Por ejemplo, verifique la sal (que se obtuvo con time()) para verificar que no haya pasado demasiado tiempo. O incluso envía latidos periódicos al servidor, que generan un nuevo hash, salt y key, devolviendo la nueva clave al navegador.

Cuestiones relacionadas