Как предотвратить «воспроизведение» с помощью Javascript SDK authResponse - PullRequest
3 голосов
/ 10 декабря 2011

Я использую Javascript SDK для создания веб-страницы, которая полностью статична для HTML и Javascript (то есть это не динамически создаваемая веб-разметка через какое-то веб-приложение). Эта веб-страница иногда использует Javascript для отправки POST-данных на сервер - данные, которые должны быть привязаны к конкретному пользователю Facebook. Я использую FB.getLoginStatus, чтобы определить, кто пользователь. Это дает мне authRepsonse данные JSON, которые выглядят так:

authResponse:
  accessToken:"AAAC91..."
  expiresIn: 3786
  signedRequest:"Ws93YNGWQeOi..."
  userID: "670..."

Я могу отправить signedRequest на сервер и декодировать его и проверить его там (используя секретный ключ моего приложения), а затем я знаю, что пользователь, в данном случае, «670 ...», поэтому я предположительно может безопасно выполнить любую операцию, которая должна произойти на сервере. Вот данные, которые я извлекаю из подписанного запроса:

{"algorithm"=>"HMAC-SHA256",
 "code"=>
  "2.AQAKT...|5hVFYWcu5a...",
 "issued_at"=>1323403518,
 "user_id"=>"670..."}

У меня такой вопрос: что мешает злоумышленнику (который каким-то образом овладел закодированным authResponse выше) просто «воспроизвести» данные подписанного запроса на моем сервере намного позже?

Параметр "нул__ "поначалу выглядел многообещающе, но у меня нет ничего, с чем можно было бы сравнить тот момент времени, когда было выпущено_, чтобы узнать, должен ли я принять этот подписанный запрос или нет. «ExpiresIn» - это другой параметр, связанный со временем, но он не подписан, поэтому я не могу ему доверять Может быть, «код» дает мне дополнительную информацию, но я не вижу, как это расшифровать.

Полагаю, я просто думаю об этом неправильно или использую API не так, как предполагалось. Есть идеи? Спасибо.

1 Ответ

2 голосов
/ 10 декабря 2011

Прежде всего использование кода аутентификации сообщений (MAC) является принципиально небезопасным подходом к проблеме аутентификации. Вы должны хранить эту информацию как состояние на стороне сервера, чтобы она никогда не была угрозой. Используя криптографическую хэш-функцию в качестве HMAC, вы вводите возможность взлома вашего секретного ключа. Криптография должна использоваться только тогда, когда нет другого решения, вместо этого вы используете его, чтобы ввести слабость. Это грубое злоупотребление криптографией.

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

...