我尝试使用.NET Remoting客户端激活的对象,以便在多次调用期间保留客户端的身份验证信息,而不是实现需要客户端在每次调用中发送会话ID的会话管理系统。 正如MSDN所述:
当客户端使用" new"提交服务器对象请求时运算符,激活请求消息被发送到远程应用程序。然后,服务器创建所请求类的实例,并将ObjRef返回给调用它的客户端应用程序。
我的问题是,匿名客户端(攻击者)是否有可能猜测/暴力破坏ObjRef并获取对服务器上的现有对象的访问权?
在基于Web的会话系统(如ASP.NET / PHP)中,会话ID可以被视为对服务器中会话对象的引用,但它太长(例如32个字节),因此无法攻击..但是远程遥控器中的ObjRef怎么样?
更新 我在参考源中做了一些检查;似乎有一个与ObjRef类的每个实例相关联的URI字符串。这些URI由静态(每个进程)GUID,十八个随机字节(以base64形式)和一个计数器编号组成:
// Identity.cs:
// We insert the tick count, so that the uri is not 100% predictable.
// (i.e. perhaps we should consider using a random number as well)
String random = System.Convert.ToBase64String(GetRandomBytes());
// Need to replace the '/' with '_' since '/' is not a valid uri char
ObjURI = (IDGuidString + random.Replace('/', '_') + "_" + GetNextSeqNum() + ".rem").ToLower(CultureInfo.InvariantCulture);
我想至少18个随机字节作为每个ObjRef的标识符可能足够长,以保护对象免受暴力攻击。