2

nodejs 中如何校验请求中的 referer

 3 years ago
source link: https://www.xiabingbao.com/post/nodejs/nodejs-check-referer-r2zde7.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

nodejs 中如何校验请求中的 referer

蚊子前端博客
发布于 2021-11-22 23:51
使用nodejs做服务器,接收到的请求千奇百怪,如何判断请求中的referer呢?

我们在写 nodejs 服务时,经常需要校验请求中的 referer 字段。有些只需要校验 referer 中的 hostname 是否合法即可,有些则要校验 referer 中的协议或者端口。

同时,接收到的 referer 字段最后还有个斜杠/,若我们使用完全相等判断法,可能会造成前后端联调不太方便。

那么该如何更方便的校验 referer 呢?

这就要用到我们在上一篇文章如何在 nodejs 的原生 http 服务中获取请求参数中讲到的URL构造函数,这个函数可以把 url 拆分成几部分,然后我们可以分别进行判断。

如,我们设置几个 referer 白名单,同时不限制端口:

// 从headers中获取到referer
const { referer, origin, host } = req.headers;
const selfOrigin = referer || origin || `//${host}`;

// 只匹配中间的域名,协议和端口均忽略
const { hostname } = new URL(selfOrigin, 'http://localhost/');

// 设置访问白名单
const ALLOW_HOSTS = ['joke.qq.com', 'news.qq.com'];

// 当不在白名单中时,则返回403
if (!ALLOW_HOSTS.includes(hostname)) {
  res.status(403).end('403 forbidden');
  next('403 forbidden');
}

若需要校验端口时,可以再加上端口的判断,如端口只能是空、80和443等。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK