Swift – Ẩn đi các thông tin nhạy cảm khi show log

Tram Ho

Chắc hẳn chúng ta đều đã quen với việc debug bằng cách in ra các thông tin của dữ liệu ra màn hình console để có thể dễ dàng điều tra vấn đề. Nếu app của chúng ta liên quan tới giao dịch thanh toán hoặc thông tin cần được bảo mật, nhưng chúng ta vẫn cần ghi log lại để dành cho việc tracking, thống kê các thói quen của người dùng hoặc dành cho việc fix bug. Bài viết này chúng ta sẽ cùng nhau ẩn đi các thông tin nhạy cảm khi ghi log ra.

Ban đầu

Về cơ bản, trong project của mình, mình sẽ có một model struct như sau:

Và thông thường, thì khi debug, chúng ta sẽ sử dụng func dưới đây để in ra các thông tin về đối tượng bao gồm các giá trị của nó. Ví dụ, mình sẽ tạo ra một user như sau:

Sau đó, mình sẽ in ra user đó sử dụng print(….)

Kết quả lúc này nhận được sẽ là:

Ví dụ như, chúng ta muốn ẩn đi thông tin về email và dateOfBirth của user khi gửi log lên server hoặc in log ra console, nhưng lúc này, dữ liệu lại vẫn bị lộ ra, điều này có thể gây ra các rủi ro trong dự án.
Ví dụ chúng ta sử dụng Sentry để gửi log lên nhằm thống kê và tracking data, chúng ta sẽ sử dụng 1 func như sau:

Chúng ta có thể sử dụng như sau:

Hãy cùng nhau xem log được ghi phía dưới:

Lúc này, tất cả các dữ liệu của người dùng đều được gửi log lên, mặc dù một trong số chúng không thực sự cần thiết trong trường hợp tracking.
Vậy làm cách nào để chúng ta có thể ẩn đi các thông tin của người dùng mà không cần thiết hoặc không muốn debug, ghi log ra?

Cách giải quyết

Kể từ phiên bản swift 5.1, chúng ta đã có thêm 1 cái tên nữa đó là: Property Wrappers. Các bạn có thể đọc thêm tại đây
Bằng cách sử dụng Property Wrappers, chúng ta sẽ add thêm 1 tầng bao bọc nhằm ẩn đi các thông tin mà chúng ta không mong muốn nó bị lưu lại, debug…
Dưới đây sẽ là đoạn code mà chúng ta cần thêm vào trong project:

Đoạn code trên không xử lý gì quá phức tạp, đơn giản là nó chỉ giúp đảm bảo rằng khi bất cứ khi nào chúng ta cố gắng sử dụng hàm print, debugPrint, dump dữ liệu của đối tượng đó ra, thì nó sẽ ẩn đi giá trị thay vào đó là “hidden”.

Tiếp theo, với các thuộc tính nào mà chúng ta muốn ẩn đi, chúng ta sẽ thêm tiền tố LoggingExcluded vào phía trước. Ví dụ, mình sẽ ẩn đi city và email, lúc này model sẽ sửa lại như sau:

Chúng ta hãy cùng nhau thử in nó ra xem sao

Kết quả lúc này:

Kết

Trên đây là ý tưởng ẩn đi các thông tin sau khi tìm hiểu và đọc về thằng Property Wrapper, hy vọng nó sẽ hữu ích với các bạn. Xin cảm ơn.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo