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?
27
demandé sur Striezel 2012-07-27 15:49:28

3 réponses

Vous pouvez utiliser $this->input->is_ajax_request()entrée catégorie:

if (!$this->input->is_ajax_request()) {
   exit('No direct script access allowed');
}
108
répondu Yan Berk 2012-07-27 11:50:50

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();
    }
  }
}
3
répondu CPHPython 2018-04-16 12:39:30

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'
);
2
répondu Jorge Andrés 2017-04-19 00:43:41