混合安全和不安全的渠道

Posted

技术标签:

【中文标题】混合安全和不安全的渠道【英文标题】:Mixing secure & unsecure channels 【发布时间】:2011-02-02 10:22:54 【问题描述】:

一旦安全通道已注册,我将无法使用不安全通道。下面的代码只有在客户端之前注册了不安全的通道时才有效。

是否可以在不限制注册顺序的情况下混合安全和不安全通道?

using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

public class SampleObject : MarshalByRefObject

    public DateTime GetTest()  return DateTime.Now; 

public class SampleObject2 : MarshalByRefObject

    public DateTime GetTest2()  return DateTime.Now; 

static class ProgramClient

    private static TcpClientChannel RegisterChannel(bool secure, string name, int priority)
    
        IDictionary properties = new Hashtable();
        properties.Add("secure", secure);
        properties.Add("name", name);
        properties.Add("priority", priority);
        var clientChannel = new TcpClientChannel(properties, null);
        ChannelServices.RegisterChannel(clientChannel, false);
        return clientChannel;
    
    private static void Secure()
    
        RegisterChannel(true, "clientSecure", 2);
        var testSecure = (SampleObject2)Activator.GetObject(typeof(SampleObject2), "tcp://127.0.0.1:8081/Secured.rem");
        Console.WriteLine("secure: " + testSecure.GetTest2().ToLongTimeString());
    
    private static void Unsecure()
    
        RegisterChannel(false, "clientUnsecure", 1);
        var test = (SampleObject)Activator.GetObject(typeof(SampleObject), "tcp://127.0.0.1:8080/Unsecured.rem");
        Console.WriteLine("unsecure: " + test.GetTest().ToLongTimeString());
    
    internal static void MainClient()
    
        Console.Write("Press Enter to start.");
        Console.ReadLine();
        // Works only in this order
        Unsecure();
        Secure();
        Console.WriteLine("Press ENTER to end");
        Console.ReadLine();
    

static class ProgramServer

    private static TcpServerChannel RegisterChannel(int port, bool secure, string name)
    
        IDictionary properties = new Hashtable();
        properties.Add("port", port);
        properties.Add("secure", secure);
        properties.Add("name", name);
        //properties.Add("impersonate", false);
        var serverChannel = new TcpServerChannel(properties, null);
        ChannelServices.RegisterChannel(serverChannel, secure);
        return serverChannel;
    
    private static void StartUnsecure()
    
        RegisterChannel(8080, false, "unsecure");
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject), "Unsecured.rem", WellKnownObjectMode.Singleton);
    
    private static void StartSecure()
    
        RegisterChannel(8081, true, "secure");
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject2), "Secured.rem", WellKnownObjectMode.Singleton);
    
    internal static void MainServer()
    
        StartUnsecure();
        StartSecure();
        Console.WriteLine("Unsecure: 8080\n Secure: 8081");
        Console.WriteLine("Press the enter key to exit...");
        Console.ReadLine();
    

class Program

    static void Main(string[] args)
    
        if (args.Length == 1 && args[0] == "server")
            ProgramServer.MainServer();
        else
            ProgramClient.MainClient();
    

编辑:.NET 4 和 VS 2010 没有变化。

【问题讨论】:

你说它“不起作用”;你能澄清一下它在做什么吗? @M.Babcock 您的评论是关于一个非常古老的问题,供几个月未使用的人使用。仅供参考 我知道这是一个相当古老的问题,但我认为它仍然相关,因为版主尚未停用它。如果您觉得没有必要,请随时删除我的回复。 【参考方案1】:

这是一个有趣的老式问题,我花了大约一周的时间试图解决这个问题,并且不得不实施一个变通方法。但这是我发现的:答案很可能是:不,你不能。

说明:.NET 远程处理不允许您在创建对象时选择要使用的客户端通道。在服务器端,它显然会使用监听相关端口的通道,但在客户端,它只会使用任何可用的,甚至创建一个新的——尽管我总是注册自己的。

看来(我在文档中的任何地方都找不到它)如果有一个可用的安全客户端通道,那么它就会被使用。因此,在问题的示例中,远程对象是针对安全通道创建的,但它期望不安全的通道 - 因此它失败了。如果首先创建一个不安全的连接 - 它会起作用,因为在创建远程对象时没有安全的客户端通道,因此使用了不安全的客户端通道。

解决方法:

    为例如安全通道创建一个单独的 AppDomain。 在该 AppDomain 中,创建一个将连接到安全的客户端对象。 对所有不安全的渠道使用您的默认 AppDomain。

【讨论】:

以上是关于混合安全和不安全的渠道的主要内容,如果未能解决你的问题,请参考以下文章

何时使用和不使用云原生安全工具

windows php线程安全和不安全,两个版本我也看不懂,记下来再说。

网站漏洞扫描结果:不安全Http请求头和不安全的第三方链接

阿里聚安全移动安全专家分享:APP渠道推广作弊攻防那些事儿

从安全和不安全两个角度,教你如何发布对象(含各种单例代码)

十几个人 七八条枪 《智斗》中的安全渠道