0

NSConnection(让我们忽略现在已弃用的事实。)

我有一个工具可以通过服务端口接受到 NSConnection 的连接。我有一个启动该工具然后连接到它的应用程序。那部分有效。

现在,我想确保只有我的特定应用程序可以与该工具对话,并且该工具拒绝来自任何其他工具/应用程序的连接。

我怎样才能最好地做到这一点?

我有一个想法:

由于应用程序启动了工具,它可以将“秘密”作为参数传递给工具,然后每当我将其函数之一作为 NSDistributedObject 调用时,我都会将相同的秘密传递给工具。但是,这意味着我必须将这个额外的参数传递给我所做的每个调用,我认为这是不必要的开销。

我认为当应用程序打开与工具的连接时,我可以接受或拒绝连接,即只有一次。有NSConnectionDelegate,我怀疑我必须在其authenticateComponents:withData:处理程序中实现身份验证检查,但我找不到任何可以解释如何执行此操作的示例。我的意思是,该连接尝试中是否有任何数据可以识别请求连接的应用程序,例如它的 PID?

4

1 回答 1

1

您是否为每个呼叫建立连接?我不这么认为,但如果不是,你为什么认为每次通话都必须传递秘密?服务器拥有客户端必须调用的签入方法是很常见的。您可以在该签入方法中验证密钥。

恶意客户端可能会尝试跳过签入方法。您可以使用 的-connection:handleRequest:方法NSConnectionDelegate来强制他们调用签入方法。为每个连接保留一个标志,指示您是否已看到签入方法。如果有,该方法可以返回NO。如果还没有,请检查NSDistantObjectRequest' invocations selector。如果是签入方法,请设置您的标志并返回NO。如果不是,则终止连接。

我知道底层端口(Mach 或套接字)具有验证对等点的机制,但我看不到通过NSConnection覆盖它们的抽象来实现这一点的方法。

最后,您显然很喜欢,NSConnection但这正是NSXPCConnectionAPI 的用途。除其他外,它将确保该服务仅对父应用程序可见。

于 2019-07-02T02:16:11.887 回答