2009-06-05 148 views
2

事實上,它變得非常混亂,我甚至不確定捲曲是否是罪魁禍首。所以,這裏的PHP:curl發送GET而不是POST

$creds = array(
    'pw' => "xxxx", 
    'login' => "user" 
    ); 

$login_url = "https://www.example.net/login-form"; //action value in real form. 
$loginpage = curl_init(); 

curl_setopt($loginpage, CURLOPT_HEADER, 1); 
curl_setopt($loginpage, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($loginpage, CURLOPT_URL, $login_url); 
curl_setopt($loginpage, CURLOPT_POST, 1); 
curl_setopt($loginpage, CURLOPT_POSTFIELDS, $creds); 

$response = curl_exec($loginpage); 
echo $response; 

我得到的報頭(符合正常的,成功的請求的頭標),其次是登錄頁面(我猜捲曲捕獲在這個由於重定向),其中有對「不良聯繫類型」的影響存在錯誤。

我認爲問題是請求主機設置爲請求服務器,而不是遠程服務器,但後來我注意到(在Firebug中),請求發送爲GET,而不是POST。

如果我複製登錄網站的表單,將它剝離爲只包含帶有值的表單元素,並放置完整的網址,它的工作原理非常棒。所以我認爲這不是一個安全問題,登錄請求必須在同一臺服務器上發起,等等(我甚至擺脫了空的隱藏值和所有設置其他一些cookie的JS)。

再次,我很快就感到困惑。

任何想法,爲什麼它顯示爲GET,或爲什麼它不起作用?

回答

1

當對整個類的PHP-cURL相關問題進行故障診斷時,您只需打開CURLOPT_VERBOSE並給CURLOPT_STDERR一個文件句柄。

tail -f您的文件,標題和響應比較您在Firebug中看到的,這個問題應該很清楚。

1

該請求是從服務器發出的,並不會顯示在Firebug中。 (您可能會將其與瀏覽器的其他請求混淆)。使用wireshark找出真正發生的事情。你沒有設置CURLOPT_FOLLOWLOCATION;不應該遵循重定向。

總結:少猜,多發。鏈接到pcap轉儲,我們將能夠準確地知道您做錯了什麼;或張貼PHP腳本的確切輸出,我們可以。

+0

謝謝你的擡頭。當我做了一個幾乎相同的curl_exec到另一臺服務器,我看到一個帖子(與表單值我設置),所以我想螢火(在Net標籤)是準確的。可以肯定的是,我在本地機器上使用wireshark?我猜不是,因爲請求是服務器端的。如何爲服務器配置它? – Anthony 2009-06-05 15:22:43

+0

@Anthony Wireshark的,必須運行在任何機器上的PHP正在運行或一個你發送請求。如果wireshark沒有安裝,請查找tcpdump。我在捲曲相關的東西很感興趣,所以如果你有不適合在此框中進一步的問題,不要猶豫,通過IM或電子郵件聯繫我(見我的地址配置文件)。 – phihag 2009-06-05 18:36:20

1

顯示的代碼會執行多部分formpost(因爲您將一個散列數組傳遞給POSTFIELDS選項),這可能不是目標服務器的期望。

0

嘗試在最後拋出一個print_r(curl_getinfo($loginpage)),看看它發回的標題數據是什麼。

此外,如果您試圖僞造您從他們的網站登錄,您要確保您的郵件發送正確的推薦鏈接,以便他們在發送郵件時「認爲」您在網站上。