2012-07-27 9 views
22

Jestem w skrypcie PHP i chcę sprawdzić, czy żądanie jest żądaniem Ajax. (W zasadzie, tak aby nie dopuścić bezpośredni dostęp do skryptu, inne niż Ajax rozmowy, który jest ...)Sprawdź żądanie Ajax w Code Igniter

Tak, jestem definiowania IS_AJAX gdzieś w głównym index.php pliku:

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

A następnie sprawdzenie go na szczycie mojego skryptu:

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

Ponieważ jestem nowy na CodeIgniter, nie jestem pewien ...

  • Czy istnieje taka wbudowana funkcja?
  • Czy jest więcej ... elegancki sposób na zrobienie tego?

Odpowiedz

97

Można użyć $this->input->is_ajax_request() z klasy input:

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

Świetnie! Wiedziałem, że może mi brakować czegoś ... Wielkie dzięki, kolego! –

+2

is_ajax_request() nie jest miarą bezpieczeństwa. Istnieje podobna odpowiedź, gdy zamiast tego zwracane jest 404, co pozwoliłoby uniknąć mylnego wrażenia. (HTTP/1.1 "Ten kod statusu jest powszechnie używany, gdy serwer nie chce ujawnić, dlaczego żądanie zostało odrzucone lub kiedy nie ma innej odpowiedzi") http://stackoverflow.com/questions/6555652/controller- metody-to-są tylko wywoływane przez ajax-make-private/8072539 # 8072539 – sourcejedi

+0

zwykle używam metody ładowania do załadowania pliku, w jaki sposób zapobiec bezpośredniemu ładowaniu tego pliku? –

0

jeśli chcesz dostosować żądania z aplikacji CodeIgniter, spróbuj tego: należy utworzyć hak nazwie Ajax_only.php w application/haków Folder

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

i skonfigurować aplikację plik/config/hooks.php

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