Как очистить это, чтобы пользователи не могли вытаскивать страницы за пределами локального домена?
<?php if(!empty($_GET['page'])) { include($_GET['page']); } else { include('home.php'); } ?>
Самый безопасный способ – перечислить белые страницы:
$page = 'home.php'; $allowedPages = array('one.php', 'two.php', ...); if (!empty($_GET['page']) && in_array($_GET['page'], $allowedPages)) $page = $_GET['page']; include $page;
// получить абсолютное имя файла страницы, которую мы хотим видеть $ page = realpath ($ _ GET ['page']); // получить каталог, в котором находятся страницы. $ mydir = dirname (__ FILE__); // видеть, включена ли включенная страница внутри этого разрешенного каталога if ($ page === false || substr ($ page, 0, strlen ($ mydir)! = $ mydir) { умереть («уйти от хакера»); } else { включить $ page; }
Это не проверено. Я просто написал это быстро, но он должен работать (я надеюсь), и это определенно даст вам основу для начала.
define('DEFAULT_PAGE', 'home.php'); define('ALLOWED_PAGES_EXPRESSION', '^[\/]+\.php$|^[\/]+\.html$'); function ValidateRequestedPage($p) { $errors_found = False; // Make sure this isn't someone trying to reference directories absolutely. if (preg_match('^\/.+$', $p)) { $errors_found = True; } // Disable access to hidden files (IE, .htaccess), and parent directory. if (preg_match('^\..+$', $p)) { $errors_found = True; } // This shouldn't be needed for secure servers, but test for remote includes just in case... if (preg_match('.+\:\/\/.+', $p)) { $errors_found = True; } if (!preg_match(ALLOWED_PAGES_EXPRESSION, $p)) { $errors_found = True; } return !$errors_found; } if (!isset($_GET['page'])) { $page = DEFAULT_PAGE; } else { $page = $_GET['page']; } if ( !ValidateRequestedPage($page) ) { /* This is called when an error has occured on the page check. You probably want to show a 404 here instead of returning False. */ return False; } // This suggests that a valid page is being used. require_once($page);
Просто используйте оператор switch.
Проверьте, установлен ли параметр $ _GET var, а затем запустите его в случаях и по умолчанию перейдите в home.php