2010-07-15 45 views
4

我正在創建一個Web應用程序,我希望向公衆發佈以供下載並安裝在任何人自己的Web服務器上,但是我剛剛被通知某些Webhosts由於「安全問題」而禁用了在php中使用fopen,特別是共享主機。我在應用程序的安裝過程中使用fopen,我應該關心這個嗎?這是共享主機的常見做法嗎?如果是這樣,還有另一種方法可以寫入文件嗎?我聽說過cURL,但這需要終端用戶有更高級的知識,不是嗎?如果是這樣,這顯然是不可預料的。非常感謝!Fopen可以安全地在公共軟件中使用嗎?

回答

3

fopen()永遠不會被禁用。但是,php.ini設置爲「allow_url_fopen」。所以,如果你只訪問本地文件,而不是通過fopen()訪問http:// URL,這實際上並不是一個問題。

如果您需要URL支持,您應該另外包含HTTP請求類,如the one in PEAR。這樣可以避免用戶不友好的對cURL擴展模塊的依賴。

+0

有關創建臨時文件的東西,如'的tempnam()'什麼?用'fopen()'訪問它們不會使用URL,是嗎? – 2010-07-15 01:10:29

+0

@Ben:不,那很安全。 tempnam()只創建本地文件,不包含任何URL。 – mario 2010-07-15 02:05:22

+1

永不說永遠:任意功能可以被禁用.... – Wrikken 2010-07-15 02:31:38

2

在我有限的經驗中,fopen()很少被禁用。用捲曲書寫本地文件是無稽之談,所以這不是一個替代方案。由於所有寫入到本地文件一種依賴的fopen,正常包最常用的途徑是:

  1. 試圖用在一個體面的默認設置在安裝文件中的內容(可能是文件已經存在正常的包文件)。
  2. 失敗時,向用戶展示您想要設置的內容,併爲他提供選項以手動複製/粘貼該內容,或者重試設置內容(例如,用戶設置文件時正確的權限,你當然會解釋如何做)。
1

使用捲曲:

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

相關問題