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

Alamofire vs URLSession

Alamofire vs URLSession: a comparison for networking in Swift Alamofire and URLSession both help you to make network requests in Swift. The URLSession API is part of the foundation framework, whereas Alamofire needs to be added as an external dependency. Many  developers  doubt  whether it’s needed to include an extra dependency on something basic like networking in Swift. In the end, it’s perfectly doable to implement a networking layer with the great URLSession API’s which are available nowadays. This blog post is here to compare both frameworks and to find out when to add Alamofire as an external dependency. Build better iOS apps faster Looking for a great mobile CI/CD solution that has tons of iOS-specific tools, smooth code signing, and even real device testing? Learn more about Bitrise’s iOS specific solutions! This shows the real power of Alamofire as the framework makes a lot of things easier. What is Alamofire? Where URLSession...

Swift Tool Belt, Part 1: Adding a Border, Corner Radius, and Shadow to a UIView with Interface Builder

During my iOS work, I’ve assembled a set of code that I bring with me on every iOS project. I’m not talking about large frameworks or CocoaPods here. These are smaller Swift extensions or control overrides that are applicable to many projects. I think of them as my tool belt. In this post, I’ll show you an extension that will add a border, a corner radius, and a shadow to any UIView, UIButton, or UILabel and allow you to preview what it will look like in Interface Builder. Back in 2014, I wrote a blog post on Expanding User-Defined Runtime Attributes in Xcode where I added a border, corner radius, and shadow to a UIView using Interface Builder’s user-defined runtime attributes. This solution had no type checking—you had to type the property you wanted to modify by hand and often had to look up what it was called. You also had to run your project in order to see the effect of the runtime attribute. Starting with Xcode 6 , there is a new mech...

Frame vs Bounds in iOS

This article is a repost of an answer I wrote on Stack Overflow . Short description frame = a view’s location and size using the parent view’s coordinate system ( important for placing the view in the parent) bounds = a view’s location and size using its own coordinate system (important for placing the view’s content or subviews within itself) Details To help me remember frame , I think of a picture frame on a wall . The picture frame is like the border of a view. I can hang the picture anywhere I want on the wall. In the same way, I can put a view anywhere I want inside a parent view (also called a superview). The parent view is like the wall. The origin of the coordinate system in iOS is the top left. We can put our view at the origin of the superview by setting the view frame’s x-y coordinates to (0, 0), which is like hanging our picture in the very top left corner of the wall. To move it right, increase x, to move it down increase y. To help me remember bound...