Как защитить запросы JSON с iPhone?

#iphone #ruby-on-rails #json #api #web-applications

#iPhone #ruby-on-rails #json #API #веб-приложения

Вопрос:

У меня есть веб-приложение с API JSONP, которое я использую в своем приложении для iPhone. Как мне обезопасить это, чтобы запросы из других мест не могли получить доступ к моему API?

Уточнение: мои данные не так важны. Вам даже не нужно входить в систему, чтобы просмотреть его. Я просто не хочу, чтобы моя база данных работала с запросами из других источников.

Комментарии:

1. После ваших разъяснений я предлагаю ответ, который я дал. Это то, что я использую примерно в 4 производственных приложениях. Чтобы повторить, убедитесь, что конечные точки вашего веб-сервиса начинаются с https и просто вставляют секретную строку в каждый запрос (либо в заголовок, либо в фактическое тело). Имеет ли это смысл? В iPhone я использую ASIHTTPRequest и добавляю заголовок следующим образом: [запрос addRequestHeader:@значение «Secret-Header»:@»WJQPSWDWEPONSDMNVOEOIWUER»];

Ответ №1:

Вы приступили к очень, очень сложной теме. Приготовьтесь к очень долгим ночам чтения различных методов защиты вашего приложения в режиме «кошки-мышки». Я думаю, что лучше всего поместить секретную строку в заголовок каждого запроса. Что-то вроде этого:

Секретный заголовок: #$F@FQAFDSFE#$%#ADSF())*

Подтвердите этот заголовок на стороне сервера и используйте SSL. Кто-то мог бы легко ответить на этот пост «Ну, это не останавливает это, это и это», и они будут правы. Вопрос в том, являетесь ли вы банком, который беспокоится о том, что кто-то истощает счета вашего клиента? Или вы просто беспокоитесь о том, что у 99,9999% населения недостаточно воли, чтобы перехватить ваш мусор?

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

Комментарии:

1. как вы устанавливаете значение секретного заголовка в первую очередь? Насколько я понимаю, вы не хотите отправлять секретное значение, встроенное в приложение iOS.

Ответ №2:

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

Враг может разобрать клиент iPhone и украсть ключ, и вы ничего не сможете с этим поделать.
(кроме гонки вооружений в черном списке)

Ответ №3:

Вы можете использовать протокол TLS с сертификатом клиента. http://en.wikipedia.org/wiki/Transport_Layer_Security

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

Комментарии:

1. Для реализации сертификата клиента TLS на iPhone используйте ASIHTTPRequest allseeing-i.com/ASIHTTPRequest/How-to-use AFNetworking этого не поддерживает.

Ответ №4:

Один из традиционных способов сделать это — взять все запрашиваемые переменные URL, добавить «секретную» строку, хэшировать все это и добавить в качестве дополнительной переменной URL. На вашей стороне API вы делаете то же самое, и если хэш соответствует тому, что вам было дано, он, вероятно, поступает из вашего приложения.