몇 개의 IP를 제외한 모든 사람에게 미들웨어를 적용해야하는데 경로를 벗어난 요청과 해상도를 얻을 수 없습니다. 어떻게 적용 할 수 있습니까?

WrenchX

내 익스프레스 코드는 다음과 같습니다.

        res.setHeader('Content-Type', 'application/json');
        if (req.query.uuid) {
            db.getPlayerByUUID(req.query.uuid, (data) => {
                res.send(data)
            })
        } else if (req.query.name != null) {
            db.getPlayerByName(req.query.name, (data) => {
                res.send(data)
            })
        }
    }).use(rateLimiter(req))

그리고 여기 내 미들웨어가 있습니다.

const fs = require('fs')
const rateLimit = require('express-rate-limit')

const whitelist = JSON.parse(fs.readFileSync("./config/whitelist.json").toString())
const blacklist = JSON.parse(fs.readFileSync("./config/whitelist.json").toString())

const config = JSON.parse(fs.readFileSync("./config/config.json").toString())

const rateLimiter = (req) => {
    const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    if (blacklist.indexOf(ip) <= -1) {
        console.log(ip)
        if (whitelist.indexOf(ip) <= -1) {
            const rateLimiter = rateLimit({
                windowMs: 60 * 1000,
                max: config.webserver.limit,
                message: {error: 'You have exceeded the requests in 1 min limit! Please try again soon.'},
                headers: true,
            })
        }
    } else {
        res.status(403).send('You cannot use this service!');
    }
}

module.exports = {
    rateLimiter
}

그렇다면 내 IP를 미들웨어로 보내거나 익스프레스 코드에서 IP를 확인하고 IP가 내 화이트리스트 파일에없는 경우에만 사용할 수 있습니까? 이 문제는 나를 죽이고 있습니다 : /.

내 질문이 바보라면 죄송합니다. 전에는 Express와 함께 일한 적이 없습니다.

jfriend00

주요 문제는 다음과 같습니다.

}).use(rateLimiter(req))

그 전에 오는 것을 정확히 표시하지는 않지만 이것이 app.use()또는 router.use()인 경우 미들웨어를 다음과 같이 전달하는 방법을 수정해야합니다.

app.use(rateLimiter)

나중에 호출 할 수 있도록 미들웨어 함수 rateLimiter전달합니다 app.use(). 모든 미들웨어는 세 개의 인수로 호출됩니다. (req, res, next)따라서 미들웨어를 이에 맞게 수정해야합니다.

그런 다음 목표를 달성하기 위해 미들웨어에서 이러한 매개 변수를 적절하게 사용해야합니다. 이것이 어떻게 작동하는지 보여주는 가능한 구현이 있습니다.

// create middleware from your rate limiting package to later conditionally apply
const limiter = rateLimit({
    windowMs: 60 * 1000,
    max: config.webserver.limit,
    message: {error: 'You have exceeded the requests in 1 min limit! Please try again soon.'},
    headers: true,
})

const rateLimiter = (req, res, next) => {
    const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

    // implement your ip address limiting here
    // you should have one of three outcomes
    // 1. You call next() to allow the routing to continue for this request
    // 2. You call next(someError) to abort routing and fall-through to 
    //    your Express error handler
    // 3. You send a response using something like res.status(xxx).send(), 
    //    thus ending the request

    // block this request if the IP address is on the blacklist
    if (blacklist.indexOf(ip) >= 0) {
        res.status(403).send('You cannot use this service!');
        return;
    }

    // if the IP address is on the whitelist, then let it go
    if (whitelist.indexOf(ip) >= 0) {
        // continue routing
        next();
        return;
    }

    // apply rate limiter middleware
    limiter(req, res, next);
}

app.use(rateLimiter);

이것은 limiter여기 라는 미들웨어 미들웨어를 만듭니다 rateLimiter. rateLimiter미들웨어의 덕택으로 모든 요청에 들어오는 요청에 호출됩니다 app.use(rateLimiter). 그런 다음 그 안에서 블랙리스트와 화이트리스트를 확인합니다. 블랙리스트에 있으면 요청을 단락시키고 403으로 종료합니다. 화이트리스트에 있으면 라우팅을 계속하고 후속 라우트 핸들러가 처리하도록합니다. 두 목록에없는 경우 속도 제한 미들웨어를 수동으로 호출하고 미들웨어 (req, res, next)로 전달 된 항목을 전달하여 조건부로 속도 제한을 적용 합니다.


귀하가 제기 한 질문에 대한 기타 의견 :

몇 개의 IP를 제외한 모든 사람에게 미들웨어를 적용해야하는데 경로를 벗어난 요청과 해상도를 얻을 수 없습니다. 어떻게 적용 할 수 있습니까?

req그리고 res단지 주어진 들어오는 요청을 처리하는 과정에서 존재한다. 따라서 요청이 끝나면 해당 요청과 관련된 객체는 가비지 수집되어 더 이상 사용할 수 없습니다. 어딘가에 그것들을 채워 넣었다고하더라도 res객체 와 관련된 소켓 이 끝났고 닫힐 가능성이 높고 누구에게도 더 많은 데이터를 보낼 수 없기 때문에 그다지 좋지 않을 것입니다.

그래서, 당신은에 액세스 할 수 없습니다 reqres경로 또는 미들웨어를 처리하는 외부. 그것이 사용 가능하고 유용한 곳입니다.

그렇다면 내 IP를 미들웨어로 보내거나 익스프레스 코드에서 IP를 확인하고 IP가 내 화이트리스트 파일에없는 경우에만 사용할 수 있습니까? 이 문제는 나를 죽이고있다

들어오는 요청의 IP 주소는 req개체 에서 사용할 수 있습니다 . 당신의 미들웨어는 그것에 접근 할 수 있습니다.

이를 수행하는 일반적인 방법은 다음과 같습니다.

const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

여기에 대한 더 많은 논의가 있지만 코드를 보면 이미 알고있는 것 같습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관