如何验证NSConnection请求?

时间:2019-07-02 01:45:48

标签: macos distributed-objects nsconnection

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

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

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

我如何最好地做到这一点?

我有一个主意:

由于应用程序启动了该工具,因此可以将“秘密”作为参数传递给该工具,然后每当我将其功能之一作为NSDistributedObject调用时,我都会将该秘密传递给该工具。但是,这意味着我必须将这个额外的参数传递给我进行的每个调用,而且我认为这是不必要的开销。

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

1 个答案:

答案 0 :(得分:1)

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

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

我知道基础端口(Mach或套接字)具有对同位体进行身份验证的机制,但是我看不出有一种方法可以对置于它们之上的invocation进行抽象。

最后,您显然已经结识了selector,但这恰恰是NO API的目的。除其他事项外,它将确保该服务仅对父应用程序可见。