Несколько советов, как обезопасить свой сайт на php.
Пример 1.
У вас сайт загружен на shared-хостинг, доступа к конфигурации нет, register_globals включен (хоть эта функция и считается устаревшей, но некоторые хостинги ее включают).
В вашем скрипте глобальные параметры _GET, _POST и т.д. обрабатываются без фильтрации.
Поздравляю, ваш сайт открыт любому, кто хоть как-то знаком с инъекциями (XSS, SQL).
Вот как можно обезопасить свой сайт.
function unregister_globals() {
if (ini_get(register_globals)) {
$array = array('_REQUEST', '_SESSION', '_SERVER', '_ENV', '_FILES');
foreach ($array as $value) {
$$value = [];
}
}
foreach ($_COOKIE as $key => $value) {
if (!is_array($value)) {
${$key} = trim(rawurldecode($value));
} else {
${$key} = $value;
}
}
foreach ($_GET as $key => $value) {
if (!is_array($value)) {
${$key} = trim(addslashes(rawurldecode($value)));
} else {
${$key} = $value;
}
}
foreach ($_POST as $key => $value) {
if (!is_array($value)) {
${$key} = trim(addslashes(rawurldecode($value)));
} else {
${$key} = $value;
}
}
foreach ($_REQUEST as $key => $value) {
if (!is_array($value)) {
${$key} = trim(rawurldecode($value));
} else {
${$key} = $value;
}
}
foreach ($_SERVER as $key => $value) {
if (!is_array($value)) {
${$key} = trim(rawurldecode($value));
} else {
${$key} = $value;
}
}
}
Теперь достаточно вызвать функцию unregister_globals(), в начале главного файла php, или в начале каждого скрипта (если обращение идет к разным php-файлам).
Что делает эта функция:
- Удаляет глобальные переменные, если включена опция register_globals (повторюсь, в новой версии PHP register_globals удалена).
- Удаляет пробелы из начала и конца строки.
- Декодирует URL-кодированные строки.
- Для _GET и _POST Экранирует спецсимволы в строке.
Теперь ваши скрипты уже немного будут защищены, но это еще не все.
Есть еще много вариантов по фильтрации и защите от атак.
Если нужно могу продолжить, и рассказать еще о некоторых вариантах защиты.