PHP - Как определить, поступил ли запрос от определенного файла - PullRequest
2 голосов
/ 21 февраля 2010

У меня есть файл A.php на SERVER_A и файл B.php на SERVER_B

fileB.php делает запрос curl к fileA.php для его содержимого

Как fileA.php может определить, что запрос поступил именно от fileB.php?

-

Я думал об отправке $ _SERVER ['SCRIPT_NAME'] в fileB.php в fileA.php, но так как кто-то может перейти в fileB.php или любой файл в целом и просто сделать $ _SERVER ['SCRIPT_NAME'] = ' fileB.php '; это не так уж и безопасно.

Так как же из соображений безопасности определить, что запрос поступает из определенного файла на другом сервере?

Ответы [ 7 ]

4 голосов
/ 21 февраля 2010

Вы не можете, надежно. Вы можете попробовать установить HTTP-заголовок и проверить его на другой стороне; это не надежно, но лучше, чем большинство.

2 голосов
/ 15 апреля 2010

Почему бы не установить секретный токен и проверить его на принимающей стороне?

// fileB.php

$url = "http://example.com/fileA.php"
     . "?from=fileB"
     . "&token=" . sha1('fileB' . 'myaw3som3_salt!')
;
// then make the cURL request.


// fileA.php
if (sha1($_GET['from'] . 'myaw3som3_salt!') != $_GET['token']) {
    die();
}

Это упрощенный пример, но вы поняли.

2 голосов
/ 15 апреля 2010

Невозможно из-за вашего заявления:

"since someone can go into fileB.php"
0 голосов
/ 12 июня 2010

Я думаю, что Никф был на высоте, но, чтобы немного расширить его ответ, вот что я хотел бы сделать:

  • fileB.php на сервере Server1 запрашивает fileC.php на сервере2
  • fileC.php на сервере Server2 возвращает случайно сгенерированную соль, сохраняет ее в файле или базе данных с отметкой времени
  • fileB.php на Server1 запрашивает fileA.php на Server2 и отправляет в качестве тела запроса предварительно сконфигурированный ключ, хэширует, добавляет случайную соль и снова хэширует (например, sha1 (sha1 ('mypassword'). $ Salt))
  • fileA.php проверяет, была ли произведена соль за последние 60 секунд, если нет, возвращает ошибку
  • fileA.php снова выполняет тот же хеш со своей последней случайной солью и предварительно сконфигурированным ключом - sha1 (sha1 ('mypassword'). $ Salt), который сравнивается с телом запроса, отправленным fileB.php. Если они совпадают, fileA.php предоставляет доступ к fileB.php.
  • fileA.php удаляет последнюю созданную соль.
0 голосов
/ 21 февраля 2010

Мало что можно сделать, если у третьей стороны есть доступ к файлу B.php. РЕФЕРЕР не дает вам никакой защиты. REMOTE_ADDR не так прост, чтобы подделать, что может дать вам некоторую уверенность в том, что запрос является законным.

0 голосов
/ 21 февраля 2010

Один из способов - проверить

$_SERVER['HTTP_REFERER']

переменная в PHP, но браузер решил заполнить ее, чтобы ей нельзя было полностью доверять.

0 голосов
/ 21 февраля 2010

Как только вы запрашиваете за пределами вашего сервера, у вас действительно нет контроля. Если файл A на другом сервере имеет возможность использовать файл B посредником, вам необходимо переосмыслить модель безопасности. Какова конкретная ситуация?

...