要解释我的目标有点困难......这是一个简单的脚本:
<?PHP
$someData = ["foo" => "bar"];
function someFunction($someArg) {
include("someFile.php");
}
?>
这里是&#34; someFile.php&#34;的代码:
<?PHP
echo "I'm some file!";
global $someData; // point 1
var_dump($someData);
include("someOtherFile.php"); // point 2
?>
我想是否可以不让#34; someFile.php&#34;访问除了提供给它的任何变量,作为&#34; someFunction&#34;,(点1)的args并且不让它包含任何其他文件(第2点)?而这一切都发生在&#34; someFunction()&#34; ...我怎样才能实现这个目标和/或绕过这个?
答案 0 :(得分:0)
不,您无法阻止从包含文件中读取其他变量。
要阻止阅读您的应用程序的任何状态,您可以将include
替换为exec
。例如:exec(&#39; php someFile.php参数&#39;)并使用$argv variable或getOpt
答案 1 :(得分:0)
不幸的是,没有任何方法(我知道)限制对当前实例的访问。它有点超出了PHP的目的和设计。我在下面提供了一个建议,但我建议你也在最后阅读我的评论。
我建议您单独执行PHP文件并使用自定义php.ini文件通过include
属性禁用disable_function
之类的函数。您可以创建一个临时的php文件,其中包含您需要在顶部访问的全局数据,如:
<?php
$someData = ["foo" => "bar"];
echo "I'm some file!";
global $someData; // point 1
var_dump($someData);
include("someOtherFile.php"); // point 2
?>
然后你会这样称呼它: exec(&#34; php -f /temporary_folder/tempfile.php --php-ini /temporary_folder/php.ini");
我建议,如果安全性至关重要,并且您打算让它面向公众(自己托管或发布它),并由安全专业人员审核或审核。锁定PHP代码的执行并不是一件容易的事,并且有很多方法可以执行任意代码或执行您不想要的事情。你可以锁定eval
,但是你知道你也可以通过preg_replace
函数评估代码吗?你不会认为可以利用正则表达式函数。
答案 2 :(得分:0)
看起来你想要的是&#34;沙盒&#34;包含的脚本。我不知道答案,但您可以查看类似的已回答问题,例如this
PS:这应该是评论但对不起,我还没有评论特权。
答案 3 :(得分:0)
使用include无法实现此目的。
您必须考虑自CTRL + C
和CTRL + V
起包含的内容。因此,只要您的原始代码可以访问全局变量,您的包含文件也具有。它就像将新页面粘贴到用过的笔记本中一样。这只是一种审美操作。解? OOP ...
您应该尝试不使用全局变量,并切换到面向对象的编程。如果没有全局变量,并且所有内容都存储在对象中,则该对象决定是否有人可以访问此变量。一个简短的例子:
<?php
// "Closed environment"
class NoAccess () {
private $notaccessible;
public __construct ($notaccessibleparam) {
$this->notaccessible = $notaccessibleparam;
}
public method yourfunction() {
print_r($this->notaccessible); // have access
}
}
$instance = new NoAccess(10);
// Further Code dont even know there is a variable called $notaccessible.
// ...
// ...
// But, You can always call:
$instance->yourfunction(); // which have access, and know it.
?>
在这种情况下,你包括(在三个点注释中)或写在那里的eveyrhing,不能使用$ notaccessible变量。使用它的唯一方法是使用您自己的界面,例如yourfunction()。
这可能对你来说真的很新,但你应该尝试在php中阅读oop(面向对象编程),而我看到你的代码非常复杂,你应该尽可能快地切换到oop。
<强>链接:强>
http://php.net/manual/en/language.oop5.php - 在php.net上的oop
http://php.net/manual/en/language.oop5.visibility.php - 变量的可见性在php.net上的类内部
PS。尝试在<?php
中使用小写字母。这是一个好习惯。