Безопасная связь между ASP-страницами и Cocoa / ObjC - PullRequest
1 голос
/ 31 января 2012

Это странный.Я разработал простое приложение для iPhone для управления в своей компании, чтобы проверить статистику продаж в реальном времени.Первым препятствием было выяснить, как заставить приложение взаимодействовать с нашим старым сервером MSSQL 2005.После некоторых исследований казалось, что самый быстрый способ сделать это - создать базовую ASP-страницу, которая будет выдавать результаты запроса с помощью вызовов response.write ().Это работает довольно хорошо на самом деле - но страница ASP, которая возвращает результаты, открыта для всего мира.Единственный механизм «безопасности», который у меня есть, на самом деле совсем не один - изменение порта HTTP на стороне сервера.

Итак, мой вопрос - каковы лучшие практики для этого?Что будет работать между ASP и Objective-C?Я ознакомился с некоторыми базовыми запросами-ответами, шифрованием и т. П., Но это кажется излишним для простой цепочки, как правило, неразборчивых цифр продаж.Однако, поскольку приложение развивается во что-то более сложное, я бы хотел, чтобы эта проблема была решена до того, как asp начнет отправлять более конфиденциальные данные.

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

NSString * const appDataUrl = @"http://{the url for the asp page}";

//Don't ask me how this works. Google FTW...
-(NSString *) pullData:(NSString *) url {
    NSError * error = nil;
    NSURLResponse * response = nil;
    NSData * downloadedData = 
        [NSURLConnection sendSynchronousRequest:
         [NSURLRequest requestWithURL:
          [NSURL URLWithString:url]] returningResponse:&response error:&error];
    NSString *strData = [[NSString alloc]initWithData:downloadedData encoding:NSUTF8StringEncoding];
    return strData;
}

Спасибо, ребята.

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Вы можете использовать HTTP-аутентификацию (например, дайджест), в которой вы добавляете имя пользователя и пароль для каждого запроса.Я не знаю, есть ли в Objective-C необходимая библиотека для генерирования соответствующего дайджест-токена, но если нет, вы можете использовать одну из доступных библиотек HTTP, которая, я уверен, справится с этим.

Затем вы можете добавить аутентификацию, требуемую внутри IIS, так что только люди, которые знают имя пользователя и пароль, могут получить доступ к этому URL.

Еще один способ сделать это - добавить специальный заголовок к HTTP-запросу в Objective-Cчто-то вроде X-Auth со специальным случайным значением (это может быть предопределенный GUID).

Запрос будет отправлен с этим специальным заголовком, и вы можете проверить его существование и его значение в ASP.

Я бы также предложил добавить SSL, чтобы вы могли получить доступ к этому запросу через HTTPS, чтобы никто не мог перехватить данные.

1 голос
/ 31 января 2012

Оберните сообщения с помощью SSL.

Исходя из вашего варианта использования, вы хотите, чтобы только ваше приложение (работающее на iPhone) могло иметь доступ к вашему веб-сервису. Для этого настройте SSL с взаимной аутентификацией между вашим приложением и конечной точкой на вашем веб-сервере, где работает служба ASP. Если ваше приложение взаимодействует только с вашим сервером, вам не нужны выданные CA сертификаты SSL, но вы можете использовать самозаверяющие. Разверните самоподписанный сертификат идентификации на своем сервере и разверните самоподписанный сертификат идентификации клиента в своем приложении в качестве ресурса. Сконфигурируйте свой сервер так, чтобы он требовал клиентских сертификатов, и разрешите только тот, который вы выпустили, и ваше приложение использует; это заставит ваш сервер принимать запросы только от вашего клиентского приложения. Сконфигурируйте ваш клиент так, чтобы он доверял только сертификату сервера, развернутому на вашем сервере (чтобы он мог общаться только с вашим сервером для получения этих данных), и представлял сертификат клиента при подключении (чтобы он мог аутентифицировать себя на сервере). Тогда только ваше приложение сможет позвонить на ваш сервер, клиент сможет получить данные только из вашего действительного источника, и вся транзакция будет зашифрована и аутентифицирована.

...