Skip to content

Commit

Permalink
自定义获取请求头IP (#486)
Browse files Browse the repository at this point in the history
* Add custom request header to get IP

* Add custom request header to get IP

* Add dependencies "get-user-ip"

* Add dependencies "get-user-ip"

* Add environment variable description

* fix(eslint): "getIp" space-before-function-paren

* fix(eslint): "getIp" space-before-function-paren
  • Loading branch information
Lete114 authored Nov 23, 2022
1 parent 05cd75f commit 13e6f94
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/server/self-hosted/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ tkserver
| `TWIKOO_PORT` | 端口号 | `8080` |
| `TWIKOO_THROTTLE` | IP 请求限流,当同一 IP 短时间内请求次数超过阈值将对该 IP 返回错误 | `250` |
| `TWIKOO_LOCALHOST_ONLY` |`true`时只监听本地请求,使得 nginx 等服务器反代之后不暴露原始端口 | `null` |
| `TWIKOO_IP_HEADERS` | 在一些特殊情况下使用,如使用了`CloudFlare CDN` 它会将请求 IP 写到请求头的 `cf-connecting-ip` 字段上,为了能够正确的获取请求 IP 你可以写成 `['headers.cf-connecting-ip']` | `[]` |
10 changes: 9 additions & 1 deletion src/server/self-hosted/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const { version: VERSION } = require('./package.json')
const fs = require('fs')
const path = require('path')
const Loki = require('lokijs')
const getUserIP = require('get-user-ip')
const Lfsa = require('lokijs/src/loki-fs-structured-adapter')
const { v4: uuidv4 } = require('uuid') // 用户 id 生成
const {
Expand Down Expand Up @@ -894,7 +895,14 @@ async function createCollections () {
}

function getIp (request) {
return request.headers['x-forwarded-for'] || request.socket.remoteAddress || ''
try {
const { TWIKOO_IP_HEADERS } = process.env
const headers = TWIKOO_IP_HEADERS ? JSON.parse(TWIKOO_IP_HEADERS) : []
return getUserIP(request, headers)
} catch (e) {
console.error('获取 IP 错误信息:', e)
}
return getUserIP(request)
}

function clearRequestTimes () {
Expand Down
1 change: 1 addition & 0 deletions src/server/self-hosted/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"registry": "https://registry.npmjs.org/"
},
"dependencies": {
"get-user-ip": "^1.0.1",
"lokijs": "^1.5.12",
"twikoo-func": "1.6.7",
"uuid": "^8.3.2"
Expand Down
20 changes: 16 additions & 4 deletions src/server/vercel/api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

const { version: VERSION } = require('../package.json')
const MongoClient = require('mongodb').MongoClient
const getUserIP = require('get-user-ip')
const { URL } = require('url')
const { v4: uuidv4 } = require('uuid') // 用户 id 生成
const {
Expand Down Expand Up @@ -59,7 +60,7 @@ const requestTimes = {}

module.exports = async (request, response) => {
const event = request.body || {}
console.log('请求 IP:', request.headers['x-real-ip'])
console.log('请求 IP:', getIp(request))
console.log('请求函数:', event.event)
console.log('请求参数:', event)
let res = {}
Expand Down Expand Up @@ -624,7 +625,7 @@ async function parse (comment, request) {
mailMd5: comment.mail ? md5(comment.mail) : '',
link: comment.link ? comment.link : '',
ua: comment.ua,
ip: request.headers['x-real-ip'],
ip: getIp(request),
master: isBloggerMail,
url: comment.url,
href: comment.href,
Expand Down Expand Up @@ -652,7 +653,7 @@ async function limitFilter (request) {
const count = await db
.collection('comment')
.countDocuments({
ip: request.headers['x-real-ip'],
ip: getIp(request),
created: { $gt: Date.now() - 600000 }
})
if (count > limitPerMinute) {
Expand Down Expand Up @@ -836,7 +837,7 @@ async function setConfig (event) {

function protect (request) {
// 防御
const ip = request.headers['x-real-ip']
const ip = getIp(request)
requestTimes[ip] = (requestTimes[ip] || 0) + 1
if (requestTimes[ip] > MAX_REQUEST_TIMES) {
console.log(`${ip} 当前请求次数为 ${requestTimes[ip]},已超过最大请求次数`)
Expand Down Expand Up @@ -916,3 +917,14 @@ async function createCollections () {
}
return res
}

function getIp (request) {
try {
const { TWIKOO_IP_HEADERS } = process.env
const headers = TWIKOO_IP_HEADERS ? JSON.parse(TWIKOO_IP_HEADERS) : []
return getUserIP(request, headers)
} catch (e) {
console.error('获取 IP 错误信息:', e)
}
return getUserIP(request)
}
1 change: 1 addition & 0 deletions src/server/vercel/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
},
"homepage": "https://twikoo.js.org",
"dependencies": {
"get-user-ip": "^1.0.1",
"mongodb": "^3.6.3",
"twikoo-func": "1.6.7",
"uuid": "^8.3.2"
Expand Down

0 comments on commit 13e6f94

Please sign in to comment.