2015-06-15 2 views
1

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

Как я могу избежать, что кто использует отладчик Javascript, чтобы найти вызов и просто запускаю его непосредственно для того, чтобы обмануть ... Есть ли какой-то принцип, чтобы избежать такого рода неправомерного использования?

EDIT: Ниже приведен пример, чтобы сузить круг вопросов: например. у нас есть очередь ожидания, где вы можете уменьшить время ожидания, чириканье о странице. У SDK Twitter есть метод обратного вызова, который запускается, когда пользователь отправляет твит. Когда это происходит, бэкэнд вызывается, например. api.somedomain.net/user/xyz123?hasTweeted=1 или аналогичный.

Так что мой вопрос в том, как защитить последний шаг (вызов api.somedomain.net), так как кто-то мог найти этот URL REST и вызвать вызов вручную, не создавая твита.

+0

Вызов конечной точки Отдых в Js [обещание] (http://documentup.com/kriskowal/q/), так что вы будете обновлять пользовательский интерфейс на случай SucceS и в противном случае вы будете иметь возможность показать сообщение об ошибке. –

+0

Предполагаете, что вы не аутентифицируете пользователя перед увеличением счетчика?Также тот факт, что его REST, если вы вводите какие-либо трюки, такие как токен или что-то другое, то это нарушит остальные принципы существования без гражданства. – Amit

ответ

3

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

В случае, если кто-то пытается «взломать» веб-страницу с помощью консоли JavaScript, должна применяться та же логика. Служба REST не будет знать, откуда приходит запрос, но ваша логика должна предотвращать злонамеренное использование, преднамеренное или непреднамеренное.

Edit:

Решение вашей проблемы, например, чтобы иметь один вызов REST для Чирикая о странице, которая делает фактическую REST вызова в Twitter с вашего сервера кода на стороне. Счет hasTweeted будет увеличиваться только при завершении полного и успешного вызова API Twitter. Это все еще оставляет дверь открытой для злонамеренных пользователей, которые могут взорвать Tweets, но у Twitter, вероятно, есть что-то, что помешает этому.

+0

Но какова будет логика, например. для простого счетчика? Когда у меня есть конечная точка REST, которая просто увеличивает счет на единицу, каждый раз, когда она вызывается, вызванная действием, которое является чисто Javascript, в настоящее время я не вижу возможности проверить его в рамках службы REST. – gapvision

+0

Согласен с вами частично. Может быть, я что-то упустил. Как OP может запретить кому-то обнюхивать пакет HTTP из пользовательского интерфейса и повторно отправить его? – user949300

+0

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

1

У меня не было бы API-вызовов прямо из Javascript. Если есть способ злоупотреблять им, это определенно будет в какой-то момент.

Я бы попытался перенести мои обратные вызовы на бэкэнд.

+0

Можете ли вы объяснить немного больше? Я боюсь, что я еще не могу следовать ... – gapvision

+0

Пользователь нажимает на JS, который делает запрос на сервер, а сервер вызывает REST API, тогда сервер считывает ответ от API, если это необходимо, анализирует его и возвращает ответ пользователю, где JS обновления. – Valdas

0

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

Отправьте эти ключи в браузер в атрибутах данных в html и убедитесь, что они используются только один раз и удаляют их через несколько секунд, если они не используются.

EDIT: простой пример в javascript.

var keyRing = (function(){ 
    var maxLifeTime = 900000; // 15 mins. 
    var topRing = Math.pow(2,53); 
    var keyRing = { 
     idx: {}, 
     ring: [], 
     top: 0, 
     bottom: 0, 
    }; 

    function randomId(){ 
     return String(Math.random()).replace(/^0\./, ''); 
    }; 

    return { 
     get: function getKey(){ 
      var k = randomId(); // Generate new key. 
      if (keyRing.idx[k]) return getKey(); // Avoid duplication (Almost impossible) 
      var now = (new Date()).getTime(); 
      var expT = now + maxLifeTime; // Calculate expiration time. 

      // Annotate in keyring: 
      keyRing.idx[k] = true; 
      keyRing.ring[keyRing.top++] = [expT, k]; 
      keyRing.top = keyRing.top % topRing; // Loop. 

      // Discard expired: 
      for (
       var i = keyRing.bottom; 
       i != keyRing.top; 
       i = ++i % topRing 
      ) { 
       if (keyRing.ring[i][0] > now) { 
        keyRing.bottom = i; // Update lower bound. 
        break; // Stop on first unexpired. 
       }; 
       delete(keyRing.idx[keyRing.ring[i][1]]); 
       delete(keyRing.ring[i]); 
      }; 

      return k; 
     },  
     check: function checkKey(k){ 
      if (keyRing.idx[k]) { 
       delete(keyRing.idx[k]); // Discard. 
       return true; 
      }; 
      return false; 
     },  
    };   
})();  

var k = keyRing.get(); 
var l = keyRing.get(); 

console.log (keyRing.check("12489172349")); // False (Hope!) 
console.log (keyRing.check(k)); // True 
console.log (keyRing.check(k)); // False 
console.log (keyRing.check(l)); // True 
console.log (keyRing.check(l)); // False 
+0

Не могли бы вы предоставить более подробную информацию или ссылку? – user949300

+0

Добавлен простой пример в javascript. Надежда поможет. – bitifet

Смежные вопросы