Skip to main content

iOS/Android Security Guideline (P2)


[iOS/Android] Hiển thị privacy policy

Mức độ cần thiết: bắt buộc

Rủi ro

Đối với những hệ thống, dịch vụ có lưu giữ thông tin cá nhân, nếu như không biểu hiện rõ mục đích sử dụng và việc có hay không cung cấp thông tin cho người thứ 3, thì sẽ có khả năng mang đến sự nghi ngờ, bất an cho người dùng.

Giải pháp

Nếu có lưu giữ và sử dụng thông tin cá nhân của người dùng, thì cần hiển thị privacy policy, và có ghi rõ loại thông tin đó là thông tin gì, mục đích sử dụng, và có cung cấp thông tin cho bên thứ 3 hay không.

[iOS/Android] Chức năng force update

Mức độ cần thiết: bắt buộc

Rủi ro

Điều gì sẽ xảy ra nếu app thiếu chức năng force update? Trường hợp phát hiện ra app có bug nghiêm trọng, hoặc có vấn đề về security, thì nếu như không có chức năng force update, sẽ không thể bắt buộc người dùng update kịp thời, và tổn thất có thể sẽ lan rộng hơn.

Giải pháp

Thực hiện check version của app vào thời điểm thích hợp, ví dụ như lúc khởi động lại app, login, hoặc khi request API,.., trường hợp cần version up thì push thông báo update cho người dùng, đồng thời giới hạn sử dụng version đang có vấn đề.

[iOS/Android] Thuật toán hash

Mức độ cần thiết: bắt buộc

Rủi ro

Thuật toán hash MD5 và SHA-1 đã được chỉ ra là có vấn đề về tính chất ngăn xung đột (collision resistance), nên không sử dụng.

Giải pháp

Sử dụng thuật toán SHA-256 khi tạo hash.

[iOS/Android] Escape input value của người dùng

Mức độ cần thiết: bắt buộc

Rủi ro

Trường hợp sử dụng input value của người dùng thành giá trị output của app, nếu không thực hiện escape thích hợp, thì sẽ có nguy cơ gặp phải các loại tấn công (injection) dưới đây:
  • SQL injection
  • JavaScript injection
  • OS command injection

Giải pháp

Thực ra trường hợp tương ứng ít xảy ra với app native, tuy nhiên trong trường hợp sử dụng các giá trị input từ người dùng như dưới đây, thì bằng cách sử dụng escape, validation, hay place holder thích hợp, sẽ tránh được tấn công.
  • SQL
  • HTML
  • OSコマンド

[iOS] Cache dữ liệu truyền

Mức độ cần thiết: bắt buộc

Rủi ro

Nếu thực hiện truyền dữ liệu bằng URLSession,..thì dữ liệu truyền bởi OS sẽ bị lưu tự động vào file (cache.db) trong thiết bị. Dữ liệu cache này do được lưu bằng plain text, kể cả truyền bằng HTTPS, nên có khả năng cung cấp thông tin có lợi cho kẻ tấn công.

Giải pháp

Khi tạo URLSession, bằng việc set nil cho URLSessionConfigurationのurlCache, sẽ tránh được việc lưu cache.
let config = URLSessionConfiguration.default
config.urlCache = nil
let session = URLSession(configuration: config)
Kể cả trường hợp sử dụng URLSessionConfiguration.ephemeral thì cũng có thể tránh được việc lưu cache, nhưng trường hợp này có nhược điểm là sẽ huỷ URLSession, Cookie cũng như thông tin xác thực, nên sẽ có vấn đề nếu sử dụng Cookie để quản lý session.
let config = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: config)
Lưu ý là dù có set eloadIgnoringCacheData thành cachePolicy của URLRequest thì cũng không tránh được việc lưu vào cache.db

Tham khảo:

https://qiita.com/alt_yamamoto/items/f67a7ddb6ba13cca7369

Comments

Popular posts from this blog

Swift GCD part 1: Thread safe singletons

Preview Singletons are entities, referenced to the same instance of a class from everywhere in your code. It doesn't matter if you like them or not, you will definitely meet them, so it's better to understand how they work. Constructing and handling a set of data doesn't seem to be a big challenge at first glance. The problems appear when you try to optimise the user experience with background work and your app starts acting weird. ??‍♂️ After decades of watching your display mostly with a blank face, you finally realize that your data isn't handled consistently by the manager because you're accessing it (running tasks on it) from multiple threads at the same time. So you really do have to deal with making your singletons thread safe. This article series is dedicated to thread handling using Swift. In the first part below you will get a comprehensive insight into som...

Kiến thức cơ bản về RxSwift

Bài viết với mong muốn cung cấp thông tin cơ bản về kiến trúc, các thuật ngữ được sử dụng phổ biến về RxSwift, giúp những lập trình viên lần đầu làm quen RxSwift sẽ trở nên dễ dàng hơn. Trong bài viết có sử dụng một số từ khóa tiếng Anh, mình xin phép sẽ giữ nguyên bản không sử dụng tiếng Việt vì có lẽ sẽ dễ hiểu hơn cho người đọc. Observable Sequences Mọi hoạt động trong RxSwift từ việc đăng ký và xử lý sự kiện đều thông qua một Observable Sequences Trong RxSwift , các kiểu dữ liệu như Arrays , Strings hoặc Dictionary sẽ được convert sang Observable Sequences . Ta có thể tạo ra "Observable Sequences" của bất kỳ kiểu đối tượng nào tuân theo Sequence Protocol của Swift Standard Library . let helloSequence = Observable.just( "Hello Rx" ) let fibonacciSequence = Observable. from ([ 0 , 1 , 1 , 2 , 3 , 5 , 8 ]) let dictSequence = Observable. from ([ 1 : "Hello" , 2 : "World" ]) Đăng ký nhận event từ ""Observable Se...

Thread safe singleton’s in Swift

What are singletons? — Singleton is design patterns which says that there should be only one instance of the class for the lifetime of the application. One the best example of Singleton is AppDelegate . How to write a singleton class ? class DefaultDict{ private var dict:[String:Any] = [:] public static let sharedManager = DefaultDict() private init(){ } public func set(value:Any,key:String){ dict[key] = value } public func object(key:String) -> Any?{ dict[key] } public func reset(){ dict.removeAll() } }   Testing singleton class under concurrent circumstances. We are going to write an example where we will set values in dict from various threads and even try to access some with different threads. When we do this we will encounter a crash. If you look closely it will be because of race condition and the crash will be on line set(value:Any,key:String) . class ViewController: UIViewController { ...