【问题标题】:Differenciate Between User Requests and AJAX/Resource Requests区分用户请求和 AJAX/资源请求
【发布时间】:2016-01-11 12:55:31
【问题描述】:

我正在尝试使用 Node.js(使用 http.createServer())创建一个应用程序,这将是一个通过 XMLHttpRequest 请求数据的单页应用程序。为此,我需要能够区分导航到我的域的用户、AJAX 请求和浏览器为链接资源生成的请求。

如果请求来自用户,我总是希望返回 index.html 页面,该页面将处理请求内容,但如果请求是浏览器生成或 AJAX 并且针对 CSS、Javascript 或其他链接文件,我想提供这些文件.有什么方法可以检测到吗?

查看不同文件类型的请求标头,我看到在页面生成内容请求时出现了referer 标头。我认为这是我正在寻找的解决方案,但是当用户单击页面链接时也会设置该标题,使其无用。

似乎唯一改变的是accept 标头,它可以工作,但可能不是一个包罗万象的解决方案。无论输入哪个 url,任何用户请求似乎总是将text/html 作为首选返回类型。我可以检测到这一点,但我很确定对 html 文件的 AJAX 请求也会有 accept 标头,这会导致问题。

这里有什么我遗漏的(我可以查找的任何标题或属性)吗?


编辑:我不需要保护文件的解决方案,我也不关心用户用自己的请求绕过它。我的目的不是隐藏文件或使它们安全,而是将请求的任何数据保留在应用程序的范围内。

例如,如果用户导航到 http://example.com/images/someimage.jpg,他们会看到 index.html 文件,然后该文件可以在更丰富的上下文中显示图像,并包含所有链接和功能。

TL/DR:我需要检测何时有人尝试访问该应用,然后为他们提供索引页面并让他们发送他们想要的内容。我还需要检测浏览器何时请求了应用程序所需的资源(JS、CSS、HTML、图像等),以便能够实际返回资源而不是索引文件。

【问题讨论】:

  • 如果这是为了阻止水蛭抓取数据,那么您将面临数据的重要性。如果没有,用户是否会意外发现并发送除 index.html 之外的其他请求?
  • 你想做的和快递做的有什么不同?

标签: javascript node.js http http-headers


【解决方案1】:

就 HTTP 协议而言,用户生成的查询浏览器生成的查询之间没有区别。

每个查询都只是……一个查询。 您可以使用命令行进行查询,使用浏览器,您可以单击链接,通过 telnet 发送一些 ascii 文本,请求将为您进行查询的代理,服务器目标永远不会识别查询的请求方式由用户。

例如,查看用户在反向代理缓存上发出的请求,此查询永远不会到达您的服务器(响应来自缓存),构建此响应的第一个查询可能由 a真实用户或浏览器。

在尝试控制用户从不请求数据的安全性方面,自己无法通过检测查询是真正的人工点击来完成(如果您愿意,可以在谷歌搜索点击劫持)害怕)。浏览器可以进行的每一个查询也可以由用户播放,每一个,你都没有办法阻止。

一些浏览器插件甚至会进行预取,检测页面上的链接并在您自己执行之前发出请求(如果是 GET 查询)。

对于 ajax,像 JQuery 这样的一些库会添加一个X-Requested-With: XMLHttpRequest 标头,这在大多数框架上用于检测 ajax 模式。 但是依赖于位置策略会更加稳健(比如使用/format/ajax 进行ajax 查询,它也可以用于其他方式(比如/format/json/format/html/format/csv)。

花时间在基于位置策略的路由上肯定更有用。

但有一点可以产生影响,POST 查询不是幂等的,这意味着浏览器不能没有真正的用户交互来进行 POST 查询,因为 POST 查询可能会改变会话的状态或者服务器数据的状态(但是js可以进行POST查询,这只是浏览器的默认行为)。浏览器永远不会自动检索 POST 查询,因此您可以创建一个所有用户交互都是 POST 查询的网站(通过表单或通过一些 js 更改链接点击以发送 POST ajax 查询)。但我不是你真正的目标。

【讨论】:

    【解决方案2】:

    从技术上讲,这不是问题的答案,但我找到了一个简单的解决方案,可以满足我的要求:在所有基于应用程序的请求前加上一个子域,例如。 http://data.example.com/。然后检查该子域的host 标头非常简单:如果存在则发送资源,否则发送索引页。

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 2012-04-14
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多