Trong loạt bài này mình muốn giới thiệu tới các bạn về Lập Trình An Toàn Trong Phát Triển Ứng Dụng Web. Cái này gần như chúng ta phải đọc, hiểu và thuộc lòng ý giúp chúng ta học bảo mật web. Và cũng rất mong có sự đánh giá, sửa đổi, bổ sung từ các bạn đọc.
Mục đích
Đưa ra các yêu cầu về lập trình an toàn trong phát triển ứng dụng web.
Yêu cầu
Tương tác với cơ sở dữ liệu tránh lỗ hổng SQL Injection
Dữ liệu được nhập vào ( input ) từ người dùng phải được truyền dưới dạng tham số. Không được sử dụng cách cộng sâu trong các truy vấn với cơ sở dữ liệu.

Xử lý dữ liệu đầu vào tránh lỗ hổng XSS
Encode dưới dạng HTML các ký tự đặc biệt do người dùng gửi lên máy chủ và các ký tự dặc biệt trong cơ sở dữ liệu trước khi gửi tới người dùng.
Xử dụng Token trong các phương thức GET và POST tránh lỗ hổng CSRF
Trong chức năng mà người dùng tương tác với cơ sở dữ liệu thông qua các from, liên kết. Phải sử dụng thêm biến token ( được tạo ra mỗi đầu phiên truy cập của người dùng) . Như một tham số trong phương thức GET hoặc POSTvà kiểm tra giá trị token này tại máy chủ để xác nhận hành vi của người dùng.
Kiểm soát các thao tác với file
Giới hạn chỉ cho phép các định dạng file theo yêu cầu của ứng dụng được phép upload lên máy chủ. Kiểm soát file upload ở máy chủ. Lưu trữ các file upload tại một thư mục riêng nằm ngoài thư mục web hoặc không cho phép truy cập, thực thi trên các thư mục đó.
Chặn các ký tự \, /, null và kiểm tra phần mở rộng của file khi xử lý với tên file trên máy chủ.
Mã hóa dữ liệu nhạy cảm
Những dữ liệu nhạy cảm trong cơ sở dữ liệu phải được mã hóa.
Kiểm tra quyền truy cập của người dùng
Kiểm soát quyền của người dùng trong mỗi request lên máy chủ.
User enumeration
Sử dụng chung thông báo lỗi cho cả 2 trường hợp nhập sai tên đăng nhập và mật khẩu trên trang đăng nhập vào hệ thống. Nhằm tránh trường hợp thông báo lỗi trên trang đăng nhập, phân biệt giữa nhập sai tên đăng nhập và sai mật khẩu. Dự vào đó kẻ tẩn công có thể thử và tìm ra các user có trên hệ thống.
Sử dụng capcha cho các chức năng đăng ký, reset/forgot mật khẩu để tránh các công cụ tự động khai thác lỗi user enumeration.
Session fixation
Tạo mới lại phiên người dùng ( renew session ) sau khi đăng nhập và xóa session cũ ( trên server ) sau khi log out. Tránh trường hợp Session của ứng dụng trước và sau khi đăng nhập/đăng xuất không thay đổi. Dẫn đến kẻ tấn công có thể sử dụng session do hacker tự định nghĩa. Sau khi lừa trình duyệt người sử dụng sử dụng session đó khi thực hiện đăng nhập/đăng xuất ứng dụng.
Session Hijacking
Không cho phép 2 phiên truy cập đồng thời, session cần đảm bảo khó bị phân tích, dự đoán, không chứa các thông tin hướng người dùng như ip, user-agentheader, địa chỉ Mac.

Sử dụng Cookie an toàn
Yêu cầu thiết lập thuộc tính ” HTTPOnly ” cho session cookie. Vì nếu session cookie không được sét thuộc tính ” HTTPOnly “. Kẻ tấn công có thể sử dụng mã javascript để đánh cắp cookie của người dùng.
Với các website sử dụng HTTPS cho các chức năng quan trọng, HTTP cho các chức năng thông thường, thì cần thiết lập thuộc tính “secure”cho các session cookie để đảm bảo session cookie này được truyền qua kênh truyền có mã hóa. Nếu không sử dụng thuộc tính này thì dù có sử dụng HTTPS cho chức năng quan trọng như đăng nhập, nhưng phiên làm việc vẫn có thể bị nghe lén, lấy cắp khi truyền qua HTTP.

