我有一个包含在母版页中的js文件。
当用户在浏览器地址栏中输入直接链接时,我想拒绝文件访问。
我尝试过URL过滤IIS,例如:
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence="Scripts/Foo/bar.min.js" />
</denyUrlSequences>
</requestFiltering>
</security>
这确实有效,当我输入'localhost://blah/Scripts/Foo/bar.min.js'时,我被阻止了。
但页面需要此js文件才能呈现。
有没有人有解决方法?提前谢谢!
答案 0 :(得分:2)
不是100%肯定,但我认为没有办法做到这一点。当浏览器呈现您的页面时,它实际上向您发送的服务器与您在浏览器中手动输入JS文件时所执行的请求相同。
IIS无法区分您在处理页面时所做的请求以及浏览器在后台制作的请求。
可能有用的一件事是
因此,如果某人键入Scripts / Foo / bar.min.js处理程序将拒绝该请求,但在使用过期ID时也会拒绝请求。
然而,对于您的服务器来说,这很可能很难维护并且性能也很高。
如果你想隐藏你的JS文件,为什么不混淆它。
答案 1 :(得分:2)
我终于找到了this。
并将这些部分添加到web.config:
<security>
<requestFiltering>
<filteringRules>
<filteringRule name="protectjs" scanUrl="true" scanQueryString="true">
<scanHeaders>
<clear />
<add requestHeader="Accept" />
</scanHeaders>
<appliesTo>
<clear />
<add fileExtension=".js" />
</appliesTo>
<denyStrings>
<clear />
<add string="text/html" />
</denyStrings>
</filteringRule>
</filteringRules>
</requestFiltering>
</security>
目前有效,但我知道这种方式并不可靠。
答案 2 :(得分:0)
使用HttpModule并检查HttpContext.Current.Request.UrlReferrer。对于直接访问.js文件,它始终为null。
public class JSAccessModule : IHttpModule
{
public void Init(System.Web.HttpApplication Appl)
{
Appl.BeginRequest += new System.EventHandler(Rewrite_BeginRequest);
}
public void Rewrite_BeginRequest(object sender, System.EventArgs args)
{
//Block if direct Url is accessed
if (HttpContext.Current.Request.UrlReferrer == null)
{
HttpApplication App = (HttpApplication)sender;
string path = App.Request.Path;
string strExt = System.IO.Path.GetExtension(path);
if (strExt == ".js")
{
HttpContext.Current.Response.Redirect("~/AccessDenied.html");
}
}
}
public void Dispose() { }
}