it-swarm.com.de

PHP und AJAX Sicherheitsfrage

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

Meine Frage ist also, was der beste Weg wäre, damit die PHP -Datei, die 'ajaxed' ist, weiß, dass sie auf der richtigen Seite enthalten ist und korrekt funktioniert, aber wenn auf sie zugegriffen wird Anders ausgedrückt (selbst wenn jemand seine eigene Website und AJAX in meiner PHP -Datei) erstellen würde, sollte die Datei "Zugriff verweigert" oder etwas sagen.

Danke im Voraus

25
carter663

Abgeschlossene Antwort nach viel googeln!

Schritt-1: Token-System für alle Web-Services generieren:

Token generieren:

<?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, wenn Sie einen Ajax-Anruf 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: JETZT, sichern wir ajax handler PHP Datei mit,

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

ANMERKUNG: ENTSCHULDIGUNG FÜR EINGESCHNITTENE WENN ... NEIN, ABER ES ERHÖHT DIE VERSTÄNDIGKEIT. Sie können alle drei in einem Fall vereinfachen, wenn sonst. 85% verbesserte Sicherheit!

53
Hardik Thaker

Zitieren Eran Galperin aus einer ähnlichen Diskussion

Wie andere bereits gesagt haben, kann die Ajax-Anfrage Emuliert werden, indem die richtigen -Header erstellt werden. Wenn Sie eine grundlegende -Anforderung haben möchten, überprüfen Sie, ob es sich bei der Anforderung um eine Ajax-Anforderung (.____.) Handelt. Sie können Folgendes verwenden:

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

Sie sollten jedoch niemals Ihre - Sicherheit auf dieser Prüfung basieren. Es wird Direkte Zugriffe auf die Seite Eliminieren, wenn Sie das brauchen.

Bitte berücksichtigen Sie diese Antwort von Jeremy Ruten auch:

Es gibt keine Möglichkeit zu garantieren, dass Auf sie über AJAX zugreift. Sowohl der direkte Zugriff als auch der AJAX Zugriff Stammen vom Client, so dass dies möglich ist leicht gefälscht werden.

Warum willst du das sowieso?

Wenn der PHP-Code nicht sehr sicher ist, stellen Sie sicher, dass der PHP-Code sicherer ist. (Wenn beispielsweise Ihr AJAX Die Benutzer-ID an die Datei PHP übergibt, schreiben Code in die Datei PHP, um sicher, dass dies die richtige Benutzer-ID ist.)

Weitere kluge Gedanken in der oben verlinkten Diskussion.

10
middus

für die sichere Verbindung sind Ajax und PHP. erforderlich 

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

vergessen Sie nicht, PHP-Datei zu sichern, da mit cURL Header gefälscht werden kann.

5
user1180962

sie können Hotlinks auch blockieren, wenn Sie befürchten, dass andere ohne Ihre Zustimmung auf Ihre Inhalte zugreifen können

siehe: http://www.htmlbasix.com/disablehotlinking.shtml

2

JavaScript, das in einer anderen Domäne ausgeführt wird, kann auf keine Seite Ihrer Domäne zugreifen, da dies gegen die Same-Origin-Richtlinie verstößt. Der Angreifer muss eine XSS-Sicherheitsanfälligkeit ausnutzen, um die Sicherheitslücke zu schließen. Kurz gesagt, Sie brauchen sich nicht um diesen Angriff zu kümmern, sondern um dieselben alten Angriffe, die jede Webanwendung betreffen. 

2
rook

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

Niemand kann AJAX Ihre Site von einer anderen Domäne (Sicherheitsprobleme) _, kann jedoch immer eine HTTP-Anfrage herstellen und die Verbindung herstellen, z. B. über cURL.

Sie können in Cookies ein Token erstellen, das auch aus der Jquery-Anfrage ersichtlich ist. Diese Lösung kann jedoch auch gehackt werden.

1
Piotr Müller

legen Sie einfach eine Sitzung in der App fest und prüfen Sie, ob die Sitzung ausgegeben wird

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

Sie können dies auch 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-Aufruf von Ihrer App kommt

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