wake-up-neo.net

Ajax erkennen in PHP und sicherstellen, dass die Anfrage von meiner eigenen Website stammt

Ich verwende mein PHP Backend, um AJAX -Anfragen zu erkennen, indem ich nach einem Wert in $_SERVER['HTTP_X_REQUESTED_WITH'] suche.

Dies gibt mir eine zuverlässige Erkennung und stellt sicher, dass die Anforderung mit AJAX-Techniken erfolgt.

Wie kann ich sicherstellen, dass die Anfrage von meiner eigenen Domäne stammt und nicht von einer externen Domäne/einem externen Roboter?

www.example.com/ajax?true kann es jedem ermöglichen, einen AJAX - Anruf zu tätigen und die Informationen abzuschneiden.

Ich könnte Sitzungen für jeden erstellen, der normal auf meine Website geht, und dann AJAX -Anrufe zulassen. Dies kann jedoch auch vorgetäuscht werden.

Ist es heutzutage überhaupt noch wichtig?

46
Yossi

Lass dich Controller

  • zugriffstoken generieren
  • in der Sitzung für späteren Vergleich speichern

In deiner Sicht

  • deklarieren Sie das Zugriffstoken als JS-Variable
  • senden Sie das Token mit jeder Anfrage

Zurück in Ihrem Controller

  • validieren Sie HTTP_X_REQUESTED_WITH
  • token validieren

Überprüfen Sie diese Sicherheits- Richtlinien von OpenAjax .
Lesen Sie auch den Artikel über codinghorror.com Annie.

32
Gordon

Sie können den HTTP_REFERRER überprüfen, aber nicht von allen Browsern festgelegt. Am besten schreiben Sie einen Wrapper für Ihre Ajax-Aufrufe auf der JavaScript-Seite, der einen Teil von document.cookie an den Server zurücksendet - nur Ihre Domäne hat Zugriff auf das Cookie. Sie können den Cookie in den Request-Headern mit dem Cookie im Aufruf AJAX in PHP vergleichen.

Als Antwort auf "ist es heutzutage sogar wichtig" - JA, das tut es! Lesen Sie dies .

23
Annie

Zu Ihrer letzten Frage: "Ist es heutzutage überhaupt wichtig?" Dies ist eine Frage von Fall zu Fall. Wenn die Ajax-Anforderung etwas unternimmt, für das keine Sicherheit erforderlich ist (z. B. das Laden der letzten Aktienkurse), ist dies IMHO wirklich egal. Wenn die Anforderung Informationen enthält, die gesichert werden sollen (z. B. Identifizieren von Informationen zurückgeben oder auf dem Server etwas unternehmen), sollten Sie sie als solche behandeln. 

Ich persönlich verwende die Servervariablen nicht, um zu wissen, wann etwas eine Ajax-Anforderung ist. Stattdessen füge ich dem ajax-Aufruf einfach einen Abfrageparameter hinzu (z. B. http://domain.com/?ajax=true ). Wenn ich den Ajax-Anruf sichern muss, würde ich dieselben Methoden verwenden wie eine reguläre Seitenanfrage (sowohl mit Client als auch mit Server). Wie Lucas Oman ausführte, kann alles auf der Kundenseite gefälscht werden. Grundsätzlich trauen Sie keiner Anfrage zu, auch wenn Sie der Meinung sind, dass sie von Ihrer Site oder Datenbank stammt. Folgen Sie immer dem Mantra "Filtereingang - Fluchtausgang". 

6
Jim

David Walsh hat eine gute Lösung

/* 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.... */
3
Ben Shelock

Der sicherste Weg, dies zu tun, ist wirklich, wie Sie vorgeschlagen haben, serverseitige Sitzungen zu verwenden, da diese nicht so erstellt werden können wie Cookies.

Zugegeben, jemand kann immer noch eine Sitzungs-ID hijacken, aber wenn Sie auch die IP-Adresse des Benutzers in seiner Sitzung speichern und bei jeder Anforderung überprüfen, können Sie viele Hijacks herausfischen. Nur jemand im selben LAN oder Proxy konnte es hijacken.

Jede andere erwähnte Methode - Cookies, Javascript, HTTP-Verweiser - hängt von clientseitigen Daten ab, die unsicher sind und immer im Verdacht stehen, gefälscht, gefälscht, entführt und in böswilliger Absicht konstruiert zu werden.

2
Lucas Oman

Verwenden Sie POST gesicherte Anforderungen für Sitzungen:

Innerhalb der Webseite (z. B. index.php) müssen wir die sessionid speichern

<?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>

Die Ajax-Anfragen (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' ];
});

Verantwortliche PHP-Seite:

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 ) );
}
1
v4d

Überprüfen Sie den $_SERVER['HTTP_REFERER']. Dies funktioniert in vielen Fällen, sollte aber für eine absolut sichere Lösung nicht verwirrt werden.

0
Sampson