Comment vérifier si la demande est un AJAX? J'utilise CodeIgniter. J'ai un lien qui, lorsqu'il a cliqué, ouvrira la fenêtre de dialogue contextuelle, cela se fait via ajax, il demande à un nom de contrôleur login_window()
.
//Here is the controller name:
function login_window(){
// request via ajax
$this->load->view("login_window");
}
//here is the jquery code:
//I am using a jquery plugin FACEBOX
$('a[rel*=dialog]').facebox();
<a href="http://localhost/codeigniter/login_window" rel="dialog">Login</a>
Je veux vérifier s'il s'agit d'une demande AJAX et sinon, je vais les rediriger vers la page d'accueil. Il n'y a donc aucun moyen d'accéder à la page qui est uniquement destinée aux demandes ajax.
Si vous utilisez une bibliothèque qui envoie le X-Requested-With
en-tête, alors vous pouvez faire ...
if (strtolower(filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH')) === 'xmlhttprequest') {
// I'm AJAX!
}
Depuis Codeigniter 2.0, il est préférable d'utiliser $this->input->is_ajax_request()
Je pense que vous cherchez essentiellement à protéger vos API ajax contre l'accès direct par les utilisateurs. Vous voulez que les utilisateurs puissent accéder aux api ajax lorsqu'ils sont invoqués par votre propre code (javascript, etc.) mais les utilisateurs doivent se voir refuser l'accès s'ils essaient de toucher directement l'api.
Si vous êtes toujours à la recherche d'une solution parfaite (HTTP_X_REQUESTED_WITH n'est pas toujours fiable, car votre bibliothèque pourrait ne pas le prendre en charge. Même elle pourrait être supprimée par des mandataires si l'utilisateur est derrière un) essayez d'utiliser miettes pour protéger vos api ajax. Les miettes sont utilisées pour la validation du flux, ce qui garantit que les utilisateurs accèdent aux API via un flux prédéfini/prédéterminé et non directement.
Dans Codeigniter, nous pouvons utiliser
if(!$this->input->is_ajax_request()){ // check if request comes from an ajax
redirect(site_url('home'),'refresh'); // if the request is not coming from an ajax redirect to home controller.
}
Au lieu de détecter si votre demande était une demande ajax ou non (qui peut être n'importe quel verbe HTTP - GET/POST/HEAD), vous pouvez essayer et ajouter/modifier des routes à votre routes.php
pour gérer spécifiquement ces scénarios.
Dans Yii vous cochez simplement
if (Yii::app()->request->isAjaxRequest)
Si vous utilisez jQuery ou une autre bibliothèque javascript majeure, cela fonctionne. Si vous faites des demandes personnalisées, n'oubliez pas de définir X-Requested-With
En-tête HTTP vers XMLHttpRequest
.
Codeigniter a une fonction intégrée pour vérifier si la demande est faite en utilisant l'appel Ajax.
Vous pouvez utiliser la méthode suivante pour valider si un controller/segment
Est appelé à l'aide d'Ajax ou non.
<?php
Class Only_ajax extends CI_controller{
function validate_user()
{
/*
* Check if URL only_ajax/validate_url is called from ajax
* if not display not found error to user.
*
**/
if(!$this->input->is_ajax_request()){
show_404();
}
}
}
Vous pouvez également utiliser de nombreux autres contrôles en utilisant la classe input
. Peu d'entre eux sont
$this->input->get_request_header();
$this->input->is_cli_request()
$this->input->ip_address()
Vous pouvez voir la liste complète des méthodes disponibles sur Documentation officielle