Проверка, является ли реферер пустым или находится в массиве - PullRequest
1 голос
/ 25 августа 2011

Я пытаюсь написать оператор if, который в основном проверяет, находится ли реферер пользователей в списке разрешенных рефереров, и если нет, не удается.

У меня есть две переменные, управляющие этими $this->allowAllReferer и $this->allowEmptyReferer,которые в соответствии с их именем решают, следует ли разрешить доступ каждому рефереру и, соответственно, пустые рефереры.А также $this->allowedReferers, который является массивом разрешенных рефереров.

У меня есть эта функция, ниже которой я уверен, что она не работает должным образом, но я смотрел и настраивал ее в течение получаса, и я дошел до того, что не могу сказать, если этоработает или нет.

//If the referee is empty and allow empty referrer is false
//or
//If it is not in the allowed list and allow all referer is false 
if(!(empty($_SERVER['HTTP_REFERER']) && $this->allowEmptyReferer)
    &&
   !(!$this->allowAllReferer && in_array(
      strtolower(empty($_SERVER['HTTP_REFERER']) ? null : $_SERVER['HTTP_REFERER']), //Silly php access null variable
      $this->allowedReferers)
    )) {
    throw new sfException("Internal server error. Please contact system administrator. File download disabled.");
} 

Знаете ли вы правильный или лучший способ сделать это / можете ли вы подтвердить вышеуказанные работы?


Случаи, надеюсь, это проясняет ситуацию

empty_referrer | allowEmpty | in_array | allReferer | result
----------------------------------------------------------------
true           | true       | false    | false      | false - no error - empty allowed
false          | true       | false    | false      | true - error - not in array
false          | true       | false    | true       | false - no error - not in array but allowed
false          | false      | false    | false      | true - error - empty and now allowed

Ответы [ 5 ]

4 голосов
/ 25 августа 2011

Если вы хотите сохранить логику в одном огромном блоке if, попробуйте следующее:

if (
    // throw an error if it's empty and it's not allowed to be
    (empty($_SERVER['HTTP_REFERER']) && !$this->allowEmptyReferer)
    || (
      // don't bother throwing an error if all are allowed or empty is allowed
      (!empty($_SERVER['HTTP_REFERER']) && !$this->allowAllReferer)
      // throw an error if it's not in the array
      && !in_array((empty($_SERVER['HTTP_REFERER']) ? null : strtolower($_SERVER['HTTP_REFERER'])), $this->allowedReferers)
    )
)
{
  throw new sfException("Internal server error. Please contact system administrator. File download disabled.");
}

Вторая проверка пустости теперь будет пропускать in_array, если он пуст.

3 голосов
/ 25 августа 2011

Как насчет этого:

$ref = &$_SERVER['HTTP_REFERER'];
if($allowAll) {
  // allowed
} else if($allowEmpty && empty($ref)) {
  // allowed
} else if(!empty($ref) && in_array($ref, $allowedReferers)) {
  // allowed
} else {
  // fail
}

Если вы хотите, чтобы все проверки выполнялись в одном if, вы можете просто связать воедино условия, используя or / ||.Оценка короткого замыкания обеспечивает правильные значения переменных и немедленное прекращение проверки состояния:

$ref = &$_SERVER['HTTP_REFERER'];
if($allowAll
    || ($allowEmpty && empty($ref))
    || (!empty($ref) && in_array($ref, $allowedReferers))) {
  // allowed
} else {
  // fail
}
0 голосов
/ 05 сентября 2013
if(isset($_SERVER['HTTP_REFERER'])) {
    echo $_SERVER['HTTP_REFERER'];
}
0 голосов
/ 25 августа 2011

Я бы упростил вашу логику, примерно так:

if (!$this->allowAllReferer)
{
    if (empty($_SERVER['HTTP_REFERER']) && !$this->allowEmptyReferer)
    {
        // emtpy referer - not allowed. handle as you wish (throw exception?)
    }

    else if (!empty($_SERVER['HTTP_REFERER']) &&
        !in_array(strtolower($_SERVER['HTTP_REFERER'])), $this->allowedReferers)
    {
        // referer supplied is not approved/allowed. - handle appropriately.
    }

    else
    {
        // referer should be ok if we get here.
    }   

}

т.е.Прежде всего, если вы разрешаете все рефереры, тогда вам не нужно выполнять какую-либо обработку - просто пропустите это (if (!this->allowAllReferer)).Во-вторых, разбейте свои логические проверки на блоки управления, чтобы было проще писать, читать и обслуживать.

0 голосов
/ 25 августа 2011

Если я правильно понял ваши требования, то это больше всего соответствует вашему исходному коду

        if( (!$this->allowEmptyReferer && empty($_SERVER['HTTP_REFERER'])
           || (!$this->allowAllReferer && !in_array(
          strtolower(empty($_SERVER['HTTP_REFERER']) ? null : $_SERVER['HTTP_REFERER']),
          $this->allowedReferers)
        ) { // throw your exception } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...