2

私はPHPドキュメントを持っています。たとえばjsonarray.phpです。

このファイルは、いくつかのパラメーターが指定されている場合、連想配列のjson_encodeを返します。不要なユーザーが自分の目的でこのファイルにアクセスして使用することを禁止する必要があります。

これは可能ですか?

さらに、JavaScriptコードで作成するクライアント側のリクエストであることを指定したいと思います。

4

5 に答える 5

4

別の 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;
    }
}
于 2012-12-16T12:14:12.657 に答える
2

特定のパラメータを要求するのと同じくらい単純なもの$_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

于 2012-12-16T12:11:39.973 に答える
1

これは可能ですか?

いいえ。

javascript からそのファイルにリクエストを行うと、ブラウザからアクセスできる必要があるためです。あなたはブラウザを制御していないので、ブラウザの JavaScript がリクエストを開始したのか、それとも何かまたは他の誰かを開始したのか、もはや言うことはできません。

于 2012-12-16T12:29:31.167 に答える
0

最も簡単な方法は、.htaccessユーザーがファイルを直接表示できないようにすることです。方法を確認するには、次の 2 つのリンクを使用します。チュートリアル 1 チュートリアル 2

于 2012-12-16T12:13:56.447 に答える
-2

必要な要件を確認し、要件が満たされていない場合は、ページを強制終了してください。

die('Access Blocked');
于 2012-12-16T12:09:52.423 に答える