我有一个PHP脚本,通过GET接受文件URL并用fopen打开它 这个解决方案是否足够安全还是安全漏洞?
$filename = $_GET['file'];
if( substr( $filename, 0, 7 ) !== 'http://' )
$filename = 'http://'.$filename;
fopen( $filename, 'r' );
// etc...
这样您就无法强制脚本的本地路径从中读取。
答案 0 :(得分:4)
应工作,但还有两件事要考虑:
授予其他服务器访问权限。如果您的服务器位于防火墙后面,则可以使用此服务器使用HTTP,FTP等从防火墙后面的其他服务器(或点击服务等)获取数据。
递归拒绝服务。确保没有办法让某人给你 脚本本身的URL,以一种递归循环的方式获取。
答案 1 :(得分:1)
不完全确定,但为了安全起见,你可能还需要逃避它。
$filename=escapeshellarg ( $filename );
答案 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