0

最初,我很抱歉我的问题标题,但我真的没有更好的想法......

我有一个 .htaccess 文件可以进行“通常”的重写:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

这让我有可能拥有这个网址,例如(我正在使用 xampp)

localhost/<project>/en/products/electronic/television/

所以这个 url 在 $_GET['url'] 变量中,我可以使用它(作为一个数组)在我的 HMVC 模式中加载控制器。

而且,为了不必输入语言(上例中的“en”),我实现了一个自动插入“en”的功能。基本上这意味着下面的 url 给出了相同的控制器,并且分别给出了相同的输出。

localhost/<project>/products/electronic/television/

但现在我想知道,我的 javascript 文件 (jquery & co) 位于文件夹中

<project>/lib/js/query/jquery.min.js

可以像这样简单地要求:

<script type="text/javascript" src="/<project>/lib/js/jquery/jquery.js"></script>

我预计请求的路径最终会是这样的(当我在 $_GET['url'] 变量中添加语言时,它会尝试加载控制器并失败......

src="/<project>/en/lib/js/jquery/jquery.js"

好吧,在那种情况下,我会很高兴它以这种方式工作,但它让我想到了尝试这个的想法:

$(document).ready(function() {
    alert("this is a test");
    $.get("/<project>/<config-dir>/<config-file>", function(data) {
        alert(data);
    });
});

瞧,它输出配置文件。我认为在生产服务器上的行为将是相同的,但是路径中没有“/”节点。在不从文档根目录移动配置文件的情况下,如何防止这种情况发生?

基本上,我已经确保 XSS 攻击不会(几乎)不成功。“几乎”只是因为没有 100% 的安全。

我希望我能很好地表达自己:) 感谢您的帮助/建议。

4

1 回答 1

0

好吧,我发现了问题所在,为什么我可以访问配置文件:重写条件。他们简单地说,如果请求的文件名不是目录或文件或链接(?),则以下规则应该生效。

RewriteEngine On

# RewriteCond %{REQUEST_FILENAME} !-d    not a directory
# RewriteCond %{REQUEST_FILENAME} !-f    not a file
# RewriteCond %{REQUEST_FILENAME} !-l    not a link(?)

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

所以基本上这解释了为什么重写规则不适用于 ajax 请求(它也不适用于正常请求)

现在我的非法访问问题解决了。

为了从重写规则中排除一些特定目录,我添加了这个规则:

RewriteRule ^(<dirname>)($|/) - [L]
于 2013-07-05T08:04:19.203 回答