2012-07-27 15 views
22

Ich bin in einem PHP-Skript und ich möchte überprüfen, ob die Anfrage eine Ajax-Anfrage ist. (Im Grunde um nicht direkt Skriptzugriff, andere als Ajax-Aufruf zu ermöglichen, ist ...)Check für Ajax Anfrage in Code Igniter

Also, ich bin definieren IS_AJAX irgendwo in der Haupt index.php Datei:

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

Und dann überprüft an der Spitze von meinem Skript:

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

Da ich zu CodeIgniter bin neu, ich bin nicht wirklich sicher ...

  • Gibt es eine solche integrierte Funktionalität?
  • Gibt es eine mehr ... elegante Art, es zu tun?

Antwort

97

Sie $this->input->is_ajax_request() aus der input Klasse verwenden:

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

Großartig! Ich wusste, dass ich etwas verpassen könnte ... Vielen Dank, Kumpel! –

+2

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 Anforderung abgelehnt wurde oder keine andere Antwort möglich ist") http://stackoverflow.com/questions/6555652/controller- Methoden-die-nur-aufgerufen-by-ajax-make-private/8072539 # 8072539 – sourcejedi

+0

Ich verwende normalerweise load-Methode, um Datei zu laden, wie kann ich verhindern, dass diese Datei direkt geladen wird? –

0

, wenn Sie die Wünsche von den codeigniter App anpassen möchten, versuchen Sie dies: Sie müssen einen Haken erstellen namens Ajax_only.php in application/Haken

Ordner
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 Anwendung/config/hooks.php Datei

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