ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

因为序列化能够允许其他的代码来查看或者更改不可以通过其他方式而被访问的对象实例数据,所以在完成代码序列化时所必需的一个特殊许可就是:被指定了 SerializationFormatter 标记的 SecurityPermission。在默认的策略之下,这个许可并没有提供给基于互联网的下载或者局域网中的代码;因此只有本地计算机中的代码才能够获得这个许可的批准。

通常,一个对象实例的所有字段都是已序列化的,这表示实例的数据被呈现在已序列化的数据中。这有可能会为能够解译格式的代码来检测数据的值,并且还依赖于成员的可访问性。类似地,反序列化还会从已序列化的呈现中提取数据并且直接设置对象的状态,这同样也不需要考虑可访问性规则。

任何能够包含安全敏感数据的对象都应该是不可序列化的,如果可能的话。如果它必须是可序列化的,那么就需要尽量尝试让保持敏感数据的特定字段是不可序列化的。如果这仍然无法被完成,那么你就应该明白这些数据将会被暴露给任何拥有序列化许可的代码,并且还要确保没有任何恶意代码能够获取这个许可。

ISerializable 接口只被打算用于序列化机制。但是,如果没有采取任何防范措施,那么就可能会潜在地释放敏感信息。如果你需要通过实现 ISerializable 而提供自定义的序列化,那么就需要确保你已经采取了下列防范措施:

  • GetObjectData 方法应该通过明确地请求被指定了 SerializationFormatter 许可的 SecurityPermission 或者明确地确保方法的输出中没有释放任何敏感信息的方式而被保护。例如:

    [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter 
    =true)]
    public override void GetObjectData(SerializationInfo info, 
    StreamingContext context)
    {
    }
  • 被序列化所使用的特殊构造器同样应该完成彻底的输入验证并且应该通过被保护或者通过私有化来避免恶意代码的反向滥用。这应该通过任何其他的方式来执行相同的安全检查与必需的许可来获取这些类的一个实例(比如明确地创建类或者通过某种工厂来间接地对其进行创建)。
posted on 2007-02-15 18:03  Laeb  阅读(539)  评论(0编辑  收藏  举报