Как запретить отклик сервера прямо в браузере? - PullRequest
0 голосов
/ 18 апреля 2019

Я использую каркас express.js для своего сервера node.js.

Так я настраиваю свой сервер.

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var index = require('./routes/index');
var createUsers = require('./routes/users/createUsers');
var updateUsers = require('./routes/users/updateUsers');
var deleteUsers = require('./routes/users/deleteUsers');
var readUsers = require('./routes/users/readUsers');

var app = express();

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

var mysql = require("mysql");
//Database connection
app.use(function(req, res, next){
    res.locals.connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : 'password',
        database : 'project'
    });
    res.locals.connection.connect();
    next();
});

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/createUsers', createUsers);
app.use('/updateUsers', updateUsers);
app.use('/deleteUsers', deleteUsers);
app.use('/readUsers', readUsers);



// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  // render the error page
  res.status(err.status || 500);
  res.render('error.ejs');
});

var http = require('http');
module.exports = app;
var server = http.createServer(app);
server.listen(4000);

Это мой readUsers.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
    //console.log("pending data");
    res.locals.connection.query('SELECT id,name,email,username,address,phone,status FROM user', function (error, results, fields) {
        if (error) throw error;
        res.send(JSON.stringify(results));
    });

});

module.exports = router;

Мой сервер прослушивает порт 4000. Моя функция реагирующего внешнего компонента componentDidMount () использует axios.get("http://localhost:4000/readUsers") для чтения данных из базы данных, и это сработало хорошо.

Однако, если я непосредственно наберу http://localhost:4000/readUsers в своем браузере, он напрямую подключится к моей базе данных, прочитает все данные пользователя и отобразит данные в браузере. Это не я хочу, потому что каждый может прочитать мои данные, если они знают этот адрес. Любой способ предотвратить эту проблему?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Добавьте промежуточное ПО на ваш роутер.вот документ промежуточное программное обеспечение уровня маршрутизатора

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

Вот пример, который я извлекаю из документации.

var app = express()
var router = express.Router()

// a middleware function with no mount path. This code is executed for every request to the router
router.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
router.use('/user/:id', function (req, res, next) {
  console.log('Request URL:', req.originalUrl)
  next()
}, function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
})

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

function isPermitted(req, res, next) {
  var permitted = false;

  // Your validation here, is your user permitted with this access or not.

  if (permitted) {
    next();
  } else {
    res.send('Sorry, you are not belong here.');
  }
}

/* GET home page. */
router.get('/', isPermitted, function(req, res, next) {
    //console.log("pending data");
    res.locals.connection.query('SELECT id,name,email,username,address,phone,status FROM user', function (error, results, fields) {
        if (error) throw error;
        res.send(JSON.stringify(results));
    });

});
0 голосов
/ 18 апреля 2019

Используйте POST вместо GET как метод для запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...