par
naholyr » 29 janv. 2009, 21:59
Tu ne pourras jamais mettre en place une protection de ce type. Une page appelée en Ajax est forcément et par définition accessible par le navigateur, donc tu ne peux pas l'empêcher de s'afficher dans un navigateur
Le plus efficace cependant est d'ajouter à toutes tes requêtes Ajax une entête HTTP spécifique.
Par exemple, Ajax.Request de Prototype.js ajoute l'entête
'X-Requested-With': 'XMLHttpRequest', (ligne 1243 de la version 1.6.0.2), et aussi une entete X-Prototype-Version au passage.
Du coup il te suffit de faire ce type de test côté PHP :
if (@$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
// Appel Ajax
} else {
// Appel direct
}
C'est à peu près ce qu'il y a de plus sûr dans le sens où l'envoi d'un entête spécifique est moins facile à faire que l'envoi d'une variable GET ou POST, même si ça reste très accessible (n'importe quel développeur web avec un tamperData sur son firefox peut le faire).
Tu ne pourras jamais mettre en place une protection de ce type. Une page appelée en Ajax est forcément et par définition accessible par le navigateur, donc tu ne peux pas l'empêcher de s'afficher dans un navigateur ;)
Le plus efficace cependant est d'ajouter à toutes tes requêtes Ajax une entête HTTP spécifique.
Par exemple, Ajax.Request de Prototype.js ajoute l'entête [b]'X-Requested-With': 'XMLHttpRequest',[/b] (ligne 1243 de la version 1.6.0.2), et aussi une entete X-Prototype-Version au passage.
Du coup il te suffit de faire ce type de test côté PHP :
[php]
if (@$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
// Appel Ajax
} else {
// Appel direct
}
[/php]
C'est à peu près ce qu'il y a de plus sûr dans le sens où l'envoi d'un entête spécifique est moins facile à faire que l'envoi d'une variable GET ou POST, même si ça reste très accessible (n'importe quel développeur web avec un tamperData sur son firefox peut le faire).