una propio profesional pasos paso para pagina gratis dominio crear con como php ajax security

php - propio - crear pagina web profesional



Detectando Ajax en PHP y asegurándome de que la solicitud fuera de mi propio sitio web (7)

Compruebe el $_SERVER[''HTTP_REFERER''] . Esto funcionará en muchos casos, pero no debe confundirse para una solución completamente segura.

Uso mi back-end PHP para detectar solicitudes AJAX al buscar un valor en $_SERVER[''HTTP_X_REQUESTED_WITH''] .

Esto me da una detección confiable, asegurándome de que la solicitud se haga utilizando técnicas AJAX.

¿Cómo puedo asegurarme de que la solicitud proviene de mi propio dominio y no de un dominio / robot externo?

www.example.com/ajax?true podría permitirle a cualquiera hacer una llamada AJAX y cortar la información.

Podría hacer sesiones para todos los que entren en mi sitio web normalmente, y luego permitir las llamadas AJAX ... pero eso también se puede fingir.

¿Incluso importa estos días?


David Walsh tiene una buena solution

/* decide what the content should be up here .... */ $content = get_content(); //generic function; /* AJAX check */ if(!empty($_SERVER[''HTTP_X_REQUESTED_WITH'']) && strtolower($_SERVER[''HTTP_X_REQUESTED_WITH'']) == ''xmlhttprequest'') { /* special ajax here */ die($content); } /* not ajax, do more.... */


Dejarte Controlador

  • generar token de acceso
  • almacenar en sesión para una comparación posterior

En tu vista

  • declarar el token de acceso como variable JS
  • envía el token con cada solicitud

De vuelta en tu controlador

  • validar HTTP_X_REQUESTED_WITH
  • validar token

Verifique estas pautas de seguridad de OpenAjax .
Además, lea el artículo sobre codinghorror.com Annie linked.


En cuanto a su última pregunta: "¿Incluso importa, en estos días?" Esta es una pregunta caso por caso. Si la solicitud de AJAX está haciendo algo que no requiere seguridad (por ejemplo, cargar las últimas cotizaciones), realmente no importa en mi humilde opinión. Si la solicitud está cargando información que debería asegurarse (por ejemplo, devolver información de identificación o hacer algo en el servidor), entonces debe tratarla como tal.

Personalmente, no uso las variables del servidor para saber cuándo algo es una solicitud de Ajax. En su lugar, solo agregué un parámetro de consulta a la llamada ajax (por ejemplo, http://domain.com/?ajax=true ). Si necesito asegurar la llamada ajax, utilizaría los mismos métodos que para asegurar una solicitud de página normal (utilizando tanto el cliente como el servidor). Como señaló Lucas Oman, cualquier cosa del lado del cliente puede ser falsificada. En resumen, no confíe en ninguna solicitud, incluso si cree que proviene de su sitio o base de datos. Siempre siga la "entrada de filtro mantra" - salida de escape ".


En realidad, la forma más segura de hacerlo es, como sugirió, utilizar sesiones del lado del servidor, ya que no se pueden crear como las cookies.

Por supuesto, alguien aún puede secuestrar una identificación de sesión, pero si también almacena la dirección IP del usuario en su sesión y la comprueba en cada solicitud, puede eliminar muchos secuestros. Solo alguien en la misma LAN o proxy podría secuestrarlo.

Cualquier otro método mencionado - cookies, javascript, http referer - depende de los datos del lado del cliente, que es inseguro y siempre debe sospecharse que es falso, falsificado, secuestrado y construido maliciosamente.


Puede verificar el HTTP_REFERRER, pero no todos los navegadores lo configuran. La mejor manera es escribir un contenedor para tus llamadas ajax en el lado de JavaScript que envíe parte de document.cookie al servidor; solo tu dominio tiene acceso a la cookie. Puede comparar la cookie en los encabezados de solicitud con la cookie en la llamada AJAX en php.

En respuesta a "incluso importa, estos días" - ¡SÍ, lo hace! Lee esto


Utilice las solicitudes protegidas de la sesión POST:

Dentro de la página web (por ejemplo, index.php) tenemos que almacenar el sessionid

<?php // Create Session $session = session_id(); if(empty($session)) session_start(); ?> <head> ... <script type="text/javascript"> sid = ''<?php echo session_id(); ?>''; </script> <script type="text/javascript" src="ajaxrequest.js"></script> ... </head>

Las solicitudes de ajax (ajaxrequest.js)

/* simple getAjax function * @param $url request url * @param $param parameter (dont use ?) * @param callback function on success */ var spinnerid = ''#spinner''; // Spinner as long ajax requests running $(document).ajaxStart(function() { $(spinnerid).show(); }); $(document).ajaxStop(function() { $(spinnerid).hide(); }); function getAjax( url, param, callback ) { var data = null; url += "?sid=" + sid + "&" + param; $.ajax({ url: url, method: "POST", // uncomment to use GET, POST is secured by session cache: false, async: true, success : function(data){ callback(data); }, } getAjax( ''http://domain.com/'', ''data=foo'', function( data ) { // do stuf with data var jsonobj = eval("(" + data + ")"); var data = jsonobj[0][ ''data'' ]; });

Lado responsable de php:

if( isset( $_GET[''sid''] ) ) $client_sid = $_GET[''sid'']; if( session_id() == null ) session_start(); if( session_id() != $client_sid ) { // noID or wrongID, redirect to mainindex ignore_user_abort(true); header( "HTTP/1.1 403 Forbidden" ); header("Connection: close", true); exit; } else { // get data if( isset( $_GET[''data''] ) ) { $data = $_GET[''data'']; } else if( isset( $_POST[''data''] ) ) { $data = $_POST[''data'']; } else { $data = null; } // do stuff with data // return data as json $resp[0][''data''] = $data; print_r( json_encode( $resp ) ); }