是否将“http://”添加到PHP的fopen()文件名中,足以防止读取本地文件?

时间:2011-02-12 23:12:09

标签: php security fopen

我有一个PHP脚本,通过GET接受文件URL并用fopen打开它 这个解决方案是否足够安全还是安全漏洞?

$filename = $_GET['file'];
if( substr( $filename, 0, 7 ) !== 'http://' )
    $filename = 'http://'.$filename;

fopen( $filename, 'r' );
// etc...

这样您就无法强制脚本的本地路径从中读取。

4 个答案:

答案 0 :(得分:4)

工作,但还有两件事要考虑:

  • 授予其他服务器访问权限。如果您的服务器位于防火墙后面,则可以使用此服务器使用HTTP,FTP等从防火墙后面的其他服务器(或点击服务等)获取数据。

  • 递归拒绝服务。确保没有办法让某人给你 脚本本身的URL,以一种递归循环的方式获取。

答案 1 :(得分:1)

不完全确定,但为了安全起见,你可能还需要逃避它。

$filename=escapeshellarg ( $filename );

请参阅:http://php.net/manual/en/function.escapeshellarg.php

答案 2 :(得分:1)

它有点脆弱,因为安全性取决于正在注册的http处理程序。如果在将来的PHP版本中它将被删除或可选,该怎么办?

这是问题所在。这实际上有效(警告之后):

stream_wrapper_unregister('http');
file_get_contents('http://../../../../../etc/passwd');

答案 3 :(得分:0)

另一项安全措施/选项是使用chroot() http://php.net/manual/en/function.chroot.php