2013-03-27 78 views
2

我有一个包含在母版页中的js文件。在IIS中拒绝文件访问但服务器正常

我想在用户在浏览器地址栏中输入直接链接时拒绝文件访问。

我已经试过了URL过滤IIS,如:

<security> 
     <requestFiltering> 
      <denyUrlSequences> 
       <add sequence="Scripts/Foo/bar.min.js" /> 
      </denyUrlSequences> 
     </requestFiltering> 
    </security> 

这不工作,当我键入的 'localhost://blah/Scripts/Foo/bar.min.js' 我被封锁。

但是需要这个js文件的页面无法呈现。

有没有人有解决方法?提前致谢!

回答

2

不是100%肯定,但我不认为有办法做到这一点。当浏览器呈现您的页面时,它实际上会向服务器发送与您在浏览器中手动输入JS文件时执行的请求相同的请求。

IIS无法区分您制作的请求和浏览器在处理页面时在后台进行的请求。可能工作

一件事是

  1. 加入某种ID到您的JS文件中像这样的脚本/美孚/ bar.min.js?ID = E3CF305B-4444-E011-8FD2-1CC1DEE89A7F
  2. ID是有时间限制的,它的创建后的作品只有20秒左右(有足够的时间用于浏览器加载页面)
  3. 创建自定义的处理程序,将解析ID,并决定是否服务器应该返回的请求或不

所以当有人输入Scripts/Foo/bar.min.js时,处理程序会拒绝请求,但当使用过期ID时它也会拒绝请求。

但是,这很可能难以维护,并且对于您的服务器而言性能密集。

如果你想隐藏你的JS文件为什么不混淆它。

+0

谢谢你的回答。我解决了这个问题,我将把结果发布到这个问题上。 – Wayou 2013-03-28 06:01:33

2

我发现finnaly 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> 

它的工作原理目前,虽然我知道这样是不是可靠。

+0

也适用于PHP!你能解释这是如何工作的吗? – 2013-12-10 05:35:02

0

使用HttpModule并检查HttpContext.Current.Request.UrlReferrer。直接访问.js文件将始终为空。

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() { } 
}