2015-12-23 34 views
-1

我得到了開放的curl會話,它設置了cookie文件,所以它會記住會話ID(從登錄)。但是,我現在如何修改這些cookie?PHP Curl - 修改cookie而不是添加新的

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Cookie:blabla=bleble')); 

似乎不正確的行爲,因爲它增加了一個Cookie頭,所以例如如果我請求頭之間有:

... 
Cookie:blabla=uhuhu;tralala=ahahaha 
... 

我運行此:

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Cookie:blabla=bleble')); 

它將簡單地添加具有相同變量但具有不同值的另一個Cookie標題:

... 
Cookie:blabla=uhuhu;tralala=ahahaha 
... 
Cookie:blabla=bleble 

那麼如何修改現有的Cookie而不是添加其他Cookie標題?

例如,當我登錄到網站,保持會話cookie文件,並在第二個請求想取代它,我得到這樣的事情(被髮送):

CURLOPT_HTTPHEADER

更換

curl_setopt($curl, CURLOPT_HTTPHEADER, 'Cookie: 46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small');

POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 
Host: 192.168.1.1 
Accept: */* 
Cookie: 46db1eb1/sessid=YHGDba31faykfyTJraQMewP+ 
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8 
X-Context:n1psjUEjqs5j7Bb5vvT0J3wXMunQ2e8c3ksb5Uikcdt9Ct1XOJUmAh8azkOqmMqe 
X-Prototype-Version:1.7 
X-Requested-With:XMLHttpRequest 
Referer:http://192.168.1.1/advConfigAccessType.html 
Cookie:46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small 
Content-Length: 73 

正如你所看到的 - 餅乾一倍。

當與CURLOPT_COOKIE

curl_setopt($curl, CURLOPT_COOKIE, '46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small');

POST /sysbus/NeMo/Intf/data:setFirstParameter HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 
Host: 192.168.1.1 
Accept: */* 
Cookie: 46db1eb1/sessid=FHjCFhn/VKgkC09y7772fXpp; 46db1eb1/sessid=blabla; 46db1eb1/zoom-accessibility=small 
Content-Type:application/x-sah-ws-1-call+json; charset=UTF-8 
X-Context:VCtJDc4PrVjybyFcw8jGAc3anO5mXm7GPnfgn8VES54TqwUKr4fP68PhJHtuSn2x 
X-Prototype-Version:1.7 
X-Requested-With:XMLHttpRequest 
Referer:http://192.168.1.1/advConfigAccessType.html 
Content-Length: 73 

值以相同的cookie頭一倍替換。

捲曲7.26.0,Raspbian(Debian的7.8)

+0

哪個系統?我無法在Mac上使用PHP 5.5和curl 7.37來複制它。7.37 –

+0

也在Ubuntu上使用PHP 5.5 + curl 7.35進行了測試 - 最後一個'curl_setopt'覆蓋了以前的cookie頭文件 –

+0

curl 7.26.0(arm-unknown-linux-gnueabihf)libcurl/7.26。在Raspbian(Debian 7.8)上,OpenSSL/1.0.1e zlib/1.2.7 libidn/1.25 libssh2/1.4.2 librtmp/2.3。你確定它覆蓋它嗎?你是否從網站獲取cookie,而不是第一次手動設置它? –

回答

0

您可以操縱CURLOPT_COOKIEJAR文件。類似這樣的:

<?php 
function init($f) 
{ 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, "http://localhost/a.php"); 
    curl_setopt($curl, CURLOPT_COOKIEJAR, $f); 
    curl_setopt($curl, CURLOPT_COOKIEFILE, $f); 
    return $curl; 
} 
function readCookies($f) 
{ 
    $cookies = []; 
    if (($handle = fopen($f, "r")) !== FALSE) { 
     while (($cookie = fgetcsv($handle, 1000, "\t")) !== FALSE) { 
      $cookies[] = $cookie; 
     } 
     fclose($handle); 
    } 
    return $cookies; 
} 
function writeCookies($f, $c) 
{ 
    $fp = fopen($f, "w"); 

    foreach ($c as $cookie) { 
     fputcsv($fp, $cookie, "\t"); 
    } 

    fclose($fp); 
} 

$f = './c.tmp'; 
$curl = init($f); 
curl_exec($curl); 

// playing with cookies: 
$newCookie = ['blabla', '123']; 
$cookies = readCookies($f); 
if (!empty($cookies)) { 
    $found = false; 
    foreach($cookies as $key=>$val) { 
     // ignore comments and empty lines 
     if (count($val) == 7) { 
      if ($val[5] == $newCookie[0]) { 
       $found = $key; 
       break; 
      } 
     } 
    } 
    if ($found) { 
     $cookies[$found][6] = $newCookie[1]; 
    } else { 
     // I am using first one as a template, 
     // but you may need to set all fields explicitly 
     // as they may differ 
     $cookie = $cookies[0]; 
     $cookie[5] = $newCookie[0]; 
     $cookie[6] = $newCookie[1]; 
     $cookies[] = $cookie; 
    } 
    writeCookies($f, $cookies); 
} 

$curl = init($f); 
if (empty($cookies)) { 
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Cookie:blabla=123')); 
} 
curl_exec($curl); 
+0

也許PHP解釋這種方式......但是請你直接查看CURL發送的內容?像這樣:'$ headerSent = curl_getinfo($ curl,CURLINFO_HEADER_OUT); print_r($ headerSent);' –

+0

確實。使用tcpdump進行檢查,它確實發送了多個cookie頭文件=(。我用可能的解決方案更新了答案。 –