在我的 PHP 设置中,出于安全原因,我已经allow_url_include
设置FALSE
并且很乐意保持这种状态。
当我想
include 'https://example.com/path/to/include.php'; // <= THIS WON'T WORK
我可以用:
include $_SERVER['DOCUMENT_ROOT'].'/path/to/include.php'; // <= BUT THIS WILL
到目前为止,一切都很好。
然而,现在,我正在尝试在运行时在 PHP 中创建include
虚拟文件的方法。
我想知道 PHP 中是否有等同于 javascript 的东西URL.createObjectURL()
,之后我发现 PHP 可以读取data:
URI。
这听起来很有希望......但是因为我已经allow_url_include
设置为FALSE
,PHP 告诉我它不能include
以以下开头的 URI data:
:
警告:包装器在服务器配置中被禁用
include(): data://
allow_url_include=0
所以,而不是:
include 'data:application/x-php;base64,ZnVuY3Rpb24gdGVzdDIoKSB7ZWNobyAnVGhpcyB0ZXN0IGZ1bmN0aW9uIDIgaXMgd29ya2luZy4nO30gdGVzdDIoKTs=';
我必须file_get_contents
像eval
这样使用:
$Test_Function = file_get_contents('data:application/x-php;base64,ZnVuY3Rpb24gdGVzdDIoKSB7ZWNobyAnVGhpcyB0ZXN0IGZ1bmN0aW9uIDIgaXMgd29ya2luZy4nO30gdGVzdDIoKTs='); eval("$Test_Function");
后一种方法有效eval()
,但(尤其是因为它很慢)除非绝对必要,否则我不想使用。
有什么方法可以让 PHP 访问include
URI data:
,而无需打开allow_url_include
?
注一:
您可能对我在这里使用 base-64 编码的内容感到好奇:
ZnVuY3Rpb24gdGVzdDIoKSB7ZWNobyAnVGhpcyB0ZXN0IGZ1bmN0aW9uIDIgaXMgd29ya2luZy4nO30gdGVzdDIoKTs=
它只是以下内容:
function test2() {echo 'This test function 2 is working.';} test2();
笔记2:
当我第一次尝试创建一个数据 URI 时(很久之前我在这里发布)我在百分比编码上犯了一个错误,使数据 URI 无效。
我尝试对 Data URI 进行 base-64 编码(这有效),之后我没有返回到原始百分比编码的 Data URI 来找出我哪里出错了。
但是,重要的是要注意(除了混淆)根本没有理由在数据 URI 中使用 base-64 编码。
以下百分比编码的数据 URI 在功能上是相同的:
data:application/x-php,function%20test2%28%29%20%7Becho%20%27This%20test%20function%202%20is%20working.%27%3B%7D%20test2%28%29%3B
注3:
虽然,到目前为止,我还没有成功使用include
Data URI while allow_url_include
remains set to FALSE
,但我想我会比较一下:
编写一个字符串并eval()
在该字符串上运行以执行它
创建文件并include
在该文件上运行
测试包括运行其中一个进程超过 10,000 次。我没有运行一次单个测试,而是连续运行了一组 6 个测试。总的来说,我跑了 5 组。
这就涉及到 10,000 个流程的 5 组 6 次测试。
综上所述:
运行eval()
(通常但不总是)比简单地声明和执行一个函数慢 10 多倍。
创建、写入和保存文件,然后include
在该文件上运行比声明和执行函数慢 1000 多倍。
声明和执行一个简单函数的平均时间(来自 60,000 个样本)是 0.000002194s
运行相同简单函数的平均时间eval()
(来自 60,000 个样本)是 0.00009262s
因此,任何花费eval()
100 倍的时间来解析和执行的字符串,仍然只需要不到百分之一秒( < 0.01s
) 的时间即可完成。
呼如林
慕码人2483693
一只甜甜圈