在 HttpHandler 中确定 Request 是否合法

Determine if Request is Legit in HttpHandler

我最近设置了一个 httpHandler 来保护我的 HTML 文件不被恶意用户直接提取。我以前从未做过这样的事情,经过大量研究,使用 httpHandler 似乎是最好的结果。然而,所有教程都解释了如何设置处理程序,但似乎都以 "Now just check to see if the request is legitimate or not!" 之类的内容结尾,而没有解释如何完成。

有很多示例可以说明如何停止来自其他域的请求,例如,停止图像窃取。我想要做的是允许我的 Angular 层发出对 HTML 文件的请求,但阻止浏览器直接发出的请求。也就是说,如果 Angular 请求一个 HTML 模板,它应该得到它,但如果有人在浏览器栏中输入 "mysite.com/static/templates/template.html",它应该被阻止。

我想出的解决方案是 Angular 为每个请求发送自定义 header;然后 httpHandler 查找此 header 和 returns 是否存在 HTML 文件(如果 header 存在)。因此,如果请求不是来自 Angular 生态系统,它就没有 header,并且会被退回。这种方法有两个问题:

  1. 有点脆弱。我们已经收到(诚然很少见)用户的报告,他们在不该被阻止的时候被阻止了,我无法确定为什么会发生这种情况。

  2. 它不适用于 javaScript 文件。 JS 文件不会以相同的方式加载,所以我无法以相同的方式保护它们。

是否有更好的方法来判断请求是直接来自浏览器栏,还是合法地来自我的 UI?

前端是 angular,后端是 .NET 4.5。

不,没有。您最多只能查看 headers。 "nefarious" 用户复制合法 header 的任何内容并获取数据是微不足道的。

如果您仔细想想,输入 url、浏览器下载资源或 ajax 调用(header 除外)在技术上没有区别秒)。即使您使用的是 https,也可以使用 Fiddler 等工具或大多数现代语言中的两到三行代码轻松复制。

我不知道你为什么要这样做,但如果是由于带宽或其他原因,我建议使用缓存。在这里详细介绍一个主题,所以我不会。

如果您追求的是文件的安全性(例如,您不希望有人在浏览器之外查看 js 文件或 html 文件),那么您基本上就不走运了,因为这样的事情根本不可能。