禁止使用不需要的客户端请求来使用PHP文件

时间:2012-12-16 12:07:24

标签: php authorization file-access

我有一个PHP文档,让我们说jsonarray.php。

当给出一些参数时,该文件返回关联数组的json_encode。 我需要禁止不受欢迎的用户访问并使用此文件用于他自己的目的。

这可能吗?

此外,我想指定它是一个客户端请求,我在JavaScript代码中生成。

5 个答案:

答案 0 :(得分:4)

如果您从另一个PHP文件中查看此内容,可以将BASEPATH设置为常量&在需要保护的所有文件的顶部添加以下行:

defined('BASEPATH') OR exit('No direct script access allowed');

因此,如果从该特定文件访问该文件,则设置BASEPATH&一切正常。但是有些url直接试图访问,脚本会终止。

如果你从Javascript调用它 - 其他选项是 向每个javascript请求添加nonce令牌,这基本上是一个随机生成的唯一令牌,对单个请求有效。有关详细信息,请参阅Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet

以下是here的示例:     

    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;
    }
}

答案 1 :(得分:2)

只需要特定的$_GET参数就足够了 -

if (isset($_GET['password']) && $_GET['password'] == "your_password"){

}else{
  die('access denied!');
}

现在,只需要将密码添加到URL中,您只需将密码添加到URL即可:

  

http://yourcoolsite.com/jsonarray.php?password=your_password

我建议使用“password”作为参数的键。而是将其称为其他东西,稍微模糊不清的东西,以便它不会立即显示为密码。

  

http://yourcoolsite.com/jsonarray.php?mpwyour_password

答案 2 :(得分:1)

  

这可能吗?

没有

因为当您从javascript向该文件发出请求时,浏览器必须可以访问它。由于您不控制浏览器,如果浏览器中的javascript启动了请求或某事或其他人,您就不能再说了。

答案 3 :(得分:0)

最简单的方法是使用.htaccess来阻止用户直接查看文件 以下是两个链接:Tutorial 1 Tutorial 2

答案 4 :(得分:-2)

为什么不检查您需要的任何要求,如果不满足,则终止页面。

die('Access Blocked');