(让我们忽略一个事实,即NSConnection现在已不再受欢迎。)
我有一个通过服务端口接受到NSConnection连接的工具。我有一个应用程序可以启动这个工具,然后连接到它。那部分起作用。
现在,我想确保只有我的特定应用程序才能与该工具对话,并且该工具拒绝任何其他工具/应用程序的连接。
我怎样才能最好地做到这一点?
我有一个想法:
由于应用程序启动了该工具,它可以将一个“秘密”作为参数传递给该工具,然后每当我以NSDistributedObject的形式调用它的一个函数时,我都会将相同的秘密传递给该工具。然而,这意味着我必须将这个额外的参数传递给我所打的每一个电话,我认为这是不必要的开销。
我认为,当应用程序打开与工具的连接时,我可以接受或拒绝连接,也就是只有一次。有NSConnectionDelegate,我怀疑我必须在它的authenticateComponents:withData:处理程序中实现身份验证检查,但是我找不到任何例子来解释如何做到这一点。我的意思是,在连接尝试中是否有任何数据可以识别请求连接的应用程序,例如PID?
发布于 2019-07-02 02:16:11
你是否为每个电话建立了一个连接?我不这么认为,但是,如果不是,你为什么要把每个电话的秘密都告诉我呢?服务器拥有客户端必须调用的签入方法是非常常见的。您可以在签入方法中验证这个秘密。
恶意客户端可能试图跳过签入方法。您可以使用-connection:handleRequest:方法NSConnectionDelegate来强制他们调用签入方法。为每个连接保留一个标志,指示是否见过签入方法。如果有,该方法可以只返回NO。如果没有,那么检查NSDistantObjectRequest的invocation的selector。如果是签入方法,设置标记并返回NO。如果没有,则终止连接。
我知道底层端口(马赫或套接字)有对对等点进行身份验证的机制,但我看不出有什么方法可以通过设置NSConnection的抽象来实现这一点。
最后,显然您是NSConnection的拥护者,但这正是NSXPCConnection API的目的所在。除其他外,它将确保该服务只对父应用程序可见。
https://stackoverflow.com/questions/56844303
复制相似问题