最初,我对我的问题标题感到抱歉,但真的没有什么比这更好了....
我有一个.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%的安全性。
我希望我表达得很好:) 感谢您的帮助/建议。
答案 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]