Прямой доступ к API базы данных с помощью JS на стороне клиента - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно создать простой веб-интерфейс, который будет в основном использоваться для отображения некоторых данных, извлеченных из базы данных.База данных (а именно, InfluxDB) предоставляет HTML API, который я мог просто удобно вызывать прямо из моего интерфейса Javascript.Я ставлю сервис входа в систему (AWS Cognito).

Однако, когда пользователь входит в систему, он может легко обнаружить мои конечные точки API в коде на стороне клиента и, следовательно, делать произвольные запросы и, возможно, злоупотреблять им или просто красть все мои данные.Как я могу избежать этого?Можно ли как-то сделать API доступным только для внешнего интерфейса приложения?Если нет, то какова лучшая практика, которой я должен следовать здесь?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Если ваша InfluxDB также работает на EC2, самый быстрый и безопасный подход - разрешить вашему веб-приложению доступ только к экземпляру infxdb, ограничив его в группе безопасности .

Представьте, что ваше веб-приложение работает на VPC по умолчанию с CIDR 172.31.0.0/16, и что приёмный канал diffxdb работает на порте 8086. Затем просто создайте группу безопасности с правилом INBOUND, чтобы порт 8086 мог быть доступен только из вашей учетной записи AWS (такIP 172.31.0.0/16) и присоедините его к вашему экземпляру Influx EC2.убедитесь, что другие входящие правила, разрешающие доступ к 0.0.0.0/0, удалены.

0 голосов
/ 24 мая 2018

Я бы посоветовал создать веб-сервис на основе Node.js, который обернул бы ваш REST API.Используя модуль Express, достаточно всего лишь нескольких строк, чтобы собрать простой сервис REST и вызвать другие API.

const request = require('request');
const express = require('express');
const app = express();

app.get("/test", function(req, res, next){
    res.status(200).send('Hello World');
});

app.get("/testapi", function(req, res, next){

    // Read from another API and return result...
    var options = {
        url: "https://httpbin.org/ip",
        method: "get"
    };

    request(options, function (error, response, body) {
        if (error) {
            console.error('error:', error);
            res.status(500).send(error.message);
        } else {
            res.status(200).send(body);
        }
    });

});

let port = process.env.PORT || 3000;
app.listen(port);
console.log(`Express listening on ${port}..`);
...