Сравнивать HTTP_REFERER со значением, считанным из файла, не удается - PullRequest
0 голосов
/ 03 июня 2011

Я пытаюсь передать ключ через $ _SERVER ['HTTP_REFERER'] (установленный через cURL) с одного сервера на другой, чтобы затем обработать некоторые данные POST и отправить файл XML обратно. У меня есть ключ, хранящийся в одинаковых файлах на обоих серверах (чередование их через SCP-задание cron), но когда я читаю ключ на принимающей стороне и сравниваю его с реферером, он каждый раз выходит из строя и возвращает 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 Ответ

1 голос
/ 03 июня 2011

В качестве первого шага устранения неполадок с обеих сторон замените $key на trim($key).В качестве альтернативы, на принимающей стороне измените условие if на if (trim($refkey) == trim($key)) {

. Файл может содержать символ новой строки / возврат каретки после ключа и НЕ может отправлять этот дополнительный символ в переменную реферера.Принимающая сторона может пытаться сравнить реферал с референтом из файла, а в версию файла может быть включен перевод строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...