2011-06-03 148 views
0

我試圖通過$ _SERVER ['HTTP_REFERER'](通過cURL設置)從一個服務器傳遞一個密鑰到另一個服務器,然後處理一些POST數據併發送一個XML回檔。我將密鑰存儲在兩臺服務器上的相同文件中(通過cron job SCP進行輪換),但是當我在接收端讀取密鑰並與引用程序進行比較時,它每次都會失敗,並將418丟回給我。將HTTP_REFERER與從文件讀取的值進行比較失敗

如果我使用if($refkey = "mykeyhere")而不是if($refkey = $key)它可以正常工作,但顯然他們關鍵的硬編碼在這裏不起作用 - 我需要能夠從文件中讀取它。

我試過使用strstr(),對(string)$key做一個演員,但是兩個返回字符串gettype()所以它應該工作。 關鍵是在$ _SERVER ['HTTP_REFERER']中正確發送,並正確地從接收端的文件中讀取,我已經echo'd兩者,它們是相同的。有誰知道爲什麼比較會失敗,我是在做一些愚蠢的事,顯然是錯的?謝謝。

捲曲請求構建代碼:

  $file = "key"; 
      $fh = fopen($file, 'r'); 
      $key = fread($fh, filesize($file)); 
      fclose($fh); 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, "http://example.com/xmlreq.php"); 
      curl_setopt($ch, CURLOPT_HEADER, 1); 
      curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
      curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); 
      curl_setopt($ch, CURLOPT_POST, 1); 
      curl_setopt($ch, CURLOPT_REFERER, $key); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, "greeting=hello"); 

      curl_exec($ch); 
      curl_close($ch); 

接收代碼(xmlreq.php):

if($_SERVER['REQUEST_METHOD'] === "POST"){ 
      $file = "key"; 
      $fh = fopen($file, "r"); 
      $key = fread($fh, filesize($file)); 
      fclose($fh); 
      $refkey = $_SERVER['HTTP_REFERER']; 
      if($refkey == $key){ 
        print_r("hello, world!"); // it should run this 
      }else 
        header("HTTP/1.0 418 I'm a teapot"); // but runs this instead 

    }else 
      header("HTTP/1.0 404 Not Found"); 
+3

是否需要修剪?這就是我要做的第一件事(在xmlreq.php中) – Fosco 2011-06-03 15:25:33

+0

確實,這個伎倆。今天是星期五,我的大腦似乎在別處。 – 2011-06-03 15:32:48

+1

HTTP_REFERRER應該是一個URL,而不是一個關鍵。爲什麼不使用自定義標題來代替重載(濫用)現有標題? – 2011-06-03 15:33:38

回答

1

作爲第一故障排除步驟,在兩側,以trim($key)替換$key。或者,在接收方,將您的if條件更改爲if (trim($refkey) == trim($key)) {

該文件可能在密鑰後包含換行符/回車符,並且可能不會在引用變量中發送該額外字符。接收方可能試圖將引用來源與文件中的引用來比較,文件版本可能包含換行符。

+0

就是這樣!謝謝。這是星期五。 – 2011-06-03 15:31:42

相關問題