这个PHP代码是危险的吗?

时间:2012-10-24 21:43:08

标签: php security

我刚刚绘制了主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不包含。或者/ /可以用来做../因此几乎可以在服务器上运行任何文件...

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

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

3 个答案:

答案 0 :(得分:1)

在我看来是的 - 阅读包括注射。与其他部分结合使用,例如不安全的文件上传,甚至可以“杀死”。请参阅here

__DIR__ . "/$basePath/$baseModule/$baseModule.php"

答案 1 :(得分:0)

RewriteRule ^/article/(.*)$ http://example.com/articles/articles.php

然后在article.php中,您可以查看url段并按照您的需要处理。

@ gschwa的方法也很有用。

答案 2 :(得分:0)

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

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

请向上或向下投票,我会以最多的票数接受答案。 (如果我接受这个答案,我不会得到任何声誉。)