私はPHPドキュメントを持っています。たとえばjsonarray.phpです。
このファイルは、いくつかのパラメーターが指定されている場合、連想配列のjson_encodeを返します。不要なユーザーが自分の目的でこのファイルにアクセスして使用することを禁止する必要があります。
これは可能ですか?
さらに、JavaScriptコードで作成するクライアント側のリクエストであることを指定したいと思います。
私はPHPドキュメントを持っています。たとえばjsonarray.phpです。
このファイルは、いくつかのパラメーターが指定されている場合、連想配列のjson_encodeを返します。不要なユーザーが自分の目的でこのファイルにアクセスして使用することを禁止する必要があります。
これは可能ですか?
さらに、JavaScriptコードで作成するクライアント側のリクエストであることを指定したいと思います。
別の PHP ファイルからこれを見ている場合は、BASEPATH
そこに定数を設定し、保護する必要があるすべてのファイルの先頭に次の行を追加できます。
defined('BASEPATH') OR exit('No direct script access allowed');
そのファイルがその特定のファイルからアクセスされる場合、BASEPATH
設定され、すべてが機能します。ただし、何らかの URL に直接アクセスしようとすると、スクリプトが終了します。
Javascriptからこれを呼び出す場合-他のオプションは、nonce
基本的にランダムに生成された単一のリクエストに対して有効な一意のトークンであるすべてのJavaScriptリクエストにトークンを追加することです。詳細については、クロスサイト リクエスト フォージェリ (CSRF) 防止チート シートを参照してください。
これはここから取った例です:
function create_api_key(){
return base64_encode(base64_encode($this->encrypt(time().'X'.$_SERVER['REMOTE_ADDR'])));
}
function check_api_key($key,$timeout=5){
if(empty($key)){ exit('Invalid Key'); }
$keys=explode('X',$this->decrypt(base64_decode(base64_decode($key))));
if (isset($key) && isset($keys[0]) && $keys[0] >= (time()-$timeout) &&
isset($keys[1]) && $keys[1] == $_SERVER['REMOTE_ADDR']){
return true;
}else{
return false;
}
}
function encrypt($value){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 'SECURE_KEY', $value, MCRYPT_MODE_ECB, $iv);
}
function decrypt($value){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 'SECURE_KEY', $value, MCRYPT_MODE_ECB, $iv));
}
}
$csrf = new csrf_check();
if(!empty($_GET['do'])){
$do = $_GET['do'];
switch($do){
//example.com?do=get - a key for the request
case "get":
echo $csrf->create_api_key();
break;
case "check":
//key only lasts 30 secs & validate key passed
//example.com?do=get&key=MEV6NXk4UjVRQXV5Qm1CMjBYa3RZZUhGd2M0YnFBUVF0ZkE5TFpNaElUTT0=
if(!empty($_GET['key']) && $csrf->check_api_key($_GET['key'],30)){
exit('Key valid');
}else{exit('Key invalid');}
break;
default:
exit('Request invalid');
break;
}
}
特定のパラメータを要求するのと同じくらい単純なもの$_GET
で十分かもしれません-
if (isset($_GET['password']) && $_GET['password'] == "your_password"){
}else{
die('access denied!');
}
このPHPファイルにアクセスできるようにするために必要なのは、URLにパスワードを追加することだけです。
http://yourcoolsite.com/jsonarray.php?password=your_password
パラメータのキーとして「パスワード」を使用しないことをお勧めします。むしろ、それを別の何かと呼びます。それがパスワードであることがすぐにはわからないように、少し難読化されたものです。
http://yourcoolsite.com/jsonarray.php?mpwyour_password
これは可能ですか?
いいえ。
javascript からそのファイルにリクエストを行うと、ブラウザからアクセスできる必要があるためです。あなたはブラウザを制御していないので、ブラウザの JavaScript がリクエストを開始したのか、それとも何かまたは他の誰かを開始したのか、もはや言うことはできません。
必要な要件を確認し、要件が満たされていない場合は、ページを強制終了してください。
die('Access Blocked');