Vérification de la requête Ajax en CodeIgniter
je suis dans un script PHP et je veux vérifier si la requête est une requête Ajax. (Essentiellement pour ne pas permettre l'accès direct au script, autre que les appels Ajax.)
Donc, je suis définir IS_AJAX
quelque part dans le main index.php
fichier:
define('IS_AJAX',
isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
Et puis de vérifier, au début de mon script:
if (!IS_AJAX) exit('No direct script access allowed');
puisque je suis nouveau à CodeIgniter, je voudrais savoir:
- Est-il une telle fonctionnalité intégrée?
- Est-il plus manière élégante de le faire?
3 réponses
Il y a pas besoin d'ajouter un if (!$this->input->is_ajax_request())
pour chaque méthode AJAX si vous utilisez crochets (CI docs). Ceci est basé sur Jorgesolution ici avec quelques légères améliorations:
config/config.php
activez les crochets CI en changeant la valeur par défaut (de FALSE
):
$config['enable_hooks'] = TRUE;
config/hooks.php
ajouter ce qui suit à la fin:
$hook['post_controller_constructor'] = array(
'class' => 'Ajax_only',
'function' => 'show_404_on_illegal_ajax',
'filename' => 'Ajax_only.php',
'filepath' => 'hooks'
);
post_controller_constructor
: appelé immédiatement après votre contrôleur est instancié, mais avant que n'importe quel appel de méthode ne se produise
config/ajax_methods.php
créer un nouveau fichier de configuration avec tous les controllers et méthodes qui ne devraient être invoqués que lorsqu'une requête AJAX est faite:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| References to all AJAX controllers' methods or the controller itself
|--------------------------------------------------------------------------
|
| Based on Jorge's solution: https://stackoverflow.com/a/43484330/6225838
| Key: controller name
| Possible values:
| - array: method name as key and boolean as value (TRUE => IS_AJAX)
| - boolean: TRUE if all the controller's methods are for AJAX requests
|
*/
$config['welcome'] = [
'index' => FALSE, // or 0 -> this line can be removed (just for reference)
'ajax_request_method_1' => TRUE, // or 1
'ajax_request_method_2' => TRUE, // or 1
];
$config['ajax_troller'] = TRUE;
hooks/Ajax_only.php
créer le crochet lui-même, qui détecte si le contrôleur actuel et / ou ses méthodes sont présents sur le nouveau fichier de configuration ci-dessus. Si c'est le cas, il affiche la page par défaut 404 lorsque la requête courante n'est pas AJAX et que la méthode/controller a un truthy valeur dans la configuration:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Ajax_only {
public function __construct()
{
$this->CI = &get_instance();
$this->CI->config->load('ajax_methods');
}
public function show_404_on_illegal_ajax()
{
$fetched_troller_val = $this->CI->config->item(
$this->CI->router->fetch_class()
);
$fetched_method = $this->CI->router->fetch_method();
$is_ajax_method = is_array($fetched_troller_val) &&
// verify if the method's name is present
isset($fetched_troller_val[$fetched_method]) &&
// verify if the value is truthy
$fetched_troller_val[$fetched_method];
// if the controller is not in the config file then
// config->item() returned NULL
if($fetched_troller_val !== NULL &&
$this->CI->input->is_ajax_request() === FALSE &&
($fetched_troller_val === TRUE || $is_ajax_method)
) {
show_404();
}
}
}
si vous voulez personnaliser les requêtes de votre application codeigniter, essayez ceci: Vous devez créer un crochet nommé Ajax_only.php dans le dossier application/hooks
class Ajax_only {
private $_controllers = [];
private $CI;
public function __construct() {
$this->CI =& get_instance();
}
public function eval_request() {
$controller = $this->CI->router->fetch_class();
$method = $this->CI->router->fetch_method();
if ( array_key_exists( $controller, $this->_controllers ) && $this->CI->input->is_ajax_request() === FALSE ) {
if ( ( $this->_controllers[ $controller ] === TRUE || ( is_array( $this->_controllers[ $controller ] ) && array_key_exists( $method, $this->_controllers[ $controller ] ) && $this->_controllers[ $controller ][ $method ] === TRUE ) ) ) {
show_404();
}
}
}
}
/*Examples
* $_controllers = [
* 'my_controller_name' => TRUE //all methods must be ajax
* 'my_controller_name => [
* 'method_name' => TRUE //only the selected methods must be ajax
* ]
* ]
*/
Et configurer votre application/config/crochets.fichier php
$hook['post_controller_constructor'] = array(
'class' => 'Ajax_only',
'function' => 'eval_request',
'filename' => 'Ajax_only.php',
'filepath' => 'hooks'
);