Chuyển hướng và chuyển tiếp thiếu thẩm tra
Không cho phép người dùng cuối có thể can thiệp vào quá trình redirect từ ứng dụng web này sang ứng dụng web khác. Nếu cần sử dụng thì URL phải được kiểm tra, đảm bảo URL được redirect đến nằm trong danh sách cho phép của ứng dụng.
Để lộ dữ liệu của hệ thống
Yêu cầu tất cả dữ liệu, tài nguyên hệ thống ( báo cáo, file lưu trữ khi xuất hệ thống xuất ra hoặc tải lên, file cấu hình,…) không được lưu trong thư mục cho phép truy cập trực tiếp không qua xác thực. Việc thực hiện tải ( download ) dữ liệu này phải qua bước xác thực và tham số trong link download phải được mã hóa, tránh để lộ đường dẫn tuyệt đối của file dữ liệu trên hệ thống.
Đối với các thệ thống đang triển khai yêu cầu các dữ liệu, tài nguyên hệ thống ( báo cáo, file lưu trữ khi xuất hệ thống xuất ra hoặc tải lên,…) phải được lưu trong thư mục bên ngoài thư mục chứa source code của web server.
Thất thoát thông tin do kiểm soát lỗi và ngoại lệ không tốt
Khi xử lý ngoại lệ và thông báo miêu tả lỗi yêu cầu chương trình không hiển thị chi tiết lỗi cho người dùng cuối, hạn chế thông tin hiển thị nhất có thể. Việc này nhằm ngăn cản kẻ tấn công dựa vào các thông báo lỗi chương trình để thu thập thông tin về hệ thống. Các thông tin lỗi này phải được log lại bên server để phục vụ bảo trì, xác định nguyên nhân lỗi ứng dụng…
Sử dụng Captcha an toàn
Với các chức năng quan trọng, ảnh hưởng đến dữ liệu quan trọng cần tránh chương trình tự động có thể thực thi các chức năng này thì cần sử dụng captcha để xác thực hành động thực thi là do người sử dụng thực hiện. Ví dụ như các chức năng: Đổi mật khẩu (renew password), cấp lại mật khẩu (reset password), nhớ lại mật khẩu (forgot password), chức năng đăng ký người dùng, chức năng trừ, cộng tiền, chức năng xóa hủy tài khoản, ….
Captcha có thể không sử dụng ngay khi thực hiện chức năng mà kích hoạt sau khi có dấu hiệu nghi ngờ có tác động do công cụ tự động. Ví dụ như: Chức năng đăng nhập thực hiện thất bại 5 lần liên tiếp, có khả năng bị bruteforce mật khẩu, lúc đó hệ thống sẽ yêu cầu người dùng cần nhập captcha. Cách sử dụng captcha an toàn, tham khảo Chỉ thị sử dụng Captcha an toàn số 05/CT-VTQĐ-KT ban hành ngày 04/01/2013.
File inclusion
Kiểm tra chặt chẽ các hàm include, require, require_once, include_once cho phép gọi các file khác trong hệ thống.
Command injection
Hạn chế tối đa sử dụng dữ liệu do người dùng đưa vào để gửi đến thực thi các lệnh của hệ điều hành.
Trường hợp bắt buộc phải sử dụng cơ chế trên thì cần validate chặt chẽ dữ liệu người dùng gửi vào, tránh các ký tự cho phép nối thêm các câu lệnh thực thi của hệ điều hành. Sử dụng whitelist là danh sách chứa các ký tự được phép xuất hiện trong dữ liệu, để so sánh, đối chiếu.
Xml/Xpath injection
Escape hoặc encode XML dữ liệu trước khi đưa vào file dữ liệu dạng XML, để tránh hacker có thể chèn dữ liệu có chứa thẻ xml gây ra sai lệch dữ liệu trong file xml.
Dữ liệu input từ người dùng phải được tham số hóa trước khi đưa vào thư viện xử lý Xpath.
P/s : Phần tiếp theo Sharecs muốn hướng dẫn chi tiết từng lỗi nên fix và cách phòng chống như thế nào, các bạn cùng đón chờ nhé !