在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代码的安全性,可以隐藏许多秘密了。
本文暂时没有评论,来添加一个吧(●'◡'●)