Как я могу убедиться в том, что мое приложение для iphone работает с сервером? - PullRequest
3 голосов
/ 18 марта 2009

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

Два решения, библиотека skpsmtpmessage, которая еще не все есть и все еще глючит; или напишите мой собственный сервер для пересылки писем. Последнее не проблема для меня, но вопрос в том, как я могу быть уверен, что сообщение пришло из моего приложения для iPhone, а не из чего-то другого?

Я могу представить себе использование SSL, но я все еще удивляюсь, как кто-то на взломанном iPhone разбирает мое приложение, а затем использует фиктивное соединение для запуска спама.

Моя первая мысль - заставить сервер принимать данные только с точным набором функций (например, ровно 1 изображение jpg, определенные точные данные JSON) и отвергать все остальное. Конечно, это все еще можно ДОЗИРОВАТЬ.

Имеет ли это смысл? Кто-нибудь делал что-то подобное?

РЕДАКТИРОВАТЬ: я не буду отправлять электронную почту на мой сервер, просто JSON, и сервер будет генерировать фактическую электронную почту.

Ответы [ 5 ]

3 голосов
/ 28 июня 2009

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

  • Прежде всего, все коммуникации между iPhone и сервером должны быть зашифрованы. Это довольно просто, если вы используете HTTP POST-запросы и SSL. Это также мешает анализаторам пакетов.

  • Когда ваше приложение запускается, оно ищет внутри локальной цепочки ключей открытый ключ RSA для сервера и сохраненное значение хеш-функции. Если он не найден, он связывается с вашим сервером с UDID телефона, который сервер использует (вместе с системным временем) для генерации хэша. Он отправляет обратно копию хэша и его открытый ключ на телефон. Затем сервер создает запись в локальной базе данных (скажем, MYSQL) с UDID и хэшем, который он отправил обратно, чтобы он мог использовать ее для проверки позже.

  • Приложение на iPhone сохраняет хеш и открытый ключ сервера в локальной цепочке ключей безопасности. Это все рукопожатие за кулисами, то есть никакого взаимодействия с пользователем. Это делается только при первом запуске приложения.

  • С тех пор каждый раз, когда вы хотите отправить электронное письмо, ваше приложение форматирует ваше сообщение (часть изображения + JSON), привязывает свой собственный UDID и значение хеш-функции, полученное с сервера, а затем использует сервер. открытый ключ у него есть в цепочке для ключей, и RSA шифрует весь беспорядок. Он добавляет это к телу HTTP POST на сервер и отправляет его (через SSL).

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

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

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

  • Если пользователь удаляет ваше приложение и переустанавливает его или переходит на новый телефон, вы просто делаете рукопожатие снова. Стоимость дополнительной записи базы данных на сервере. Если это проблема, вы также можете сохранить дату «последней транзакции» с записью на сервере, а затем истекать пустые записи каждые N месяцев и заставлять телефон проходить новое рукопожатие (вместо того, чтобы считать это сообщением об ошибке). Если подумать, вы можете сделать это в любом случае. Стоимость - небольшая задержка время от времени, когда телефон снова проходит последовательность рукопожатия.

  • Чтобы сделать это вдвойне интересным, сервер, который выполняет это первое рукопожатие, может быть сервером, отличным от того, который фактически выполняет работу позже. Сервер квитирования также отправляет обратно конечную точку URL-адреса, куда должны отправляться последующие запросы, и iphone также сохраняет его в цепочке для ключей. Таким образом, даже если ваше приложение будет декомпилировано, все, что они получат, это URL конечной точки рукопожатия. Поскольку большая часть данных хранится во время выполнения в цепочке для ключей, статический анализ вашего кода с взломанного телефона не даст ничего особенного.

  • Также для повышения производительности вы можете захотеть поставить запрос в очередь на сервер, как только он будет проверен, и позволить пользователю вернуться к тому, что он делает, а затем с помощью задания cron откачать сообщения SMTP периодически. Преимущество в том, что ответ пользователя лучше. Недостатком является то, что если адрес электронной почты плохой, у вас нет возможности ответить на них, если вы не полюбите push-уведомления. Я бы сделал это пользовательским предпочтением и позволил бы им решать, хотят ли они ждать подтверждения.

  • Все технические элементы для этого уже существуют на iPhone (т. Е. Сторонние библиотеки не нужны), и их должно быть легко внедрить на сервере с Rails или Django.

2 голосов
/ 18 марта 2009

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

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

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

0 голосов
/ 28 июня 2009

Что не так с skpsmtpmessage?

0 голосов
/ 18 марта 2009

Если возможно, сделайте интерфейс как можно более бесполезным для спамеров. Например, если вы генерируете дамп электронной почты из ряда объектов, преобразуйте объекты в XML и отправляйте их, а не отправляйте текст возможного электронного письма. Спамеры ищут самое слабое звено и будут двигаться дальше, если им придется приложить много усилий для использования вашего сервиса.

0 голосов
/ 18 марта 2009

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

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

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