2

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

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

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

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

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

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

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

4

3 回答 3

3

我终于找到了这个

并将这些部分添加到 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>

它目前有效,但我知道这种方式并不可靠。

于 2013-03-28T05:50:03.887 回答
2

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

IIS 无法区分您发出的请求和一个浏览器在处理您的页面时在后台发出的请求。

可能有效的一件事是

  1. 向您的 JS 文件添加某种 ID,例如 Scripts/Foo/bar.min.js?ID=E3CF305B-4444-E011-8FD2-1CC1DEE89A7F
  2. ID 是有时间限制的,并且在创建后仅 20 秒左右工作(足够的时间让浏览器加载页面)
  3. 创建将解析 ID 并决定服务器是否应返回请求的自定义处理程序

因此,当有人键入 Scripts/Foo/bar.min.js 时,处理程序将拒绝请求,但在使用过期 ID 时它也会拒绝请求。

但是,这很可能很难维护,并且对您的服务器来说也是性能密集型的。

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

于 2013-03-27T12:43:32.993 回答
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() { }
}
于 2014-09-04T19:05:11.637 回答