2015-08-15 167 views
0

我正在嘗試使用curl登錄網站,但是無法使用它進行工作。
這是我正在使用的代碼。以curl登錄php

首先,我從網站獲取csrf標記以確保它匹配。
但我得到的結果總是登錄表單。

$url="http://www.example.com/accounts/login"; 
$postinfo = 'csrfmiddlewaretoken='.$key.'&[email protected]&password=mypassword'; 

$cookie = "cookies.txt"; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postinfo); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec($ch); 

return $result; 

有誰知道我爲什麼不能登錄?

表單字段是正確的,當我進行登錄嘗試cookie.txt文件已更改。

+0

在打開PHP標記 (例如'<?php error_reporting(E_ALL);)後立即向文件頂部添加錯誤報告。 ini_set('display_errors',1);'然後你的代碼的其餘部分,看看它是否產生任何東西。 –

+0

@ Fred-ii-我沒有看到任何錯誤,只是爲了讓您知道我正在使用laravel 5 – Szenis

+0

您可能需要爲它添加標籤,這可能與它有一些相關性。我無法確定它是否有影響,因爲我對拉拉維爾一無所知。 –

回答

1

最有可能的原因是:

  1. 你重新初始化捲曲你的CRSF令牌之後,因此它成爲了後續請求無效,因爲這是一個完全不同的會話至於網站有關。

  2. $postinfo是一個字符串,所以你需要通過手(CURLOPT_POSTFIELD S還接受關聯數組,在這種情況下,你不需要做)到urlencode()值。

+0

我已經嘗試與urlencode和數組,但這並沒有改變任何東西。然而,我正在做2個捲曲請求,這可能是一個問題嗎?如果是這樣我怎麼能得到csrf標記? – Szenis

+0

您可能需要'urlencode()'令牌,用戶名和密碼,或使用數組。現在的方式(用'@'顯然不是百分比編碼的)不會飛行。請求的數量並不重要,只要你不在中間調用'curl_init()'。並且務必在第一次GET之前設置COOKIEFILE和COOKIEJAR,以便curl得到會話cookie並在隨後的POST中重新發送它們。 – lafor

+0

是的,它的確是csrf標記。 – Szenis

1

有幾點建議我都能想到。這些都是基於以前的經驗,當它不適合我時,我終於通過試驗和錯誤來實現它。

確保cookies.txt是可寫的。放置在一個單獨的文件夾cookie.txt的您的www根外的地方,並使用絕對路徑改變$ cookie的值:

$cookie = "/path/to/writable/folder/cookies.txt"; 

嘗試登錄後,檢查文件是否包含cookie的值。如果它包含cookie值,但不包含需要識別爲登錄的cookie值,則可能會有一些額外的服務器端檢查,以防止除了令牌檢查之外從服務器外部提交表單。

查看正常人類登錄表單的網址,例如, http://www.example.com/accounts/loginform.html - 或者您使用的網址,以獲取令牌,並添加作爲引薦:

curl_setopt($ch, CURLOPT_REFERER, 'http://www.example.com/accounts/loginform.html'); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 

設置一些選項,讓你看起來更顯人性:

curl_setopt($ch, CURLINFO_HEADER_OUT, 1); 
curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate,sdch"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
     'Accept-Language:en-US,en;q=0.5', 
     'Origin: http://www.example.com', 
     'Cache-Control:no-cache', 
     'Connection:keep-alive', 
     'Pragma:no-cache', 
     'Expect:' 
    )); 

上面的例子頭陣列中的工作我特殊案例。在您的情況下,當人類登錄時可能會發送其他頭文件。請嘗試使用瀏覽器登錄一次,然後在瀏覽器的開發人員工具中檢查一起發送的請求頭,然後複製/粘貼它們。也doublecheck發佈隱藏值(在我的情況下需要添加「& __VIEWSTATE = somereallylongIIScode」到CURLOPT_POSTFIELDS字符串)。

+0

感謝您的幫助,正確的網址有點不同,我認爲它不是'''http://www.example.com/accounts/loginform'''',而是''http :// www.example.com/accounts/loginform /''''永遠不會成爲問題的一部分。 – Szenis

+0

太棒了,很高興你得到它的工作..我需要上述得到我的工作:-) –