PHPスクリプトで、リクエストがAjaxリクエストであるかどうかを確認したいです(基本的に、Ajax呼び出し以外のスクリプトへの直接アクセスを許可しないため)。
だから、私はIS_AJAX
メインのどこかindex.php
ファイル:
define('IS_AJAX',
isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
そして、私のスクリプトの上部でそれをチェックします:
if (!IS_AJAX) exit('No direct script access allowed');
私はCodeIgniterを初めて使用するので、知りたいと思います。
input クラスの$this->input->is_ajax_request()
を使用できます。
if (!$this->input->is_ajax_request()) {
exit('No direct script access allowed');
}
noがあります。if (!$this->input->is_ajax_request())
をすべてのAJAXメソッドに追加する必要がありますhooks(CI docs) 。これは、 -Jorge 's solution に基づいていますが、少し改善されています。
config/config.php
デフォルト値を変更して(FALSE
から)CIフックを有効にします。
$config['enable_hooks'] = TRUE;
config/hooks.php
最後に次を追加します。
$hook['post_controller_constructor'] = array(
'class' => 'Ajax_only',
'function' => 'show_404_on_illegal_ajax',
'filename' => 'Ajax_only.php',
'filepath' => 'hooks'
);
post_controller_constructor
:コントローラーがインスタンス化された直後に呼び出されますが、メソッド呼び出しが発生する前に
config/ajax_methods.php
AJAXリクエストが行われたときにのみ呼び出す必要があるすべてのコントローラーとメソッドを含む新しい構成ファイルを作成します。
<?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
フック自体を作成します。このフックは、現在のコントローラーやそのメソッドが上記の新しい構成ファイルに存在するかどうかを検出します。その場合、現在の要求がAJAXでなく、メソッド/コントローラーの構成にtruthy値がある場合、404デフォルトページが表示されます。
<?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();
}
}
}
codeigniterアプリからのリクエストをカスタマイズする場合は、これを試してください:application/hooksフォルダーにAjax_only.phpという名前のフックを作成する必要があります
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
* ]
* ]
*/
そして、application/config/hooks.phpファイルを設定します
$hook['post_controller_constructor'] = array(
'class' => 'Ajax_only',
'function' => 'eval_request',
'filename' => 'Ajax_only.php',
'filepath' => 'hooks'
);