web-dev-qa-db-fra.com

PHP et AJAX Question de sécurité

Je suis en train de créer une application Web dans laquelle PHP fichiers sont chargés dans un fichier principal à l'aide de la fonction $ .ajax de jQuery. Cependant, les fichiers PHP sont évidemment toujours accessibles en dehors de l'application, en tapant simplement le nom du fichier dans la barre d'adresse.

Ma question est donc de savoir quel serait le meilleur moyen de faire en sorte que le fichier PHP en cours de «ajaxed» dans sache qu'il est contenu dans la page correcte et qu'il fonctionnera correctement. Autrement (même si quelqu'un crée son propre site Web et AJAX dans mon fichier PHP), le fichier doit alors indiquer "accès refusé" ou quelque chose du genre.

Merci d'avance

25
carter663

Réponse terminée après avoir beaucoup cherché sur Google!

Étape 1: générer le système de jetons pour tout le service Web:

Générateur de jeton:

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

Étape 2: utilisez-le pour envoyer un appel ajax:

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

Étape 3: MAINTENANT, sécurisons le fichier PHP du gestionnaire ajax avec,

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

REMARQUE: DÉSOLÉ DE ÊTRE INDIQUÉ SI..ELSE, MAIS CELA AUGMENTE L’INSCRIT. VOUS POUVEZ SIMPLIFIER TOUT EN TROIS EN UN SI CELA EST. 85% de sécurité améliorée!

53
Hardik Thaker

Citant Eran Galperin extrait d'un article similaire discussion

Comme d’autres l’ont dit, la demande Ajax peut être imitée en créant les en-têtes appropriés. Si vous voulez avoir une vérification de base Pour savoir si la demande est une demande Ajax , Vous pouvez utiliser:

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

Cependant, vous ne devriez jamais baser votre sécurité Sur cette vérification. Cela supprimera Les accès directs à la page Si c'est ce dont vous avez besoin.

Veuillez prendre cette réponse de Jeremy Ruten également en compte:

Il n’ya aucun moyen de garantir que Ils y ont accès via AJAX. L’accès direct et AJAX l’accès Proviennent du client; facilement être falsifié.

Pourquoi voulez-vous faire ça quand même?

Si c'est parce que le code PHP n'est pas Très sécurisé, sécurisez davantage le code PHP. (Par exemple, si votre AJAX passe l'identifiant de l'utilisateur dans le fichier PHP, écrivez du code dans le fichier PHP pour créer que c’est le bon identifiant d’utilisateur.)

Pensées plus intelligentes dans la discussion liée ci-dessus.

10
middus

une certaine manière sont nécessaires pour la connexion sécurisée ajax et php. vous pouvez utiliser 

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

n'oubliez pas de sécuriser le fichier php car avec cURL peut usurper des en-têtes.

5
user1180962

vous pouvez également bloquer les hyperliens si vous craignez que d'autres personnes puissent accéder à votre contenu sans votre accord.

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

2
Christian Smorra

Le JavaScript en cours d'exécution sur un autre domaine ne peut accéder à aucune page de votre domaine, car il s'agit d'une violation de la règle Même origine . L’attaquant aurait besoin d’exploiter une vulnérabilité XSS pour pouvoir la récupérer. En bref, vous n'avez pas à vous soucier de cette attaque spécifique, mais des anciennes attaques qui affectent toutes les applications Web. 

2
rook

Ce n'est pas simple et il n'y a probablement aucun moyen de le faire. Vous pouvez exiger certaines variables POST dans votre fichier php et les envoyer dans votre demande AJAX. Cela vous protégera de quelqu'un qui colle simplement l'URL dans son navigateur.

Personne ne peut AJAX votre site à partir d'un autre domaine (problèmes de sécurité), mais peut toujours se connecter et envoyer une requête http à la dérive, par exemple par cURL.

Vous pouvez créer des jetons dans les cookies, qui seront également visibles à partir de la requête jQuery, mais cette solution peut également être piratée.

1
Piotr Müller

il suffit de définir une session dans l'application et de vérifier si la session isset

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

Vous pouvez aussi utiliser ceci:

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

mais tous les navigateurs ne supportent pas HTTP_X_REQUESTED_WITH

pour plus de sécurité, vous pouvez vérifier si l'appel ajax provient de votre application

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