重写规则在jquery.get()上不起作用?

时间:2013-07-04 11:16:09

标签: ajax .htaccess xss

最初,我对我的问题标题感到抱歉,但真的没有什么比这更好了....

我有一个.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&amp; 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%的安全性。

我希望我表达得很好:) 感谢您的帮助/建议。

1 个答案:

答案 0 :(得分: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]