我正在尝试通过$ _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");
答案 0 :(得分:1)
作为第一个问题排查步骤,双方将$key
替换为trim($key)
。或者,在接收方,将您的if条件更改为if (trim($refkey) == trim($key)) {
该文件可能在密钥后面包含换行符/回车符,并且它可能不会在referrer变量中发送该额外字符。接收方可能正在尝试将引用者与文件中的引用者进行比较,文件版本可能包含换行符。