Ограничить доступ к API в Node JS express - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть express сервер с несколькими API-маршрутами, такими как:

server.post("/api/send-email", (req, res) => {

   });
});

Вам не нужен токен авторизации для доступа к API, но я хочу, чтобы мой веб-сайт mydomain.com только быть в состоянии использовать это. Я попытался включить ограничение доступа следующим образом:

function restrictAccess(req, res, next) {
      if (req.headers['origin'] !== 'http://localhost:3000') {
        res.sendStatus(403);
      } else {
        next();
      }
    }

И затем я передал ограничение доступа к моему маршруту в качестве промежуточного программного обеспечения. Когда я делаю POST-запрос с почтальоном, я больше не могу API, но я могу просто изменить исходный заголовок и снова получить к нему доступ.

Как я могу разрешить только запросы от mydomain.com? Я долго искал inte rnet, но ничего не смог найти. Это вообще возможно?

Ответы [ 2 ]

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

Как я могу разрешить только запросы со своих веб-страниц на mydomain.com?

В двух словах, вы не можете. Любой инструмент, такой как почтальон или любой сценарий (такой как node.js, PHP, Perl, и т. д. c ...) может отправлять любые заголовки или другие параметры запроса, которые он хочет, поэтому заголовки сами по себе бесполезны для ограничения доступа только к веб-странице в ваш домен.

Так работает сеть.

Для ограничения доступа чаще всего требуется логин пользователя или подобные учетные данные (вероятно, установка повара ie, который вы можете проверить), а затем, если вы видите, что ваши API злоупотребляют, вы можете запретить / удалить конкретная c учетная запись пользователя, которая делает это.

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

Решительный хакер может по-прежнему вычищать токен с вашей веб-страницы всякий раз, когда он Я хочу использовать его, так что это всего лишь препятствие, а не то, что останавливает решительного хакера.

Единственное реальное решение здесь и то, что кто-то, например, пользователь Google, для своих API-интерфейсов, - требовать какие-то учетные данные при каждом вызове API. а затем инструктируйте сервер на злоупотребление API-интерфейсами (ограничение скорости, непреднамеренное использование и т. д. c ...), а затем отзовите эти учетные данные, если они используются не по назначению. Учетные данные могут быть токеном разработчика (как и в некоторых API Google) или могут быть какими-то учетными данными для аутентификации при входе пользователя (например, поваром ie).

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

1 голос
/ 22 февраля 2020

Основные браузеры отправляют заголовок источника, не позволяя браузеру Javascript изменять его.

Не-браузерные API-клиенты, такие как Postman и все остальное, могут устанавливать в качестве исходного заголовка и других заголовков все, что они выберут. Клиенты API без браузера могут легко подделать ваш API, притворяясь браузерами.

Таким образом, совет по безопасности, использование значения заголовка источника для принятия решения о предоставлении доступа к вашему API не дает вам никакой безопасности.

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

Извините за это. :-( Безопасность - это боль в шее.

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