有人知道让PHP脚本自我限制访问文件系统(fopen
,file_get_contents
等)的技巧吗?
对于少数选定的文件名(日志文件,访问/tmp
等),除外,应阻止。
不是安全事件,而是强制开发团队不直接访问文件系统 (并检测)现有代码中的斑点,已经是这种情况)。我们希望在这种情况下看到一个例外(被捕获并报告),因为这些文件的内容必须通过其他方式访问。
我正在考虑为file://
协议实现自己的streamWrapper,但显然没有办法扩展内置的filewrapper类。
答案 0 :(得分:2)
选项#1
您可以使用open_basedir这是一个php.ini指令来限制应用程序也可以访问的目录。这些目录可以用分号分隔,因此您只需列出您希望应用程序访问的目录,包括/ tmp文件夹。
需要注意的是,这也会影响include,require等。
选项#2
您可以使用rename_function或runkit_function_rename重命名它们,然后使用您自己的逻辑包装重命名的版本。
来自文档的引用:
在全局函数表中将orig_name重命名为new_name。有用 用于暂时覆盖内置函数。
示例:
rename_function('file_get_contents', 'nouse_file_get_contents');
function file_get_contents($filename, $use_include_path = false, $context, $offset = -1, $maxlen) {
//
// Do some validation here
//
return nouse_file_get_contents($filename, $use_include_path, $context, $offset, $maxlen);
}
选项#3
您可以为您的开发人员设置一些编码标准,并编写一些单元测试,这些测试在部署到生产之前作为部署的一部分运行。不确定你的发布程序是什么,但在生产之前应该抓住这些类型的东西。
答案 1 :(得分:0)
你当然可以让每个人开发运行php作为一个只能访问你想要的文件的用户。但这是一个操作系统级别的解决方案。