Giao dịch thông qua Internet ngày càng phát triển, hàng loạt ngôn ngữ và giao thức thiết kế trang web cũng ra đời để phục vụ cho những mục đích nhất định, có thể kể các ngôn ngữ phổ biến như khoá học lập trình web HTML, Perl, ASP, PHP… Bài viết này đề cập đến một vấn đề thường gặp là bảo mật và kinh nghiệm phòng tránh để tăng độ an toàn cho trang web.
HTML (Hyper Text Markup Language)
HTML được phát triển từ 1989 và được sử dụng rộng rãi cho đến nay. Một trang HTML là một tệp dữ liệu dạng văn bản có phần mở rộng .htm hay .html, bao gồm những thành phần HTML. Khi người dùng xem một trang HTML, trình duyệt sẽ có nhiệm vụ phân tích và hiển thị thông tin tương ứng với những thành phần đó. Ở đây chúng ta chỉ phân tích về khía cạnh bảo mật của các thành phần HTML thông dụng.
1.
HTML form ở ví dụ trên thoạt nhìn rất đơn giản nhưng lại tiềm ẩn nhiều nguy cơ. Giả định khi người dùng truy cập vào địa chỉ http://www.sampleweb.com/login.html và nhập tên người dùng là “admin”, mật khẩu là “testpassword”, sau đó nhấn login. Nhiệm vụ của form là nhận tên người dùng và mật khẩu rồi dùng phương thức POST để gửi yêu cầu đến một ứng dụng web kiểm tra login ở máy chủ có tên là “login.asp”. Tuy nhiên, nếu phân tích kĩ hơn ta có thể thấy trang login này bộc lộ nhiều sơ hở mà hacker có thể lợi dụng. Điều rõ ràng nhất ta nhận thấy khi người dùng truy cập vào địa chỉ http:// thì dữ liệu được truyền đi trên mạng từ browser của người dùng đến máy chủ dưới dạng plaintext, tức là không được mã hóa. Như vậy chỉ cần có trong tay một chương trình network sniffer (xem lén nội dung các gói tin truyền trên mạng) như Ethereal và một chút may mắn cộng kiên nhẫn, một tay hacker hạng xoàng ngồi ở một máy client khác cũng có thể bắt được các thông điệp HTML truyền đi từ máy người dùng trên. Dưới đây là nội dung một thông điệp như vậy:
[ POST /admin/login.asp HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*Accept-Language: en-usContent-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)Host: www.sampleweb.comContent-Length: 68Connection: Keep-AliveCache-Control: no-cache
username=admin&password=testpassword&%3Fuser_role%3F=1&%3Ftries%3F=3
Date: Mon, 30 May 2005 09:00:34 GMTServer: ApacheExpires: Mon, 30 May 2005 10:00:34 GMTConnection: closeTransfer-Encoding: chunkedContent-Type: text/html
]
Nội dung gói tin bắt được ở phần màu đậm cho thấy rõ yêu cầu (POST request) gửi đi bao gồm tên người dùng (username), mật khẩu (password), quyền hạn (user_role), số lần đăng nhập thử (tries) và các thông tin quan trọng khác. Sẽ thật sự nguy hiểm hơn nếu bằng cách nào đó hacker chiếm được quyền điều khiển của một máy chủ gateway (cổng ra Internet) và chạy sniffer trên máy này, khi đó tất cả thông tin từ các trạm làm việc trong mạng nội bộ sẽ bị tóm bởi sniffer này trước khi chúng được gửi ra Internet. Với một tay hacker có hạng, gói tin bắt được có thể bị thay đổi vài thông tin quan trọng sau đó tiếp tục được gửi đến máy chủ và thông tin hồi đáp từ máy chủ có thể sẽ không như người dùng thật sự mong muốn nhưng lại thoả mãn yêu cầu của hacker.
Kinh nghiệm phòng tránh:
Trước khi bàn đến chuyện phòng tránh, chúng ta cần hiểu rằng không có hệ thống nào là bảo mật hoàn hảo, cũng không có biện pháp nào phòng tránh tuyệt đối. Những nỗ lực đưa ra chỉ có hiệu lực ở mức độ nhất định và tồn tại trong một thời gian nhất định đến khi người ta tìm ra cách mới để vượt qua nó.
Để bảo đảm tính an toàn cao cho dữ liệu trao đổi qua lại giữa người dùng và server, các nhà quản trị thường chọn giải pháp sử dụng SSL (Secure Socket Layer) cho trang web (trong phạm vi bài viết này tôi không mô tả chi tiết về SSL và cách thức cài đặt máy chủ hỗ trợ SSL, bạn đọc có thể tham khảo các tài liệu trên Internet). Khi đó người sử dụng sẽ truy cập vào trang web theo địa chỉ https:// thay vì http:// và những thông tin trao đổi sẽ được mã hoá trên đường truyền với mức độ an toàn rất cao.
Quay lại chủ đề hiện tại, ở phía trình duyệt người dùng, các thông tin được truyền đi từ HTML form cần được mã hóa trước khi gửi đi (trang đăng nhập của Yahoo mail cũng áp dụng cách thức này). Như vậy trang web cần cài đặt thêm mã lệnh để mã hóa dữ liệu người dùng nhập vào ở mức client trước khi gửi yêu cầu đến máy chủ. Đối với các giá trị ngầm định được đặt sẵn như trong ví dụ trên:
Nếu trang web của bạn thật sự cần những thông số ngầm định như vậy, hãy mã hóa chúng khi thiết kế và khi server nhận được yêu cầu, server sẽ giải mã các tham số trước khi xử lý và trả kết quả về cho người dùng. Ví dụ:
Ở phía server, khi thiết kế ứng dụng bạn luôn luôn nhớ nguyên tắc sau:
Dữ liệu nhận được từ client luôn có thể bị thay đổi ngoài ý muốn, đừng bao giờ tin cậy hoàn toàn các dữ liệu này. Ứng dụng của bạn cần lọc và kiểm tra chặt chẽ các dữ liệu này ngay khi nhận được trước khi tiến hành các bước xử lý tiếp theo.
2.
FPT Aptech trực thuộc Tổ chức Giáo dục FPT có hơn 25 năm kinh nghiệm đào tạo lập trình viên quốc tế tại Việt Nam, và luôn là sự lựa chọn ưu tiên của các sinh viên và nhà tuyển dụng. |