NodeJS、Express,判断一个请求是否是Ajax模式?

在NodeJS开发的后端程序中,如何判断一个请求是否是Ajax(Asynchronous JavaScript and XML,即:异步的 JavaScript 和 XML)。

开发环境NodeJS,使用Express框架。

据资料称,方法是判断请求头字段x-requested-with是否是xmlhttprequest。

代码如:

req.headers["x-requested-with"].toLowerCase() == "xmlhttprequest"。

但实测发现,此方法不生效。

无论是直接通过网页调用,或是Ajax,都不会出现这个请求头。

据StackOverflow论坛的资料显示,通过判断req.xhr以及请求头的accept字段:

实测发现,在发起一个ajax请求时,req.xhr也未能识别:

前端:

后端:

而生效的判断方法,似乎是检测请求头accept字段:req.headers.accept.indexOf('json')。

但它的检测依据是Ajax请求参数:dateType

dateType参数,有多个可选值:

1、"xml": 返回XML格式;

2、"html": 返回纯文本的HTML 信息

3、"script": 返回纯文本JavaScript代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)

4、"json": 返回 JSON 数据 。

5、"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。

6、"text": 返回纯文本字符串

可见,单纯的判断json字符也是不准确的。准确的来说,应该根据具体的场景,判断不同的字符。(当然,这里也可以进行配置设定。)

此外,还可以通过分析其它字段,加以辅助判断:

如,Ajax请求字段:

浏览器直接访问:

可见是有差异的,如cookie、origin等字段。

注:不同浏览器可能会有差异。

判断请求是否是AJAX的实际意义:

Web API接口已经越来越流行并广泛使用,随之而来,针对WebAPI的攻击,也越来越多。判断请求方式,是保护API接口的方式之一。

在本例子,后端的完整代码:

前端的完整代码:

进一步衍生出思考:

可能有人疑虑,如本例中,通过前端代码,可以直观地看到dateType是json,如果有其它字段,也能被直接观察。能更安全一些吗?

可以,可以对JS代码进行混淆加密。比如用JShaman,对如上代码进行保护。

保护后的代码成为:

这样就提高了JS代码的安全性,可以隐藏许多秘密了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值