Suchen Sie in CodeIgniter nach Ajax-Anfragen

Lesezeit: 4 Minuten

Benutzer-Avatar
Dr.Kameleon

Ich bin in einem PHP-Skript und möchte überprüfen, ob die Anfrage eine Ajax-Anfrage ist. (Grundsätzlich, um KEINEN direkten Skriptzugriff zuzulassen, außer Ajax-Aufrufen.)

Also definiere ich IS_AJAX irgendwo in der Hauptsache index.php Datei:

define('IS_AJAX', 
       isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
       strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');

Und dann überprüfe es oben in meinem Skript:

if (!IS_AJAX) exit('No direct script access allowed');

Da ich neu bei CodeIgniter bin, würde ich gerne wissen:

  • Gibt es eine solche eingebaute Funktionalität?
  • Gibt es eine elegantere Möglichkeit?

Sie können verwenden $this->input->is_ajax_request() von dem Eingang Klasse:

if (!$this->input->is_ajax_request()) {
   exit('No direct script access allowed');
}

  • is_ajax_request() ist keine Sicherheitsmaßnahme. Es gibt eine ähnliche Antwort, bei der stattdessen 404 zurückgegeben wird, was einen irreführenden Eindruck vermieden hätte. (HTTP/1.1 „Dieser Statuscode wird häufig verwendet, wenn der Server nicht genau angeben möchte, warum die Anfrage abgelehnt wurde, oder wenn keine andere Antwort anwendbar ist“) stackoverflow.com/questions/6555652/…

    – Quellejedi

    3. Oktober 2012 um 11:04 Uhr

  • Ich verwende normalerweise die Lademethode, um Dateien zu laden. Wie kann ich verhindern, dass diese Dateien direkt geladen werden?

    – Dheeraj Thedijje

    12. August 2016 um 4:07 Uhr

Es gibt keine Notwendigkeit, ein hinzuzufügen if (!$this->input->is_ajax_request()) zu jeder AJAX-Methode wenn du benutzt Haken (CI-Dokumentation). Dies basiert auf Jörg‘s Lösung hier mit ein paar leichten Verbesserungen:

config/config.php

Aktivieren Sie CI-Hooks, indem Sie den Standardwert ändern (von FALSE):

$config['enable_hooks'] = TRUE;

config/hooks.php

Fügen Sie am Ende Folgendes hinzu:

$hook['post_controller_constructor'] = array(
    'class' => 'Ajax_only',
    'function' => 'show_404_on_illegal_ajax',
    'filename' => 'Ajax_only.php',
    'filepath' => 'hooks'
);

post_controller_constructor: Wird unmittelbar nach der Instanziierung Ihres Controllers aufgerufen, aber bevor irgendwelche Methodenaufrufe stattfinden

config/ajax_methods.php

Erstellen Sie eine neue Konfigurationsdatei mit allen Controllern und Methoden, die nur aufgerufen werden sollten, wenn eine AJAX-Anfrage gestellt wird:

<?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

Erstellen Sie den Hook selbst, der erkennt, ob der aktuelle Controller und/oder seine Methoden in der neuen Konfigurationsdatei oben vorhanden sind. Wenn dies der Fall ist, wird die 404-Standardseite angezeigt, wenn die aktuelle Anforderung nicht AJAX ist und die Methode/der Controller eine hat Wahrheit Wert in der Konfig:

<?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();
    }
  }
}

  • Ich denke, dies ist ein besserer Weg, um dieses Konzept bei großen Projekten umzusetzen.

    – Silambarasan RD

    5. Dezember 2019 um 7:05 Uhr

Benutzer-Avatar
Jörg Andrés

Wenn Sie die Anforderungen Ihrer Codeigniter-App anpassen möchten, versuchen Sie Folgendes: Sie müssen einen Hook namens Ajax_only.php im Ordner application/hooks erstellen

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
 *      ]
 * ]
 */

Und konfigurieren Sie Ihre Datei application/config/hooks.php

$hook['post_controller_constructor'] = array(
    'class' => 'Ajax_only',
    'function' => 'eval_request',
    'filename' => 'Ajax_only.php',
    'filepath' => 'hooks'
);

  • Das funktioniert super toll Jorge! Buchstäblich ein Zeilenschoner (muss nicht sein is_ajax_request() ifs in jeder Methode). Ich habe einige Anpassungen an Ihrer Lösung vorgenommen und einige Details in einer neuen Antwort hinzugefügt. Vielen Dank für den Einblick!

    – CPHPython

    16. April 2018 um 12:40 Uhr


  • Es ist eine große Verbesserung, die Sie CPHPython gemacht haben, danke für Ihre Worte!

    – Jorge Andrés

    5. Juli 2018 um 3:39 Uhr

1206120cookie-checkSuchen Sie in CodeIgniter nach Ajax-Anfragen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy