fopen在公共软件中使用是否安全?

时间:2010-07-15 00:58:37

标签: php security fopen

我正在创建一个Web应用程序,我希望向公众发布以便在任何人自己的Web服务器上下载和安装,但是我被告知,由于“安全性”,一些webhosts禁止在php中使用fopen问题“,特别是在共享主机上。我在应用程序的安装过程中使用fopen,我应该关注这个吗?这是共享主机中的常见做法吗?如果是这样,我可以用另一种方式写入文件吗?我听说过cURL,但这需要最终用户更高级的知识,不是吗?如果是这样,显然不会出现这种情况。非常感谢!

3 个答案:

答案 0 :(得分:3)

永远不会禁用fopen()。然而,php.ini设置“allow_url_fopen”是。因此,如果您只访问本地文件,而不是通过fopen()访问http:// URL,这不是一个真正的问题。

如果您需要URL支持,则应该包括HTTP请求类,例如the one in PEAR。这样就可以避免对cURL扩展模块的用户不友好的依赖。

答案 1 :(得分:2)

在我有限的经验中,fopen()很少被禁用。使用curl写入本地文件是无稽之谈,因此这不是替代方案。由于所有写入本地文件都取决于fopen,普通包的最常用路由是:

  1. 尝试在安装时设置文件中的内容(可能是普通软件包文件中已有相当默认值的文件)。
  2. 失败时,向用户显示您要设置的内容,并为他提供手动复制/粘贴该内容的选项,或者重试设置内容(例如,当用户设置文件时)权限正确,你当然可以解释如何做。)

答案 2 :(得分:1)

使用cURL:

 function GET($url,$header = null,$post = 0,$cookie = null){
                    $handle = curl_init();
                        curl_setopt($handle, CURLOPT_URL, $url);
                        curl_setopt($handle, CURLOPT_HEADER, $header);
                        curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
                        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
                        if($post) {
                            curl_setopt($handle, CURLOPT_POST, true);
                            curl_setopt($handle, CURLOPT_CUSTOMREQUEST,($post)?"POST":"GET");
                            curl_setopt($handle, CURLOPT_POSTFIELDS, $post);
                        }
                        curl_setopt($handle, CURLOPT_COOKIE, $cookie);

                        if(preg_match('/https/',$url)) {
                            curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
                        }
                            return($buffer = @curl_exec($handle)) ? $buffer : 0;
                }


                //A basic example of the requisition process : 
                        echo GET('http://google.com',1)

                //post data: 

                GET('/test.php',1,
                    array('Name' => 'Jet',
                          'id' => 12,
                          'foo' => 'abc'));
                returns:
                    successfully : source-code;
                    0 : Request failed

                //send cookies : 
                GET('http://example.com/send.php',1,
                                array('Name' => 'Jet',
                                      'id' => 12,
                                        'foo' => 'abc'),"cookies");

file_put_contents: http://php.net/file_put_contents