2010-07-29 7 views
25

Ich baue derzeit eine Web-App, in der PHP-Dateien in eine Hauptdatei mit jQuery $ .ajax Funktion geladen werden. Die PHP-Dateien sind jedoch offensichtlich immer noch außerhalb der App zugänglich, indem Sie einfach den Dateinamen in die Adressleiste eingeben.PHP und AJAX Sicherheitsfrage

Also meine Frage ist, was wäre der beste Weg, es so zu machen, dass die PHP-Datei 'Ajaxed' in weiß, dass es in der richtigen Seite enthalten ist und richtig funktioniert, aber wenn es auf andere Weise zugegriffen wird (selbst wenn jemand eine eigene Website und AJAX in meiner PHP-Datei machen sollte), dann sollte die Datei "access denied" oder so etwas sagen.

Vielen Dank im Voraus

Antwort

10

Eran Galperin aus einem ähnlichen discussion

Zitiert Wie andere gesagt haben, kann Ajax-Request die richtigen Header erschaffen emuliert werden. Wenn Sie eine grundlegende Kontrolle haben, um zu sehen, ob die Anforderung eine Ajax Anfrage Sie verwenden können:

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

Allerdings sollten Sie nie stützen Ihre Sicherheit auf dieser Prüfung. Es wird direkte Zugriffe auf die Seite beseitigen, wenn das ist, was Sie brauchen.

Bitte nehmen Sie diese Antwort durch Jeremy Ruten auch zu berücksichtigen:

Es gibt keine Art und Weise ist gewährleistet, dass sie es durch AJAX sind erreichbar. Sowohl der Direktzugriff als auch der AJAX-Zugriff kommen vom Client, so dass es leicht gefälscht werden kann.

Warum möchten Sie das trotzdem tun?

Wenn es ist, weil der PHP-Code nicht ist sehr sicher, machen Sie den PHP-Code mehr sicher. (Zum Beispiel, wenn Ihr AJAX übergibt die Benutzer-ID an die PHP-Datei, Code schreibt in der PHP-Datei , um sicherzustellen, dass die richtige Benutzer-ID ist.)

Weitere kluge Gedanken in der Diskussion oben verlinkten .

+0

Wie also soll jemand mit einem XMLHttpRequest auf diese Seite zugreifen? Sind Sie sich der gleichen Herkunftsrichtlinie bewusst? – rook

+0

Ich kenne die gleiche Herkunftspolitik. Die Überprüfung auf XMLHttpRequest kann durchgeführt werden, um herauszufinden, ob das Skript über AJAX (d. H. Ein eigenes Skript) aufgerufen wurde oder ob jemand seinen Browser auf diesen Ort gerichtet hat. Der Aufruf des Skripts von der Firbug-Konsole Ihrer eigenen Website ist jedoch eine andere Geschichte. – middus

1

Es ist nicht einfach und wahrscheinlich gibt es keine Möglichkeit, das überhaupt zu tun. Sie können einige POST-Variablen in Ihrer PHP-Datei anfordern und sie in Ihrer AJAX-Anfrage senden. Dies schützt Sie vor jemandem, der einfach URL in seinen Browser einfügt.

Niemand kann AJAX Ihre Website von einer anderen Domäne (Sicherheitsprobleme), aber immer verbinden und driecty HTTP-Anfrage senden, zum Beispiel von cURL.

Sie können einige Token in Cookies erstellen, die auch von der jquery-Anfrage angezeigt werden, aber diese Lösung kann auch gehackt werden.

2

JavaScript auf einer anderen Domäne ausgeführt wird, kann keine Seite auf Ihrer Domain zugreifen, da dies eine ist Verletzung der Same-Origin Policy. Der Angreifer müsste eine XSS-Schwachstelle ausnutzen, um dies zu verhindern. Kurz gesagt, Sie müssen sich keine Gedanken über diesen spezifischen Angriff machen, nur die gleichen alten Angriffe, die jede Webanwendung betreffen.

5

einige Wege sind für die sichere Verbindung AJAX und PHP erforderlich. Sie verwenden können

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

vergessen Sie nicht PHP-Datei zu sichern, weil mit cURL Header fälschen kann.

53

Abgeschlossen Antwort nach dem googlen viel!

Step-1: Generieren Token-System für alle Web-Service:

Generierung von Token:

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

Schritt-2: Verwenden Sie es, während Ajax-Aufruf zu senden:

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

Schritt-3 :

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'); 
} 

HINWEIS Lassen Sie uns jetzt mit, Ajax-Handler PHP-Datei sichern: SORRY für geschachtelte if..else, aber es erhöht die Verständlichkeit. SIE KÖNNEN ALLE DREI IN EINEM VEREINFACHEN, WENN SONST. 85% Sicherheit verbessert!

+0

+1 für klare, prägnante und effektive Antwort :) –

+0

@ wardha-Web: vielen dank :) –

+0

Der $ token = md5 (rand (1000,9999)); line macht mein lokales PHP 20 Sekunden, um die Seite neu zu laden. – arlg

0

nur eine Sitzung in der App einstellen und überprüfen, ob die Sitzung isset

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

Sie können auch diese verwenden:

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

aber nicht alle Browser unterstützen HTTP_X_REQUESTED_WITH

Für zusätzliche Sicherheit können Sie überprüfen, ob der Ajax-Anruf aus Ihrer App kommt

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