PHP безопасный $ _GET или нет

У нас есть URL:

http://site.com/index.php?action=show

$_GET['action'] привык в шаблонах к контрольному числу ?action=:

switch ($_GET['action']) {
    case = "show" {
        $match_show = true;
    }
}

и в другом месте:

echo $_GET['action'];

Действительно ли абсолютно безопасно использовать это конструкции?

Как сделать их безопасными?

Спасибо.

10
задан James 2 August 2010 в 15:01
поделиться

4 ответа

С переключателем все в порядке, потому что вы сравниваете с жестко запрограммированным значением (однако это случай "show": кстати).

Как @Bruce упоминает в комментариях, вы должны добавить регистр default: , чтобы перехватить значения, которых нет в списке, или пустые значения:

switch ($_GET['action']) {

    case "show":
        $match_show = true;
        break;

    default: 
        // value is not on the list. React accordingly.
        echo "Unknown value for 'action'". 

}

Вторая вещь потенциально опасна, поскольку можно было бы вставить HTML и, что более важно, JavaScript в тело документа. Вы должны применить htmlspecialchars () к переменной перед ее повторением.

12
ответ дан 3 December 2019 в 15:34
поделиться

Иногда, когда у меня много новичков, создающих плагины или модули для сайта, я использую что-то вроде...

foreach($_GET as $key=>$value) {
  if(functions_exists('clean_get_'.$key)) {
    $_GET[$key]=call_user_func('clean_get_'.$key,$value);
  } else {
    unset($_GET[$key];
  }
}

... и все значения get и post "волшебным" образом очищаются или удаляются, так что мне не нужно беспокоиться о чужом sql-инжектируемом плагине.

Или, если вы поклонник ленивой загрузки ...

   foreach($_GET as $key=>$value) {
      if(is_file('clean_get_'.$key.'.php')) {
        include_once('clean_get_'.$key.'.php');
        if(functions_exists('clean_get_'.$key)) {
          $_GET[$key]=call_user_func('clean_get_'.$key,$value); 
        } else {
          unset($_GET[$key]);
        }
      } else {
        unset($_GET[$key];
      }
    }

ps. код был написан непосредственно здесь, возможны ошибки!

2
ответ дан 3 December 2019 в 15:34
поделиться

PHP $_GET сам по себе небезопасен, он может быть использован в нескольких областях, для хорошего чтения и примеров я рекомендую вам прочитать эту статью

http://articles.sitepoint.com/article/php-security-blunders

2
ответ дан 3 December 2019 в 15:34
поделиться

Да, как упоминалось, вы должны проверить значение любой переменной $ _ GET , прежде чем использовать ее вслепую. Но ...

Вы также должны проверить, существует ли он вообще, прежде чем использовать его. В зависимости от того, как на вашем сервере установлен error_reporting (), если вы попытаетесь использовать $ _ GET ['action'] и ? Action = something не было указано в URL-адресе, тогда вы получите E_NOTICE - Undefined index: action , которое либо загрязнит ваши журналы ошибок, либо, что еще хуже, появится в браузере.

$urlAction = isset($_GET['action']) ? $_GET['action'] : null;

if (isset($urlAction)) {
  // Rest of validation...
}
3
ответ дан 3 December 2019 в 15:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: