我刚刚草拟了主要的 index.php 文件。它应该是所有站点请求的网关。我想要这样做的原因是拥有干净的 URL。
我已将我的网站拆分为模块。(例如:注册、文章等)
然后我在 .htaccess 中加入了一些行,其中之一是:
RewriteRule ^([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?([a-zA-Z0-9-]*)[/]?$ index.php?1=$1&2=$2&3=$3&4=$4&5=$5&6=$6&7=$7&8=$8&9=$9 [L,NC]
这只是将每个“文件夹”映射到正确的 $_GET 元素... domain/1/hi/3
$_GET['2'] == 'hi'; // TRUE
所以我想根据第一个 $_GET 元素运行模块。这样我就可以让我的项目井井有条。与模块关联的所有文件都在其文件夹中。
这是我的文件夹结构:
/
modules/
register/
ajax/
process.php
register.php
articles/
articles.php
index.php
这是映射所有内容的 PHP 代码(index.php):
<?php
$basePath = 'modules';
for ($x = 1; $x <= 9; $x++) {
if (preg_match('/[^a-zA-Z0-9-]/', $_GET[$x])) {
require_once(__DIR__ . "/$basePath/404/404.php");
die();
}
}
$baseModule = $_GET['1'];
if (file_exists(__DIR__ . "/$basePath/$baseModule/$baseModule.php")) {
require_once(__DIR__ . "/$basePath/$baseModule/$baseModule.php");
} else {
require_once(__DIR__ . "/$basePath/404/404.php");
}
这是危险代码吗?我执行正则表达式的原因是检查 GET 是否不包含 . 或 / 可用于执行 ../ 并因此运行服务器上的几乎任何文件...
这是否仍然构成安全漏洞、潜在的安全漏洞,还是实际上是不好的做法?
解决这个问题的最佳方法是什么?