Как аутентифицировать запросы NSConnection? - PullRequest
0 голосов
/ 02 июля 2019

(Давайте проигнорируем тот факт, что NSConnection теперь устарела.)

У меня есть инструмент, который принимает подключения к NSConnection через сервисный порт. У меня есть приложение, которое запускает инструмент, а затем подключается к нему. Эта часть работает.

Теперь я хочу убедиться, что только мое конкретное приложение может общаться с инструментом, и что инструмент отклоняет соединения от любого другого инструмента / приложения.

Как мне лучше всего это сделать?

Одна идея у меня была:

Поскольку приложение запускает инструмент, оно может передавать «секрет» инструменту в качестве аргумента, а затем я передаю этот же секрет в инструмент всякий раз, когда вызываю одну из его функций в качестве объекта NSDistributedObject. Однако это означало бы, что я должен передавать этот дополнительный аргумент каждому звонку, который я делаю, и я думаю, что это ненужные накладные расходы.

Я бы подумал, что могу принять или отклонить соединение прямо, когда приложение открывает соединение с инструментом, то есть только один раз. Это NSConnectionDelegate, и я подозреваю, что мне придется реализовать проверку аутентификации в обработчике authenticateComponents:withData:, но я не могу найти примеров, которые бы объясняли, как это сделать. Я имею в виду, есть ли какие-либо данные в этой попытке подключения, которые идентифицируют приложение, запрашивающее подключение, например, его PID?

1 Ответ

1 голос
/ 02 июля 2019

Вы устанавливаете соединение для каждого звонка?Я бы так не думал, но если нет, то почему вы думаете, что вам придется передавать секрет для каждого звонка?На сервере довольно часто используется метод регистрации, который клиенты должны вызывать.Вы можете проверить секрет в этом методе регистрации.

Вредоносный клиент может попытаться просто пропустить метод регистрации.Вы можете использовать -connection:handleRequest: метод NSConnectionDelegate, чтобы заставить их вызывать метод регистрации.Держите флажок для каждого соединения, указывающего, видели ли вы метод регистрации.Если у вас есть, этот метод может просто вернуть NO.Если нет, то изучите NSDistantObjectRequest invocation selector.Если это метод регистрации, установите свой флаг и верните NO.Если это не так, тогда прервите соединение.

Я знаю, что нижележащие порты (Mach или сокет) имеют механизмы для аутентификации одноранговых узлов, но я не вижу способа добиться этого с помощью абстракций NSConnection

Наконец, вы, очевидно, привержены NSConnection, но это именно то, для чего предназначен API NSXPCConnection.Помимо прочего, он будет гарантировать, что служба видна только родительскому приложению.

...