2009-07-13 15 views
9

से ब्राउजर के समान कुकी का उपयोग करने दें, मेरे पास एक PHP स्क्रिप्ट है जो ब्राउज़र की तरफ से HTTP अनुरोध करता है और ब्राउज़र को प्रतिक्रिया देता है। समस्या यह है कि जब मैं इस पृष्ठ पर ब्राउज़र से लिंक पर क्लिक करता हूं तो यह कुकी चर के बारे में शिकायत करता है। मुझे लगता है कि इसे साइट के लिए ब्राउज़र कुकी (ओं) की आवश्यकता है।कर्ल को PHP

मैं इसे दूरस्थ साइट पर कैसे रोक सकता हूं और अग्रेषित कर सकता हूं?

उत्तर

2

आप नहीं कर सकते।

यदि आप अनुरोध को घुमाते हैं, तो आपको आउटपुट को पार्स करने और सभी लिंक को प्रतिस्थापित करने की आवश्यकता होगी ताकि वे आपके सर्वर के माध्यम से जाएं।

www.yourdomain.com/f?=www.someotherdomain.com/realpage 

यह एकमात्र तरीका है जो यह काम करेगा यदि आप अपने कर्ल अनुरोध में लगातार कुकीज़ का उपयोग करते हैं। कर्ल कुकीज़ स्वयं ही रख सकता है। कुकी फ़ाइल (कर्ल में) में एक सत्र आईडी असाइन करें ताकि बाद के अनुरोध एक ही कुकीज़ प्राप्त कर सकें। जब कोई उपयोगकर्ता किसी लिंक पर क्लिक करता है, तो आपको अनुरोध को फिर से घुमाने की आवश्यकता होगी।

साइट 1 के लिए कुकीज़ सेट करने की अनुमति देने के लिए यह एक सुरक्षा समस्या है। कल्पना करें कि क्या आप पेपैल के लिए ब्राउज़र में कुकीज़ सेट कर सकते हैं और उपयोगकर्ता को यह सोचने में चाल लगा सकते हैं कि उन्होंने int या कुछ अन्य दुर्भावनापूर्ण कार्रवाई लॉग की है।

+0

ऐसा लगता है कि मुझे ऑटो रीडायरेक्ट या कुछ जैसे मानक समाधान मिलना चाहिए। धन्यवाद –

0

कुकी आमतौर पर

Host stackoverflow.com 
User-Agent ... 
Accept-Language en-us,en;q=0.5 
Referer http://stackoverflow.com/unanswered 
Cookie bla=blabla;blubb=blu 

तरह HTTP अनुरोध हेडर के साथ भेज दिया जाता है तो मुझे लगता है कि सिर्फ अपने शीर्षक में कुकी हिस्से को संशोधित करना होगा।

3
curl_setopt से

:

डिफ़ॉल्ट रूप से, libcurl हमेशा की दुकानों और भार सभी कुकीज़, स्वतंत्र अगर वे सत्र कुकीज़ या नहीं कर रहे हैं।

हालांकि आप सीधे कुकी सेट करने की आवश्यकता हो सकती है, जो उपयोग किया जा सकता:

curl_setopt($ch, CURLOPT_COOKIE, 'foo=bar'); 

कौन सा सेट कुकी HTTP शीर्ष लेख के समान है। जांचें कि आप curl_setopt($ch, CURLOPT_COOKIESESSION, true) का उपयोग नहीं कर रहे हैं क्योंकि यह libcurl कुछ कुकीज़ को अनदेखा कर देगा।

+0

मैंने हाल ही में पाया है कि "डिफ़ॉल्ट रूप से, libcurl हमेशा सभी कुकीज़ को स्टोर और लोड करता है" टिप्पणी PHP 5.3.8 के रूप में गलत लगती है। मुझे एक से अधिक रीडायरेक्ट को पार करने के लिए कर्ल के लिए एक कुकी जार बनाना था और डोमेन के लिए कुकीज़ खोना नहीं था। –

5

वास्तव में, यह संभव है। आपको बस ब्राउजर की कुकी लेनी है और ब्राउज़र को नकल करने के लिए इसे कर्ल करने के लिए पैरामीटर के रूप में पास करना है। ऐसा सत्र जैकिंग की तरह है ...

यहां एक नमूना कोड है:

// Init curl connection 
$curl = curl_init('http://otherserver.com/'); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
// You can add your GET or POST param 

// Retrieving session ID 
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';  

// We pass the sessionid of the browser within the curl request 
curl_setopt($curl, CURLOPT_COOKIE, $strCookie); 

