使用decodeObject(of:forKey :)解码符合协议的对象

Jef*_*f V 2 protocols ios nssecurecoding swift

我有一个Objective-C协议,需要遵守NSSecureCoding

@protocol MyProtocol <NSObject, NSSecureCoding>
…
@end
Run Code Online (Sandbox Code Playgroud)

我有一个父对象,该对象存储对符合标准的对象的引用MyProtocol,我希望父对象也符合NSSecureCoding。当我尝试这个:

required init?(coder aDecoder: NSCoder) {

    if let childObject = aDecoder.decodeObject(of: MyProtocol.self, forKey: "childObject") {
        self. childObject = childObject
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:'decodeObject(of:forKey:)' is unavailable in Swift: use generic 'decodeObjectOfClass(_:forKey:)'

如果您不知道所编码对象的特定类,是否可以使用NSSecureCoding?

Rob*_*ier 5

整个要点NSSecureCoding是防止这种用例。如果您不知道要解码的类,则攻击者可以诱使您解码成行为与给定方法所期望的类不同的类(称为“替代攻击”)。这是一种用于攻击系统的技术,NSSecureCoding后来被开发用来阻止它。

即使不是这种情况,也无法构造协议类型的对象。运行时将无法知道要为实例变量分配多少内存。

为了符合NSSecureCoding,您必须知道所有子对象的精确类。

  • @JeffV这是不对的:没有打算弃用NSCoding。您可以在取消存档时禁用安全编码。最好的办法是,在可能的情况下,随着时间的推移,将此数据向前迁移到一个方案,该方案允许您在启用安全编码的情况下进行解码。 (2认同)