У меня есть сайт в php, который включает () для встраивания содержимого в шаблон. Загружаемая страница указана в параметре get, я добавляю «.php» в конец параметра и включаю эту страницу. Мне нужно сделать некоторые проверки безопасности, чтобы избежать XSS или других вещей (а не mysql инъекции, так как у нас нет базы данных). Я придумал следующее.
$page = $_GET['page']; if(!strpos(strtolower($page), 'http') || !strpos($page, '/') || !strpos($page, '\\') || !strpos($page, '..')) { //append ".php" to $page and include the page
Есть ли еще одна вещь, которую я могу сделать для дальнейшей дезинфекции моего вклада?
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']);
Вероятно, это самый быстрый способ его дезинфекции, это займет все и убедитесь, что оно содержит только буквы, цифры, символы подчеркивания или тире.
Не «санировать» – атаки зависят от использования данных, а не от источника. Выигрывайте значения при их выводе. См. Также мой ответ на вопрос: Каков наилучший метод для дезинфекции ввода пользователя с помощью PHP?
Определите явный список страниц, которые у вас есть в исходном коде, а затем используйте его для проверки ввода. Да, это больше работы, но она дает понять, что разрешено, а что нет. Например:
$AVAILABLE_PAGES = array('home', 'news', ...); $AVAILABLE_PAGES = array_fill_keys($AVAILABLE_PAGES, 1); $page = $_GET['page']; if (!$AVAILABLE_PAGES[$page]) { header("HTTP/1.0 404 Not Found"); die('Page not found.'); } include "pages/$page.php";