2.2.3.1. Common Gateway Interface (CGI)
CGI là giao thức tiêu chuẩn cho việc giao tiếp giữa máy chủ web và phần mềm bên ngoài viết bằng bất cứ ngôn ngữ nào. Khi máy khách yêu cầu một truy xuất vào một tệp tin CGI trên máy chủ web, máy chủ web sẽ không trả về nội dụng của tiệp này, mà sẽ gửi yêu cầu này qua một chương trình khác, chương trình này sẽ xử lý yêu cầu kết hợp với mã lệnh trong tệp tin CGI và trả về thông tin cho máy chủ web để máy chủ web trả về cho máy khách. Có thể hiểu CGI là một trình thông dịch các mã lệnh viết chứa trong các tệp tin đặt trên máy chủ.
Hình 2.21 Quá trình xử lý yêu cầu của CGI
CGI cũng cho phép dịch vụ web của bạn tương tác với các chương trình khác như cơ sở dữ liệu hay dịch vụ ứng dụng trên cùng hoặc không cùng máy chủ. Chính vì điều này, nếu bị tấn công, có thể gây ra sự mất mát to lớn. Vì thế, đây là một vài biện pháp an toàn nên tiến hành.
1. Không cho phép chương trình CGI tải lên máy chủ
từ Internet vì kẻ tấn công có thể sử dụng đặc quyền để gắn kèm chương trình phá hủy trong một thư mục, chỉ cần một trình duyệt để kích hoạt nó. Một chương trình CGI kiểu này có thể gắn những tệp tin hoặc thư mục trên máy chủ của bạn, làm thay đổi hoặc xóa những tệp tin có sẵn, sao chép và gửi thư điện tử cho kẻ tấn công toàn bộ đường dẫn của những thông tin bảo mật. Bất cứ chương trình CGI nào cũng nên giới hạn với ít đặc quyền nhất để khi một chương trình không hợp
2. Tương tự, CGI cũng không nên được phép tải về từ máy chủ về vì kẻ xấu có thể lấy cắp và phân tích nó, từ đó hắn có thể tìm ra những lỗ hổng an ninh nghiêm trọng.
3. Nếu bạn sử dụng chương trình CGI kết hợp, đảm
bảo rằng mã nguồn gốc không còn nằm trên máy chủ nữa. Nếu dùng CGI nguyên bản (đơn giản hơn và thường dễ viết hơn nhưng cần nhiều tài nguyên hệ thống), trình thông dịch nên ở khác nguồn với code. Như vậy sẽ hạn chế được quyền hạn dành cho hai đối tượng khác nhau.
2.2.3.2. Bảo mật các trường dữ liệu, trường dữ liệu ẩn
Một trong những lý do khiến khó để phát triển một ứng dụng web an toàn là cấu trúc của ứng dụng web. Khi phát triển một ứng dụng web, người phát triển viết mã lệnh để chạy trên máy chủ web, và một phần sẽ được tải về và chạy trên trình duyệt của người dùng. Người phát triển sẽ mất khá nhiều thời gian để đảm bảo rằng hai phần này sẽ hoạt động một cách trơn tru với nhau. Ví dụ như một điều quan trọng là phải đảm bảo tên các trường dữ liệu được tải xuống trình duyệt của người dùng sẽ chính xác hoàn toàn với các tên trường dữ liệu trong kịch bản trên máy chủ. Và người phát triển sẽ phải giành rất nhiều thời gian để đảm bảo rằng các mã HTML, javascript và các mã khác được tải xuống trình duyệt của người dùng sẽ hoạt động tôt.
Cơ chế hiện tại của cấu trúc ứng dụng web là các phần code được viết sẽ chạy trên máy chủ web và tạo ra mã HTML để trả về cho trình duyệt của người dùng. Ở trình duyệt, người dùng có thể xem được nội dung mã HTML và các mã javascript được trả về từ máy chủ. Điều này phát sinh ra một nguy cơ bảo mật là nếu như các thông tin trong các trường dữ liệu và các trường ẩn không được bảo mật, và kiểm tra thì kẻ tấn công có thể phân tích và chỉnh sửa thông tin này và gửi những thông tin giả mạo lên trên máy chủ web.
Để sử dụng các trường dữ liệu một cách an toàn cần phải thực hiện các bước kiểm tra sau:
4. Lọc thông tin của tất cả các trường nhập dữ liệu được nhập vào. Ví dụ nếu trường dữ liệu là số thẻ tín dụng thì chỉ cho phép nhập số từ 0 đến 9.
5. Kiểm tra độ dài của các trường dữ liệu nhập vào.
6. Nếu sử dụng danh sách lựa chọn (selection list) cũng
cần phải kiểm tra các giá trị cung cấp bởi người dùng.
7. Trong trường hợp sử dụng javascript để kiểm tra các
trường dữ liệu người dùng nhập vào, thì cần phải thực hiện kiểm tra lại một lần nữa trên máy chủ vì kẻ tấn công có thể tắt javascript và vượt qua quá trình kiểm tra dữ liệu ở trình duyệt một cách dễ dàng.
Các trường dữ liệu ẩn thường được dùng để gửi lại các thông tin lên máy chủ web giúp lưu lại các thông tin trong phiên làm việc giữa người dùng thông qua trình duyệt với máy chủ web. Ví dụ như lưu trữ thông tin tên đăng nhập và mật khẩu để xác thực người dùng:
<INPUT TYPE="hidden" NAME="username" VALUE="simsong"> <INPUT TYPE="hidden" NAME="password" VALUE="myauth11">
Ngoài cách sử dụng trường dữ liệu ẩn, các trường dữ liệu cũng có thể được để trên URL:
http://.../password_tester?username=simsong&password=myauth11
Để đảm bảo tính bảo mật và toàn vẹn của dữ liệu trong các trường dữ liệu ẩn cũng như các dữ liệu trên URL, nên sử dụng các cơ chế mã hóa để mã hóa dữ liệu chứa trong các trường dữ liệu ẩn và các trường dữ liệu trên URL. Ví dụ:
http://.../password_tester?
p6e6J6FwQOk0tqLFTFYq5EXR03GQ1wYWG0ZsVnk09yv7ItIHG17ymls4UM %2F1bwHygRhp7ECawzUm%0AKl3Q%2BKRYhlmGILFtbde8%0A:
2.2.3.3. Bảo mật cơ sở dữ liệu
Sẽ rất nguy hiểm nếu như kẻ tấn công có được thông tin kết nối vào cơ sở dữ liệu của ứng dụng web, những thông tin về sản phẩm cũng như các thông tin cá nhân của khách hàng, thông tin giỏ hàng cũng như các thông tin về hóa đơn sẽ bị lộ một khi kẻ tấn công xâm nhập được vào cơ sở dữ liệu. Bởi vậy việc bảo mật thông tin kết nối vào cơ sở dữ liệu là điều cực kỳ quan trọng.
Để bảo mật thông tin kết nối vào cơ sở dữ liệu thì các thông tin này phải được mã hóa và được lưu trữ trong một tệp tin riêng trên máy chủ web, điều này giúp tăng cường khả năng bảo mật cũng như bảo trì web. Các kịch bản trên máy chủ web sẽ mở tệp tin này ra và lấy thông tin về tên đăng nhập, mật khẩu cũng như các thông tin cần thiết khác để kết nối vào cơ sở dữ liệu.
Những điều quan trọng để bảo vệ cơ sở dữ liệu khỏi các nguy cơ tấn công:
8. Cấu hình tường lửa để bảo vệ cơ sở dữ liệu khỏi sự
xâm nhập từ bên ngoài.
Hình 2.22 Thiết lập tường lữa bảo vệ máy chủ cơ sở dữ liệu
9. Đảm bảo rằng tài khoản được sử dụng trong ứng
dụng web để đăng nhập vào máy chủ cơ sở dữ liệu đã được giới hạn quyền.
10. Đảm bảo rằng máy chủ cơ sở dữ liệu đã được sao
lưu, bảo trì và bảo vệ giống như cách bảo vệ các máy chủ khác trong mạng. 2.2.3.4. Ghi lại thông tin các hoạt động quan trọng (logging)
Giống như việc ghi lại các hoạt động trên máy chủ web (logging), việc ghi lại các hoạt động quan trọng cũng như các lỗi và các ngoại lệ (exception) trong ứng dụng web là cực kỳ cần thiết. Những thông tin này sẽ rất hữu dụng trong trường hợp ứng dụng xảy ra
lỗi hay bị tấn công, những thông tin này sẽ được tổng hợp và phân tích để giúp tìm ra nguyên nhân của vấn đề, từ đó đưa ra cách giải quyết để tránh các vấn đề đó lặp lại.
Các thông tin này cũng cần được lưu trữ ở những nơi an toàn và chỉ cho phép những người có thẩm quyền mới được truy cập vào.