{{#include ../../banners/hacktricks-training.md}} Código y más información en [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence). ## Serialización de Objetos en el Desarrollo de iOS En iOS, **la serialización de objetos** implica convertir objetos en un formato que se puede almacenar o transmitir fácilmente, y luego reconstruirlos a partir de este formato cuando sea necesario. Dos protocolos principales, **`NSCoding`** y **`NSSecureCoding`**, facilitan este proceso para Objective-C o subclases de `NSObject`, permitiendo que los objetos se serialicen en **`NSData`**, un formato que envuelve búferes de bytes. ### Implementación de **`NSCoding`** Para implementar `NSCoding`, una clase debe heredar de `NSObject` o estar marcada como `@objc`. Este protocolo exige la implementación de dos métodos para codificar y decodificar variables de instancia: ```swift class CustomPoint: NSObject, NSCoding { var x: Double = 0.0 var name: String = "" func encode(with aCoder: NSCoder) { aCoder.encode(x, forKey: "x") aCoder.encode(name, forKey: "name") } required convenience init?(coder aDecoder: NSCoder) { guard let name = aDecoder.decodeObject(forKey: "name") as? String else { return nil } self.init(x: aDecoder.decodeDouble(forKey: "x"), name: name) } } ``` ### **Mejorando la Seguridad con `NSSecureCoding`** Para mitigar vulnerabilidades donde los atacantes inyectan datos en objetos ya construidos, **`NSSecureCoding`** ofrece un protocolo mejorado. Las clases que cumplen con `NSSecureCoding` deben verificar el tipo de objetos durante la decodificación, asegurando que solo se instancien los tipos de objetos esperados. Sin embargo, es crucial notar que, aunque `NSSecureCoding` mejora la seguridad de tipos, no cifra los datos ni garantiza su integridad, lo que requiere medidas adicionales para proteger la información sensible: ```swift static var supportsSecureCoding: Bool { return true } let obj = decoder.decodeObject(of: MyClass.self, forKey: "myKey") ``` ## Archivado de Datos con `NSKeyedArchiver` `NSKeyedArchiver` y su contraparte, `NSKeyedUnarchiver`, permiten codificar objetos en un archivo y recuperarlos más tarde. Este mecanismo es útil para persistir objetos: ```swift NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive") let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? CustomPoint ``` ### Usando `Codable` para una Serialización Simplificada El protocolo `Codable` de Swift combina `Decodable` y `Encodable`, facilitando la codificación y decodificación de objetos como `String`, `Int`, `Double`, etc., sin esfuerzo adicional: ```swift struct CustomPointStruct: Codable { var x: Double var name: String } ``` Este enfoque admite la serialización directa hacia y desde listas de propiedades y JSON, mejorando el manejo de datos en aplicaciones Swift. ## Alternativas de Codificación JSON y XML Más allá del soporte nativo, varias bibliotecas de terceros ofrecen capacidades de codificación/decodificación JSON y XML, cada una con sus propias características de rendimiento y consideraciones de seguridad. Es imperativo seleccionar cuidadosamente estas bibliotecas, especialmente para mitigar vulnerabilidades como ataques XXE (XML External Entities) configurando los analizadores para prevenir el procesamiento de entidades externas. ### Consideraciones de Seguridad Al serializar datos, especialmente al sistema de archivos, es esencial estar atento a la posible inclusión de información sensible. Los datos serializados, si son interceptados o manejados de manera inapropiada, pueden exponer a las aplicaciones a riesgos como acciones no autorizadas o filtraciones de datos. Se recomienda cifrar y firmar los datos serializados para mejorar la seguridad. ## Referencias - [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence) {{#include ../../banners/hacktricks-training.md}}