// We receive the answer as if we were the browser 
$curl_response = curl_exec($curl); 

यह बहुत अच्छी तरह से काम करता है अगर उद्देश्य एक अन्य वेबसाइट कॉल करने के लिए है, लेकिन यह असफल हो जायेगी यदि आप अपने वेब सर्वर फोन (वही है जो कर्ल कमांड लॉन्च कर रहा है)। ऐसा इसलिए है क्योंकि आपकी स्क्रिप्ट फ़ाइल अभी भी इस स्क्रिप्ट द्वारा खुली/लॉक है, इसलिए जिस यूआरएल को आप कॉल कर रहे हैं वह इसका उपयोग नहीं कर सकता है।

$curl = curl_init('http://sameserver.com/'); 
//... 
session_write_close(); 
$curl_response = curl_exec($curl); 

आशा इस किसी की मदद करेंगे:

आपको लगता है कि प्रतिबंध (एक ही सर्वर पर एक पृष्ठ कहते हैं) बायपास करना चाहते हैं, तो आप इस कोड के साथ सत्र फ़ाइल बंद करने के लिए इससे पहले कि आप कर्ल पर अमल किया है:)

+0

session_write_close(); बहुत अच्छा काम करता है! मैं हजारों उपवास देना चाहता था! मैं यह समझने के बारे में पागल था कि सर्वर समय-समय पर कोई डेटा नहीं देता है और प्रतिक्रिया कोड क्यों नहीं देता है। आपने बहुत अच्छी तरह से समझाया और यह अच्छा काम करता है। – Tarik

10

इस प्रकार मैं सभी ब्राउज़र कुकीज़ को कर्ल करने के लिए अग्रेषित करता हूं और कर्ल अनुरोध के लिए सभी कुकीज़ को वापस ब्राउज़र पर वापस भेजता हूं।

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

// get http header for cookies 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1); 

// forward current cookies to curl 
$cookies = array(); 
foreach ($_COOKIE as $key => $value) 
{ 
    if ($key != 'Array') 
    { 
     $cookies[] = $key . '=' . $value; 
    } 
} 
curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookies)); 

// Stop session so curl can use the same session without conflicts 
session_write_close(); 

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

// Session restart 
session_start(); 

// Seperate header and body 
list($header, $body) = explode("\r\n\r\n", $response, 2); 

// extract cookies form curl and forward them to browser 
preg_match_all('/^(Set-Cookie:\s*[^\n]*)$/mi', $header, $cookies); 
foreach($cookies[0] AS $cookie) 
{ 
    header($cookie, false); 
} 

echo $body; 
+1

आप भी जोड़ना चाहेंगे: curl_setopt ($ ch, CURLOPT_USERAGENT, $ _SERVER ['HTTP_USER_AGENT']); –

0

PiTheNumber के जवाब महान था, लेकिन मैं इसके साथ कुछ मुद्दों में भाग कि यह अभी भी प्रिंट करने का कारण: इसके लिए मैं कर्ल से कुकीज़ रही, http शीर्षलेख पार्स, कई कुकीज़ और सत्र ताला भेजने जैसी कुछ समस्याओं का समाधान करने के लिए आवश्यक पृष्ठ पर शीर्षलेख। इसलिए मैंने इसे अधिक विश्वसनीय curl_getinfo फ़ंक्शन का उपयोग करने के लिए समायोजित किया। यह संस्करण रीडायरेक्ट का भी पालन करता है।

public function get_page_content($url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 

    // Forward current cookies to curl 
    $cookies = array(); 
    foreach ($_COOKIE as $key => $value) { 
     if ($key != 'Array') { 
      $cookies[] = $key . '=' . $value; 
     } 
    } 
    curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookies)); 

    $destination = $url; 

    while ($destination) { 
     session_write_close(); 
     curl_setopt($ch, CURLOPT_URL, $destination); 
     $response = curl_exec($ch); 
     $curl_info = curl_getinfo($ch); 
     $destination = $curl_info["redirect_url"]; 
     session_start(); 
    } 
    curl_close($ch); 

    $headers = substr($response, 0, $curl_info["header_size"]); 
    $body = substr($response, $curl_info["header_size"]); 

    // Extract cookies from curl and forward them to browser 
    preg_match_all('/^(Set-Cookie:\s*[^\n]*)$/mi', $headers, $cookies); 
    foreach($cookies[0] AS $cookie) { 
     header($cookie, false); 
    } 

    return $body; 
}