在IIS中拒绝文件访问但服务器正常

时间:2013-03-27 01:56:52

标签: security iis

我有一个包含在母版页中的js文件。

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

我尝试过URL过滤IIS,例如:

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

这确实有效,当我输入'localhost://blah/Scripts/Foo/bar.min.js'时,我被阻止了。

但页面需要此js文件才能呈现。

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

3 个答案:

答案 0 :(得分:2)

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

IIS无法区分您在处理页面时所做的请求以及浏览器在后台制作的请求。

可能有用的一件事是

  1. 在您的JS文件中添加某种ID,例如Scripts / Foo / bar.min.js?ID = E3CF305B-4444-E011-8FD2-1CC1DEE89A7F
  2. ID是有时间限制的,创建后只需20秒左右(浏览器有足够的时间加载页面)
  3. 创建自定义处理程序,该处理程序将解析ID并决定服务器是否应该返回请求
  4. 因此,如果某人键入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() { }
}