Предотвращение постов от источника кроме домена с axios - PullRequest
0 голосов
/ 23 февраля 2020

Я работаю над своим первым веб-сайтом и использую топор ios для отправки запросов на отправку / получение на серверную часть. Я использую React на переднем конце и узел / express на заднем плане. Мне интересно, есть ли способ предотвратить посты из источника, отличного от моего сайта.

Например, если я сделаю этот точный запрос через почтальона, я все еще смогу оставлять комментарии, что означает, что кто-то может публиковать сообщения с именами и идентификаторами, отличными от себя.

Вот типичный пост запрос, сделанный на клиентской стороне:

axios.post('/api/forumActions/postComment', {}, {
            params: {
              postUserID: this.props.auth.user.id,
              name: `${this.props.auth.user.firstName} ${this.props.auth.user.lastName}`,
              commentContent: this.state.commentContent,
              respondingToPost: this.state.postID,
              respondingToComment: this.state.postID
            }
          })

А вот как он обрабатывается на серверной стороне

app.use(
  bodyParser.urlencoded({
    extended: false
  })
);
app.use(bodyParser.json());
app.use(passport.initialize());
require("./config/passport")(passport);

app.post('/postComment', (req, res)=>{
    var commentData={
        postUserID: req.query.postUserID,
        name: req.query.name,
        commentContent: req.query.commentContent,
        respondingToPost: req.query.respondingToPost,
        respondingToComment: req.query,respondingToComment
    }

    //Write commentData to database
})

const port = process.env.PORT || 80;
const server = app.listen(port, () => console.log(`Server running on port ${port} !`));

Мне интересно, могу ли я что-нибудь сделать для повысить безопасность, чтобы предотвратить отправку запросов отовсюду?

1 Ответ

2 голосов
/ 23 февраля 2020

Вы можете использовать cors для выполнения sh этого. Это довольно хорошее руководство по его настройке, в частности этот раздел . Вы можете настроить его для определенных маршрутов или по всем направлениям.

CORS устанавливает заголовок Access-Control-Allow-Origin, о котором вы можете узнать больше здесь - он разрешает запросы только из указанных источников.

Имейте в виду, что вам не нужен этот пакет для выполнения sh этого .. вы всегда можете создать собственное промежуточное программное обеспечение для этого.

Что-то вроде:

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "http://yourdomain.com");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

В документации Express они предоставляют следующий демонстрационный код, который вы сможете использовать в качестве помощника.


Вы можете использовать временное промежуточное ПО со специальными заголовками ... но тогда все, кто имеет Чтобы сделать это, прочитайте исходный код на стороне клиента или посмотрите на вкладку сети в их браузере, чтобы выяснить, какие заголовки вы отправляете, чтобы затем скопировать их. Это не позволило бы случайным людям шпионить, хотя ..

const express = require('express');
const path = require('path');

const app = express();
const port = process.env.PORT || 3000;

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Custom special middleware..
function blockBadHosts({ host, whitelistHeader, whitelistHeaderValue }) {
    return (req, res, next) => {
        if(req.headers['host'] === host) {
            if(whitelistHeader && req.headers[whitelistHeader] === whitelistHeaderValue) {
                next();
            } else {
                res.status(301).send('BAD REQUEST');
            }
        } else {
            res.status(301).send("BAD REQUEST");
        }
    }
}

// Options for our custom middleware
const badHostOptions = { 
    host: "localhost:3000",
    whitelistHeader: "x-my-special-header", // Request must contain this header..
    whitelistHeaderValue: "zoo"             // .. with this value
}

// This should succeed
app.get('/success', (req, res) => {
    res.status(200).send("from /success");
});

// This should fail even if sent from Postman without correct headers
app.get('/failure', blockBadHosts(badHostOptions), (req, res) => {
    res.status(200).send("from /failure");
});

// 404 route
app.use((req, res) => {
    res.status(404).send("Uh oh can't find that");
})

app.listen(port, () => {
    console.log(`App listening on port: '${port}'`);
});
...