2009-03-11 15 views
5

मैं कुछ कोड लिख रहा हूं जिसे HTTP (वेब) पर एक वेब सेवा से बात करने की आवश्यकता होगी। अतीत में मैंने कर्ल लाइब्रेरी का उपयोग किया है। हाल ही में, मैंने देखा है कि मैं दूरस्थ URL तक पहुंचने के लिए केवल fopen() का उपयोग कर सकता हूं और यह बहुत आसान लगता है।

कर्ल अधिक विकल्प के साथ, अधिक विन्यास योग्य प्रतीत होता है। उस कॉन्फ़िगरेशन से परे, क्या इससे कोई फर्क पड़ता है कि किस विधि का उपयोग किया जाता है? यदि हां, तो कौन सा बेहतर है और क्यों?

उत्तर

13

fopen()php.ini में सक्षम है तो केवल दूरस्थ URL खुल जाएगा।

हालांकि 5.2.0 से पहले के संस्करणों में, यह बहुत खतरनाक था क्योंकि include फ़ंक्शन और दूरस्थ साइटों से PHP कोड भी डाउनलोड करेगा।

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

, जिसके आधार पर एक हमलावर बस सिस्टम पर अपने स्वयं के कोड को निष्पादित करने के http://example.com/script.php?page=http://example.net/my_exploit_script के लिए पूछने के लिए और एक का फायदा उठाने शुरू करने की है: एक अनुभवहीन सांकेतिक शब्दों में बदलनेवाला आसानी से की तरह कोड के साथ बाहर पकड़ा जा सकता है। दुर्भाग्य से allow_fopen_url के लिए डिफ़ॉल्ट मान 'चालू' है।

सौभाग्य से, 5.2.0 के बाद से वहाँ एक अलग सेटिंग (जो चाहिए 'बंद' करने के लिए डिफ़ॉल्ट) allow_url_include जो रिमोट कोड को डाउनलोड करने से रोकता है include कहा जाता है।

व्यक्तिगत रूप से, यदि आपके पास कर्ल का उपयोग करने का विकल्प है, तो fopen के बजाय इसका उपयोग करें।

+0

अच्छा गहराई से जवाब +1 – alex

15

जैसा कि अल्निटक ने कहा, कर्ल का उपयोग 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 

कर्ल है 4 गुना तेजी से :)

+0

गति परीक्षण के लिए धन्यवाद। अच्छा जवाब +1 – alex

+0

बस जो मैं खोज रहा था। +1 – Domenic

5

ओर ध्यान दें: पीएचपी हो सकता है "अपने स्वयं के" कार्यान्वयन के बजाय http url_wrapper के लिए कर्ल का उपयोग करने के लिए कॉन्फ़िगर किया गया।

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
संबंधित मुद्दे