将HTTP_REFERER与从文件读取的值进行比较失败

时间:2011-06-03 15:22:33

标签: php curl

我正在尝试通过$ _SERVER ['HTTP_REFERER'](通过cURL设置)将密钥从一个服务器传递到另一个服务器,然后处理一些POST数据并发回XML文件。我将密钥存储在两台服务器上的相同文件中(通过cron job SCP旋转它们),但是当我在接收端读取密钥并与引用程序进行比较时,它每次都会失败并将418返回给我。

如果我使用if($refkey = "mykeyhere")代替if($refkey = $key)它可以正常工作,但显然硬编码它们的密钥在这里不起作用 - 我需要能够从文件中读取它。

我尝试过使用strstr(),在(string)$key上进行投射但是gettype()都返回字符串,因此它应该可以正常工作。 密钥正在$ _SERVER ['HTTP_REFERER']中正确发送,并且正在从接收端的文件中正确读取,我已经回应了两者并且它们是相同的。有谁知道为什么比较会失败,我做的事情愚蠢,显然是错的?感谢。

cURL请求构建代码:

            $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");

1 个答案:

答案 0 :(得分:1)

作为第一个问题排查步骤,双方将$key替换为trim($key)。或者,在接收方,将您的if条件更改为if (trim($refkey) == trim($key)) {

该文件可能在密钥后面包含换行符/回车符,并且它可能不会在referrer变量中发送该额外字符。接收方可能正在尝试将引用者与文件中的引用者进行比较,文件版本可能包含换行符。