【问题标题】:Deny file access but server properly in IIS拒绝文件访问,但在 IIS 中正确服务器
【发布时间】:2023-03-12 22:35:02
【问题描述】:

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

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

我试过 IIS 的 URL 过滤,比如:

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

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

但是需要这个js文件的页面无法渲染。

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

【问题讨论】:

    标签: security iis


    【解决方案1】:

    我终于找到了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>
    

    目前可行,但我知道这种方式不太可靠。

    【讨论】:

    • 也非常适合 PHP!您能解释一下这是如何工作的吗?
    【解决方案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 文件,为什么不混淆它。

    【讨论】:

    • 感谢您的回答。我解决了这个问题,我会将结果发布到这个问题。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-02-22
      • 1970-01-01
      • 2014-11-14
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      相关资源
      最近更新 更多