Защита на RESTful API: Възможно ли е да забраните XHR заявки от JS конзолата?

Моето приложение (най-вече код от страна на клиента, написан в гръбнак) взаимодейства със сървър Node.js. Единствената цел на моя сървър е да предоставя крайни точки на API за моето основно приложение.

GET заявките са доста безопасни, нападателите не могат да направят много тук. Но имам няколко POST и PUT заявки. Една от PUT заявките е отговорна за актуализиране на броя на гласовете за определен потребител, напр.

app.put('/api/vote`, function(req, res) {
  // POST form data from the client
  var winningPerson = req.body.winner; // userID
  var losingPerson = req.body.loser;   // userID
}

Забелязах, че някои хора просто изпращаха PUT заявки за конкретен потребител чрез JS конзола или някакъв вид REST API конзола, заобикаляйки намерението на приложението, наложено от потребителския интерфейс. Ако трябваше да използвате това приложение по предназначение, то никога няма да ви позволи да гласувате за един и същи човек няколко пъти подред, да не говорим за произволен потребител от базата данни (ако приемем, че знаете неговия потребителски идентификатор).

Но да, да, знам: „Не се доверявайте на клиента“. И така, как мога да поправя горния проблем? Ще помогне ли някаква проверка на IP адрес тук, за да се предотврати многократно гласуване в рамките на 3-5 минути? Какво мога да направя, за да забраня достъпа до моя API от конзолата, така че потребителите да не могат произволно да гласуват за когото желаят, а вместо това да гласуват само като щракнат върху изображение с мишката или най-малкото да гласуват от конзолата само за тези двама души, а не за всеки произволен човек?


person Sahat Yalkabov    schedule 21.06.2013    source източник


Отговори (1)


Отговорът се крие във вашия сървър. Не трябва да позволява на потребителя да гласува повече от веднъж в рамките на посочения период от време. Това е вид бизнес правило, което можете да наложите чрез сървър само защото е под ваш контрол.
Всяко налагане в потребителския интерфейс е добро и печелившо, но не е бронирано. Определено трябва да проверите сървъра, за да сте сигурни. Има много бизнес логиката на сървъра от

Единствената цел на моя сървър е да предоставя крайни точки на API за моето основно приложение.

Не се опитвайте да контролирате нещо, което е извън вашия контрол - клиентската страна на вашето приложение. Някои хора гласуват повече пъти, защото вие (вашият API) им ПОЗВОЛЯВАТЕ да го направят. Веднага след като вашият сървър отговори "Опитай след 5 минути, пич." те ще спрат да правят това или поне няма да има вреда, когато правят това.

person Peter Ivan    schedule 21.06.2013
comment
Благодаря за страхотния съвет! Що се отнася до моята бизнес логика, да имаш обект за глобална сесия, който следи хората в масив, за които вече е гласувано, добра идея? - person Sahat Yalkabov; 21.06.2013
comment
Къде държите вашите потребители и техните гласове? Базата данни ми се струва най-добрата. След това ще съхраня времето за последно гласуване на потребителя там, за да реша. Но глобален (приложен) обект също може да помогне - не сесия, защото може да бъде измамен. - person Peter Ivan; 21.06.2013