1

我刚刚草拟了主要的 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 是否不包含 . 或 / 可用于执行 ../ 并因此运行服务器上的几乎任何文件...

这是否仍然构成安全漏洞、潜在的安全漏洞,还是实际上是不好的做法?

解决这个问题的最佳方法是什么?

4

3 回答 3

1

在我看来是的 - 阅读有关包括注射的信息。结合其他部分,例如不安全的文件上传,这甚至可能“杀死”。见这里

__DIR__ . "/$basePath/$baseModule/$baseModule.php"
于 2012-10-24T22:13:11.440 回答
0
RewriteRule ^/article/(.*)$ http://example.com/articles/articles.php

然后在 article.php 中查看 url 段并根据需要进行处理。

@gschwa 的方法也很有效。

于 2012-10-24T22:10:55.387 回答
0

我认为在数组中定义所有选项是最好的选择,因为在使用 in_array() 验证代码时,它不会对我的代码产生速度影响。该代码不安全,因为它可能允许攻击。我还没有找到任何能够穿透安全性的方法,但我认为它仍然有点边缘。

我认为这是最好的选择的原因是 Apache 很慢。

请对这个答案投赞成票或反对票,我会接受得票最多的答案。(无论如何,如果我接受这个答案,我就不会获得任何声誉。)

于 2012-10-25T14:22:39.723 回答