Biztonságos ajax hívások használata Drupal 7 környezetben

Default book

1. Szerver oldalon generálok egy sóval egy tokent és azt $_SESSION változóba teszem valahogy így:

$_SESSION['tid'] = $token = drupal_get_token('Ez itt a só');

2. Ezt a tokent kiíratom a kliens oldalra, mint javascript változót:

<?php print ("<script type='text/javascript'> var tid = ".$token."; </script> "); ?>

3. Amikor ajax hívást indítok a kliens oldalról, akkor paraméterként hozzácsapom a javascript változó értékét (ez itt egy jquery példa):

....
$.post("http://foo.hu/ajax.php", {muvelet: "frissites", id: id,token:token},function (data){
  alert(data);
});
....

4. A szerver oldalon az ajax.php először lefuttatja a Drupal inicializálást, majd majd ellenőrzi, hogy létezik-e a küldött tokenhez tartozóan session a sessions táblában, mert ha van, akkor betölti a session useréhez tartozó user paramétereit és végül beállítja a jogosultságokat:

<?php
//Drupal szükséges moduljainak betöltése
drupalize();
session_start();
function drupalize() {    
  while (!@stat('./includes/bootstrap.inc')) {
    chdir('..');        
  }    
  require_once './includes/bootstrap.inc';
  require_once './includes/file.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
}
//Token átvétele, user ellenőrzése, user betöltése

if( isset($_REQUEST['token'])){
  $token =$_REQUEST['token'];
  $sql= "select uid FROM {sessions} WHERE session LIKE '%%s%'";
  $uid = 0;
  $rs =db_query($sql, $token);
  if($row = db_fetch_array($rs)){
    $uid = $row['uid'];
  }

  //User betöltése, ha van ilyen user
  $user_load($uid);

  //User jogosultságok ellenőrzése  
  if(user_access("edit valami") or user_access("administer valami"))
   ............. itt lehet az adatázis módosítását elvégezni ...............
  }
}
?>