首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁止不需要的客户端请求使用PHP文件

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

Stack Overflow用户
提问于 2012-12-16 20:07:24
回答 5查看 118关注 0票数 2

我有一个PHP文档,假设是jsonarray.php。

当给定一些参数时,此文件返回关联数组的json_encode。我需要禁止不想要的用户出于自己的目的访问和使用此文件。

这个是可能的吗?

此外,我希望将其指定为客户端请求,这是我在JavaScript代码中发出的请求。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-16 20:14:13

如果你从另一个PHP文件中查看,你可以在那里设置BASEPATH常量&在你需要保护的所有文件的顶部添加下面一行:

代码语言:javascript
复制
defined('BASEPATH') OR exit('No direct script access allowed');

因此,如果从该特定文件访问该文件,则设置BASEPATH &一切正常。但在某些url直接尝试访问的情况下,脚本将终止。

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

下面是取自here的一个例子:

代码语言:javascript
复制
    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;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-12-16 20:11:40

对于您来说,像需要一个特定的$_GET参数这样简单的事情可能就足够了-

代码语言:javascript
复制
if (isset($_GET['password']) && $_GET['password'] == "your_password"){

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

现在,要访问此PHP文件,您只需将密码添加到URL:

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

我建议不要使用"password“作为参数的关键字。更确切地说,它是另一种东西,一种稍微模糊的东西,这样就不会立即明显地知道它是一个密码。

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

票数 2
EN

Stack Overflow用户

发布于 2012-12-16 20:29:31

这是可能的吗?

不是的。

因为当您从javascript向该文件发出请求时,浏览器必须能够访问该文件。因为你不能控制浏览器,所以你不能再说是浏览器中的javascript发起了请求,还是别的什么人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13901133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档