Другим способом дезинфицировать ввод, чтобы убедиться, что только разрешенные символы (без «/», «,«»: ", ...). Однако не использовать черный список для плохих символов, а белый список разрешенных символов:
$page = preg_replace('[^a-zA-Z0-9]', '', $page);
... а затем через file_exists.
Таким образом, вы можете убедиться, что выполняются только сценарии, которые вы хотите выполнить (например, это исключает «blabla.inc.php», потому что «.» Не разрешено).
Примечание: Это своего рода «взломать», потому что тогда пользователь мог бы выполнить «h.o.m.e», и он дал бы «домашнюю» страницу, потому что все, что он делает, - это удаление всех запрещенных символов. Он не предназначен для остановки «smartasses», которые хотят смириться с вашей страницей, но это остановит людей, делающих действительно плохо вещей.
КСТАТИ: Еще одна вещь, которую вы могли бы сделать в вас .htaccess файл, чтобы предотвратить очевидные попытки атаки:
RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /–http– [F,NC]
RewriteRule http: /–http– [F,NC]
Таким образом, все страницы обращается с «HTTP:» URL (и строки запроса) в результате сообщение об ошибке «Запрещено», даже не доходя до сценария php. Это приводит к меньшей нагрузке на сервер.
Однако имейте в виду, что в строке запроса не допускается «http». Ваш сайт может МОЖЕТЕ потребовать его в некоторых случаях (возможно, при заполнении формы).
BTW: Если вы можете читать немецкий язык: у меня также есть blog post по этой теме.
Если возможно, избегайте включения файлов динамически в целом. `include`, как вы уже испытали, почти так же опасен, как` eval`. – tdammers 2010-09-07 11:01:00