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

标签 php authorization file-access

我有一个 PHP 文档,比如说 jsonarray.php。

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

这可能吗?

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

最佳答案

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

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

因此,如果从该特定文件访问该文件,BASEPATH已设置且一切正常。但如果直接尝试访问某些网址,脚本将终止。

如果您从 Javascript 中调用它 - 其他选项是 添加nonce每个 javascript 请求的 token 基本上是随机生成的唯一 token ,对单个请求有效。请参阅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;
    }
}

关于php - 禁止不需要的客户端请求使用 PHP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901133/

相关文章:

file-access - Virtuoso ISQL 数据导入无法统计文件

php - 将下拉列表数据添加到 MySQL 数据库

php - 使用 Response::download 在 laravel 中下载文件

php - 在 PowerPC Mac 上安装用于 PHP 的 MongoDB 驱动程序到 XAMPP

php - Ubuntu linux apache2 cronjob 不调用 php 文件

asp.net-mvc - 如何为 ASP.NET MVC 站点的 OpenId 用户分配角色?

python - 如何使用 Python 抓取需要先登录的网站

node.js - Express 4 — 如何解析签名cookie?

c# - 在没有try catch的情况下检查文件是否正在使用?

tomcat - 检索文件访问的本地 Tomcat 路径