У нас есть URL:
http://site.com/index.php?action=show
$_GET['action']
привык в шаблонах к контрольному числу ?action=
:
switch ($_GET['action']) {
case = "show" {
$match_show = true;
}
}
и в другом месте:
echo $_GET['action'];
Действительно ли абсолютно безопасно использовать это конструкции?
Как сделать их безопасными?
Спасибо.
С переключателем все в порядке, потому что вы сравниваете с жестко запрограммированным значением (однако это случай "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 ()
к переменной перед ее повторением.
Иногда, когда у меня много новичков, создающих плагины или модули для сайта, я использую что-то вроде...
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. код был написан непосредственно здесь, возможны ошибки!
PHP $_GET
сам по себе небезопасен, он может быть использован в нескольких областях, для хорошего чтения и примеров я рекомендую вам прочитать эту статью
Да, как упоминалось, вы должны проверить значение любой переменной $ _ 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...
}