Мы всегда спорим насчет защиты на сайте. Я считаю что такой вид навигации очень надежен, мне не верят... Рассудите нас пожалуйсто... Вот пример того, как я использую этот пример и как я его защищаю...
<?
include "mysql.php";
include "functions.php";
$paga=substr($paga, 0, 10);
$paga=htmlspecialchars($paga, ENT_QUOTES);
$id=substr($id, 0, 3);
$id=htmlspecialchars($id, ENT_QUOTES);
?>
<html>
<body>
<table width=100%>
<tr>
<td>
<? include "header.php";?>
</td>
</tr>
<tr>
<td>
<?
$paga=$_GET[\'paga\'];
$paga=eregi_replace("/","",$paga);
$paga=eregi_replace("http://","",$paga);
if(empty($paga))
include("./pages/news.php");
elseif(file_exists("./pages/".basename($paga).".php"))
include("./pages/".basename($paga).".php");
else {
$paga="error";
include("./pages/error.php");
}
?>
</td>
</tr>
<tr>
<td>
<? include "footer.php";?>
</td>
</tr>
</table>
</body>
</html>
<? mysql_close($db);?>
Итак... давайте разберемся. Сначала я инклужу mysql и functions, это к делу отношение не имеет. Затем я обрезаю параметры $paga и $id lj 10 и 3 символов соответственно и заменяю все опасные символы (ковычки итп) на их коды. Не помню в какой системе. Зачем? позже объясню...
Далее идут хтмл теги, инклуд шапки и нижней части, а в середину я инклужу параметр $paga. По коду видно, что исходя из параметра, инклудится тот или иной файл из папки /pages/.
Вот и все. А теперь, почему он такой надежный...
1. $paga=$_GET[\'paga\']; тут все ясно. $paga присваевается переменная, переданная ГЕТом.
2. $paga=eregi_replace("/","",$paga);
$paga=eregi_replace("http://","",$paga);
В переменной $paga стираются (заменяются на пустоту) все слеши и "http://". Обычная ошибка - использование не eregi_replace а str_replace. При str_replace заменяются символы в строгом регистре, а в первом случае без учета регистра!
Исходя из этого, внешний инклуд уже не возможен!!! Локальный тоже, т.к. режутся все слеши. Можно также резать точки, но я использую их.
3. if(empty($paga)) проверяется значение на пустоту. Если $зфпф пустая, например в браузере набрано index.php без параметров, то грузится pages/news.php.
4. file_exists("./pages/".basename($paga).".php"). Сначала переменная $paga образается с помощью basename(), долго объяснять, прочтите ман... она выдерает из всей строки только имя конечного файла. Потом проверяется файл на существование. Если его нет, то грузится файл error.php. Если файл существует, то он инклудится.
5. На 4-ом пункте ничего не останавливается =))) Продолжаем. В начале вспомните строчки $paga=substr($paga, 0, 10);... Я рассказывал для чего они. А теперь смотрите!!! Когда мы обращаемся например к конкретной новости, например index.php?paga=news&id=5, то грузится то сначала index.php, а он в самом начале образает переменные $paga и $id, таким образом построев всю систему навигации в одном файле, можно лишь один раз указать какие переменные и как фильтровать и все!!! Вот в чем прелесть!!!
Хочется услышать ваши мнения о данном типе навигации, его недочеты. Может я что-то упустил, укажите пожалуйсто.