在用户请求和AJAX /资源请求之间进行区分

时间:2016-01-11 12:55:32

标签: javascript node.js http http-headers

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

如果请求来自用户,我总是希望返回index.html页面,该页面将处理请求内容但是如果请求是浏览器生成的或AJAX并且是用于CSS,Javascript或其他我希望提供的链接文件那些文件。有没有办法检测到这个?

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

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

我在这里找不到任何东西(我可以找到的任何标题或属性)?

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

某些浏览器插件甚至会进行预取,检测页面上的链接并在您自己执行之前发出请求(如果它是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查询)。但我不是那个你真正的目标。

答案 1 :(得分:0)

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