[Android] Làm sao để code An Toàn

Lời mở đầu

Bạn đã xây dựng được một ứng dụng xong xuôi và App của bạn đang chạy ngon lành. Vào một ngày đẹp trời nào đó, App của bạn bị phá hoại hoặc lợi dụng bởi đối thủ tấn công. Người dùng không sử dụng App của bạn nữa vì n thôngó làm mất thông tin,link tới các trang độc hại ,không thực hiện được tính năng người dùng mong muốn, bla.., bla. Đối thủ sẵn sàng dùng mọi cách phá hoại và lợi dụng app của bạn. Chính vì thế, vấn đề “Làm thế nào để xây dựng code an toàn” từ những dòng code đầu tiên là việc làm rất cần thiết. Các nhà phát triển hãy áp dụng thói quen này để đảm bảo rằng các ứng dụng của bạn là an toàn mức cao nhất có thể nhé.

Bài viết này là mình đọc được từ tại liệu góp nhặt lại share, anh em cùng tham khảo và có thiếu sót gì mong các bạn góp ý để bài viết được hoàn thiện hơn.

Các yêu cầu để có một ứng dụng an toàn

⦁Bảo vệ các dữ liệu được lưu trữ trên di động

  1. Khuyến cáo không sử dụng tính năng ghi nhớ mật khẩu: Vì khi sử dụng chức năng ghi nhớ mật khẩu có thể bị lộ thông tin trong trường hợp mất điện thoại.

2.Phân quyền, mã hóa dữ liệu lưu trữ trên thiết bị Vì: Các dữ liệu lưu trữ tạm thời trong điện thoại ở dạng file hay sql lite đều có thể bị lộ nếu mất điện thoại, máy đã bị root ...

3.Bảo vệ dữ liệu nhạy cảm khi ứng dụng chạy chế độ nền Vì :Khi ứng dụng chuyển sang chế độ chạy nền, có thể có nhiều thông tin hiển thị trên giao diện có thể bị lộ nếu người dùng không tắt hoàn toàn ứng dụng và người nào đó có thể vô tình nhìn thấy. Ví dụ: Khi đang nhập thông tin thẻ tín dụng.

⦁ Bảo mật giao tiếp giữa ứng dụng và máy chủ

  1. Các thông tin quan trọng khi truyền giữa ứng dụng và máy chủ cần phải được mã hóa. (Có thể sử dụng các giao thức HTTPS, SSL/TLS)

Vì:Hầu hết các ứng dụng di động đều có kết nối tới máy chủ đặt trên Internet để cập nhật, trao đổi thông tin. Quá trình truyền nhận tin này có thể bị nghe lén từ mạng viễn thông, mạng Wifi…

⦁ Bảo mật xác thực người dùng

1.Áp dụng chính sách mật khẩu mạnh đối với những ứng dụng nội bộ, với các ứng dụng khác, cần khuyến cáo người dùng sử dụng mật khẩu mạnh VÌ:khi không có sự bắt buộc sử dụng mật khẩu mạnh, người dùng thường sử dụng các mật khẩu đơn giản, dễ nhớ. Điều này dẫn đến nguy cơ hacker có thể đoán được mật khẩu của người dùng một cách dễ dàng.

⦁ Bảo vệ tấn công phía client

1.Sử dụng Prepare Statement tránh lỗi Sql injection:(phương pháp tấn công chèn dữ liệu vào các câu truy vấn sql) Vì:khi truy vấn tới cơ sử dữ liệu lập trình viên thường sử dụng cách cộng xâu Input từ người dùng, các câu truy vấn này có thể bị mắc lỗi SQL. Bằng việc lợi dụng lỗi này, kẻ tấn công có thể xem, thêm, sửa, xóa dữ liệu, lấy cắp thông tin người dùng... Ví dụ: Đoạn code kiểm tra đăng nhập với username/password do người dùng nhập vào


String username = Username.getText().toString();
String password = Password.getText().toString();
SQLiteDatabase db = mDbHelper.getWriteableDatabase();
String userQuery = "SELECT * FROM useraccounts WHERE user_name = '" + username + "' and password = '" + password + "'";
SQLiteStatement prepStatement = db.compileStatement(userQuery);

Nhập vào username là test’ or ‘1’=‘1 thì câu query sẽ là: select * from useraccounts where user_name=‘test’ or ‘1’=‘1’ and password=‘...’. Mệnh đề where sẽ luôn đúng. Như vậy dù không có password vẫn đăng nhập được vào hệ thống. Đoạn code bên dưới, username, password được tham số hóa khi đưa vào câu truy vấn nên tránh được lỗi SQL Injection.


SQLiteDatabase db = mDbHelper.getWriteableDatabase();
String userQuery = "SELECT * FROM useraccounts WHERE user_name = ? and password = ?";
prepStatement.bindString(1,Username.getText().toString()("user_name");
prepStatement.bindString(2,Username.getText().toString()("password"));
SQLiteStatement prepStatement = db.compileStatement(userQuery);


2.Ngăn chặn lỗi XSS XSS (Cross Site Scripting): Kiểu tấn công nhắm vào phía người dùng như đánh cắp thông tin truy cập, hướng người dùng vào các trang web có mã độc... Vì :mặc định webview đã tắt không cho phép thực thi javascript, nhưng nếu lập trình viên thiết lập thuộc tính setJavaScriptEnabled(true) thì webview sẽ cho phép thực thi javascipt và có thể bị khai thác lỗi xss.

3.Ngăn chặn lỗi Tapjacking

Xảy ra khi một ứng dụng độc hại cài đặt trên điện thoại chạy Android tạo ra các giao diện giả mạo người dùng nhằm lừa người dùng mua hàng, nhấp vào quảng cáo, cài đặt các ứng dụng, hoặc thậm chí xóa sạch tất cả các dữ liệu từ điện thoại... Để ngăn chặn lỗi trên khi định nghĩa các thành phần layout quan trọng cần thiết lập thêm thuộc tính filterTouchesWhen Obscured.

Ví dụ:

<Button android:text="Buy"
        android:id="@+id/buy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:filterTouchesWhenObscured="true">
</Button>

4.Ngăn chặn lỗi khi thao tác với file

Vì :Khi thao tác với các file, có thể xảy ra nhiều trường hợp như file tồn tại/không tồn tại, file đang được thay đổi, .... Điều này có thể gây ra xung đột, truy cập thay đổi các file không được phép Để ngăn chặn trong quá trình thao tác với file luôn kiểm tra mã trả về khi gọi các hàm, đảm bảo thao tác đúng với file cần thao tác.

⦁ Lập trình an toàn với việc xử lý thông tin logs và debugger

1.Tắt chức năng debugger của ứng dụng

2.Không lưu các thông tin nhạy cảm như tên truy cập và mật khẩu vào trong logs

3.Xóa bỏ các thông tin thừa trong code trước khi xuất bản chương trình

⦁ Bảo vệ mã nguồn của chương trình

1.Không hardcode (Các dữ liệu được đặt vào trong mã nguồn và không thay đổi ) thông tin quan trọng như (key, username, password...)

2.Sử dụng kỹ thuật làm nhiễu mã nguồn, biên dịch an toàn trước khi release chương trình


All Rights Reserved