Lập trình Web an toàn bằng một số phương pháp sau

Về cơ bản, một hệ thống website bao gồm ba thành phần: Cơ sở hạ tầng và đường truyền, Hệ điều hành và môi trường (Windows / SQL server, Linux / MySQL ,…) và các ứng dụng web (ASP.NET, PHP, JSP…). Trong đó, thành phần Ứng dụng web là dễ bị hacker tấn công nhất, bởi vì chúng tồn tại những lỗ hổng nguy hiểm do người lập trình viên khi code website không có những kiến thức cơ bản về Security. Bài viết này tôi sẽ đưa ra những giải pháp cơ bản theo ý kiến chủ quan của mình, để việc lập trình web được an toàn hơn, giảm thiểu được phần lớn các nguy cơ bị tấn công.

developer-hacker

Các lỗ hổng website là các điểm yếu của hệ thống website mà Hacker có thể lợi dụng tấn công. Bạn nên tìm hiểu các lỗ hổng phổ biến như SQL injection, Cross-site Scripting (XSS), Cross-site Request Forgery (CSRF), File Inclusion, Directory Listing, …

Kiểm soát dữ liệu đầu vào:

Đây là biện pháp hữu hiệu nhất để ngăn chặn các cuộc tấn công của Hacker. Vì Hacker tấn công website cũng đóng vai trò của người dùng bình thường, do đó ta cần kiểm soát tính đúng đắn của tất cả các dữ liệu mà người dùng nhập vào để gửi lên server (các biến POST,GET, cookie, HTTP header : referer, user-agent,…). Việc kiểm tra có thể tiến hành ở client và bắt buộc ở server (do kiểm tra ở client dễ dàng bị vượt qua bởi các phần mềm tamper).

Ví dụ, ta có thể kiểm tra tính đúng đắn của email nhập vào bằng đoạn code sau:

– Ở client: kiểm tra bằng javascript

function checkEmail(email) {
 var filter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
 if (!filter.test(email.value)) {
 alert(‘Please provide a valid email address’);
return false;
}
else return true;
}

Ở server:

public static bool checkmail(string inputEmail)
{
string filter = @”^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$”;
Regex re = new Regex(filter);
if (re.IsMatch(inputEmail)) return (true);
else return (false);
}

Kiểm soát dữ liệu đầu ra

Đối với XSS, cần kiểm soát dữ liệu in ra màn hình để tránh thực thi javascript trên máy người sử dụng. Ta có thể sử dụng các hàm HTMLEntities() (PHP), Server.HtmlEncode() (C#),…

Ví dụ : thẻ script sau khi sử dụng htmlentities sẽ được chuyển thành <script> và in ra màn hình bình thường, không có khả năng thực thi. Xác thực & kiểm soát truy nhập

– Mật khẩu : phải mã hóa khi truyền và lưu trữ (tránh nguy cơ gói tin bị sao chép trên đường truyền), tắt chức năng Remember Password của các trình duyệt, Reset mật khẩu thì nên qua email, đổi mật khẩu thì bao gồm mật khẩu cũ, mật khẩu mới và nhập lại mật khẩu mới. Mật khẩu thường được mã hóa bằng MD5, có thể dùng MD5 cải tiến (thêm salt) nếu cần.

– Xác thực lại khi thực hiện các tác vụ nhạy cảm (ví dụ các thao tác Online Banking sử dụng Otp gửi qua SMS, email hoặc token…) – Cấp quyền tối thiểu, tránh sử dụng các tài khoản có quyền hệ thống (như “sa” của SQL server, “Administrator” của Windows,…)

– Cookie và Session : Lưu thông tin phiên đăng nhập của người dùng. Session lưu trên server, còn Cookie lưu trên client nên dễ bị lấy cắp, do đó cần phải mã hóa cookie (bằng các thuật toán mã hóa như DES, 3DES, RSA,…)

– Tắt các thông báo lỗi của Server : khi dữ liệu nhập vào không đúng, server sẽ thông báo các lỗi. Những lỗi này có thể giúp hacker có thông tin về hệ thống. Do đó cần tạo ra các thông báo lỗi chung chung, tránh sử dụng các thông báo lỗi mặc định.

– Tránh lỗi Directory Listing: lỗi này liệt kê tất cả các file của một thư mục trên server. Các thư mục cần có những trang index mặc định (html, htm, php, aspx,…) để tránh lỗi này.

– Ngoài ra bạn cần cập nhật thông tin về các loại lỗ hổng khác và phương pháp khắc phục chúng.