我有一个 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!');
}
现在,您只需将密码添加到 URL 即可访问此 PHP 文件:
http://yourcoolsite.com/jsonarray.php?password=your_password
我建议不要使用“密码”作为参数的键。而是将其称为其他东西,稍微混淆一下,这样就不会立即看出它是密码。
http://yourcoolsite.com/jsonarray.php?mpwyour_password
这可能吗?
不。
因为当您从 javascript 向该文件发出请求时,浏览器必须可以访问该文件。由于您无法控制浏览器,因此您不能再说浏览器中的 javascript 是否发起了请求或某事或其他人。
为什么不只检查您需要的任何要求,如果不满足,则终止该页面。
die('Access Blocked');