REMOTE_ADDR пуст, не включен в массив SERVER - PullRequest
3 голосов
/ 19 марта 2011

У меня странная проблема после перехода на новый сервер. Крон для получения почты проверяет авторизованные IP-адреса, один из которых по умолчанию 127.0.0.1

Он перестал работать после перемещения, поскольку переменная REMOTE_ADDR не заполнена. Это когда вызывается из браузера, но не когда запускается из cron или из консоли с помощью php. Я сбросил переменную $ _SERVER, и это все, что есть в cron / console

(
   [SHELL] => /bin/sh
   [MAILTO] => *removed*
   [USER] => *removed*
   [PATH] => /usr/bin:/bin
   [PWD] => /home/*removed*
   [SHLVL] => 1
   [HOME] => /home/*removed*
   [LOGNAME] => *removed*
   [_] => /usr/local/bin/php
   [PHP_SELF] => /home/*removed*/public_html/support/cron.php
   [SCRIPT_NAME] => /home/*removed*/public_html/support/cron.php
   [SCRIPT_FILENAME] => /home/*removed*/public_html/support/cron.php
   [PATH_TRANSLATED] => /home/*removed*/public_html/support/cron.php
   [DOCUMENT_ROOT] =>
   [REQUEST_TIME] => 1300522141
   [argv] => Array
       (
           [0] => /home/*removed*/public_html/support/cron.php
       )

   [argc] => 1
)

if(!$cron->isValidIp($_SERVER['REMOTE_ADDR'])) {
    echo sprintf("[ERROR]: Your IP %s is not authorized to run scheduled tasks.  Please notify your administrator.",
        $_SERVER['REMOTE_ADDR']
    );

        // [JAS]: Test all our IPs for a wildcard match
        if(is_array($this->valid_ips))
        foreach($this->valid_ips as $mask) {
            if(empty($mask)) continue;
            if(0 == strcmp(substr($ip,0,strlen($mask)),$mask)) {
                return true;
            }

Ответы [ 2 ]

6 голосов
/ 19 марта 2011

Переменная $_SERVER['REMOTE_ADDR'] заполняется из-за Apache, запускаемого из командной строки, эта переменная не будет установлена, как и многие другие.

Кроме того, даже если он установлен, REMOTE_ADDR всегда будет локальным IP-адресом машины, на которой работает cron, поскольку вы не сможете запустить его удаленно.

[править]

Просто для согласованности, вот пример использования php_sapi_name

if(php_sapi_name() === 'cli') {
    // You're running locally from the CLI
} else {
    // You're running remotely, check against list of authorized ip addresses.
}

В вашем случае вы можете просто изменить свой if на:

if(php_sapi_name() != 'cli' && !$cron->isValidIp($_SERVER['REMOTE_ADDR'])) {
    ....
1 голос
/ 19 марта 2011

REMOTE_ADDR не заполняется при запуске из сценария командной строки, поскольку его значение получается из заголовков HTTP.

Вы пытаетесь проверить это, чтобы убедиться, что сценарий не запускается из Интернетабраузер?Если это так, вы можете переместить его в каталог выше корневого веб-узла и разрешить cron запускать его таким образом.

...