Lưu Trạng Thái và An Ninh Ứng Dụng Web: Cookie & Session - Bài Giảng Lê Đình Thanh Khoa

Chương 08 khám phá các chủ đề, khái niệm quan trọng. Tìm hiểu sâu hơn về kiến thức, kỹ năng cần thiết. Nâng cao hiểu biết với chương 08 ngay!

Chuyên ngành

Phát triển ứng dụng web

Người đăng

Ẩn danh

Thể loại

Bài giảng
69
1
0

Phí lưu trữ

30 Point

Mục lục chi tiết

8. Chương 8: Lưu trạng thái và đảm bảo an ninh

8.1. Lưu trạng thái

8.1.1. Cookie

8.1.2. Phiên

8.2. Đảm bảo an ninh

8.2.1. Quản lý truy cập

8.2.1.1. Xác thực
8.2.1.2. Quản lý phiên
8.2.1.3. Điều khiển truy cập

8.2.2. Xử lý dữ liệu vào

8.2.2.1. Xử lý hợp thức
8.2.2.2. Làm sạch
8.2.2.3. Sử dụng API an toàn

8.2.3. Đối phó với tấn công

8.2.4. Bảo vệ dữ liệu bằng mật mã học

8.2.5. Một số rủi ro an ninh ứng dụng web

Tóm tắt

I. HTTP Phi Trạng Thái Nhu Cầu Cấp Bách Lưu Trạng Thái Ứng Dụng Web

Giao thức HTTP, nền tảng của World Wide Web, vốn được thiết kế là một stateless protocol (giao thức phi trạng thái). Điều này có nghĩa là mỗi yêu cầu (request) mà trình duyệt gửi đến máy chủ được xử lý độc lập, không có bất kỳ mối liên hệ hay sự ghi nhớ nào về các yêu cầu trước đó. Máy chủ không tự động lưu trữ thông tin về các tương tác trước đây của một người dùng cụ thể. Theo tài liệu “Bài giảng Phát triển ứng dụng web” của Lê Đình Thanh, Khoa Công nghệ Thông tin, Trường Đại học Công nghệ, ĐHQGHN, "Mỗi yêu cầu (request) được xử lý độc lập. Không yêu cầu server nhớ trạng thái của các xử lý trước".

Tuy nhiên, trong thực tế, các ứng dụng web hiện đại lại yêu cầu khả năng lưu trạng thái ứng dụng web để cung cấp trải nghiệm người dùng liền mạch và cá nhân hóa. Ví dụ điển hình là chức năng shopping cart (giỏ hàng), nơi người dùng có thể thêm nhiều sản phẩm từ các trang khác nhau trước khi tiến hành thanh toán. Nếu không có cơ chế state management, mỗi lần người dùng chuyển trang, giỏ hàng sẽ trống rỗng. Tương tự, việc duy trì đăng nhập để người dùng không phải nhập lại thông tin xác thực sau mỗi lần truy cập là điều tối quan trọng để nâng cao user experience. Ngoài ra, các tính năng như personalization (cá nhân hóa nội dung), user tracking (theo dõi hành vi người dùng) hay authentication (xác thực) cũng đều phụ thuộc vào khả năng ghi nhớ trạng thái của ứng dụng. Vấn đề phi trạng thái của HTTP đã đặt ra thách thức lớn, thúc đẩy sự ra đời và phát triển của các cơ chế như Cookie & Session để giúp ứng dụng web "ghi nhớ" người dùng và các hành động của họ. Việc hiểu rõ bản chất phi trạng thái của HTTP là nền tảng để đánh giá tầm quan trọng và cách thức hoạt động của các giải pháp lưu trạng thái ứng dụng web trong lập trình web.

1.1. Bản Chất Phi Trạng Thái Của Giao Thức HTTP

HTTP (Hypertext Transfer Protocol) hoạt động dựa trên mô hình yêu cầu-phản hồi đơn giản. Khi trình duyệt gửi yêu cầu tài nguyên đến máy chủ, máy chủ sẽ phản hồi và sau đó kết nối có thể bị đóng (hoặc giữ mở trong một thời gian ngắn). Máy chủ không giữ bất kỳ thông tin nào về yêu cầu trước đó hay mối liên hệ giữa các yêu cầu từ cùng một người dùng. "HTTP là giao thức phi trạng thái. Mỗi yêu cầu (request) được xử lý độc lập." - Lê Đình Thanh. Điều này ban đầu giúp giảm tải cho máy chủ và đơn giản hóa thiết kế giao thức. Tuy nhiên, khi các ứng dụng web trở nên phức tạp hơn, cần tương tác đa bước và cá nhân hóa, hạn chế này đã bộc lộ rõ ràng, đặt ra nhu cầu cấp thiết về state management để lưu trạng thái ứng dụng web một cách hiệu quả.

1.2. Tại Sao Ứng Dụng Web Cần Lưu Trạng Thái Để Tối Ưu Trải Nghiệm

Nhu cầu lưu trạng thái phát sinh từ mong muốn cung cấp một user experience liền mạch và cá nhân hóa. Khi người dùng tương tác với một ứng dụng web phức tạp, chẳng hạn như thêm sản phẩm vào shopping cart qua nhiều trang, điền vào biểu mẫu nhiều bước, hoặc duy trì đăng nhập, ứng dụng cần phải "nhớ" thông tin về các hành động và lựa chọn của người dùng. Nếu không có khả năng lưu trạng thái, mọi tương tác sẽ bắt đầu lại từ đầu, gây khó chịu và giảm hiệu quả sử dụng. Điều này nhấn mạnh tầm quan trọng của việc lưu trạng thái ứng dụng web để hỗ trợ các tính năng như personalization, authentication, và authorization, biến trải nghiệm duyệt web từ một chuỗi các yêu cầu độc lập thành một phiên tương tác có ý nghĩa và liên tục.

II. Cookie Giải Pháp Lưu Trạng Thái Ứng Dụng Web Phía Client Đắc Lực

HTTP Cookie là một trong những cơ chế lâu đời và phổ biến nhất để lưu trạng thái ứng dụng web phía client (trình duyệt). Theo tài liệu, "Một cookie là mẫu tin (tên, giá trị, …) Server gửi cookie cho client (trong đáp ứng cho yêu cầu trước) Client nhớ cookie và gửi cookie cho server trong các yêu cầu sau Server xử lý theo cookie nhận được". Về cơ bản, khi máy chủ gửi phản hồi HTTP cho trình duyệt, nó có thể bao gồm một hoặc nhiều Cookie. Trình duyệt sau đó sẽ lưu trữ các HTTP cookie này và tự động gửi lại chúng trong các yêu cầu HTTP tiếp theo đến cùng tên miền mà Cookie được thiết lập. Điều này cho phép máy chủ nhận biết và xử lý các yêu cầu dựa trên thông tin đã được lưu trữ trước đó. Cookie được sử dụng rộng rãi cho nhiều mục đích như duy trì đăng nhập (ghi nhớ phiên làm việc), user tracking (theo dõi hành vi người dùng), personalization (cá nhân hóa nội dung dựa trên sở thích), và shopping cart (lưu trữ các mặt hàng trong giỏ hàng). Mặc dù có những hạn chế về bảo mật và quyền riêng tư, Cookie vẫn là một công cụ không thể thiếu trong hệ sinh thái web hiện đại, đặc biệt là khi cần lưu trữ dữ liệu nhỏ và cần truy cập nhanh chóng từ phía trình duyệt. Việc hiểu rõ cách hoạt động và các thuộc tính của Cookie là rất quan trọng để sử dụng chúng một cách hiệu quả và an toàn trong phát triển web application state.

2.1. Định Nghĩa Và Cơ Chế Hoạt Động Của HTTP Cookie

Một HTTP cookie là một đoạn văn bản nhỏ mà máy chủ gửi đến trình duyệt web của người dùng. Trình duyệt lưu trữ đoạn văn bản này và gửi lại nó trong mỗi yêu cầu tiếp theo đến cùng một máy chủ. Cơ chế này cho phép máy chủ ghi nhớ thông tin về người dùng, giải quyết vấn đề phi trạng thái của HTTP. Ví dụ, "Bác sỹ ghi bệnh lý và đơn thuốc vào sổ y bạ. Bệnh nhân cầm sổ y bạ về và đem sổ y bạ đến tại các lần khám sau." (Lê Đình Thanh) tương tự việc máy chủ gửi Cookie cho trình duyệt. Thông tin trong Cookie có thể bao gồm session ID, sở thích người dùng hoặc trạng thái đăng nhập, cho phép ứng dụng thực hiện state management và cung cấp trải nghiệm cá nhân hóa. Cookie được lưu trữ dưới dạng cặp key-value và có thể có nhiều thuộc tính đi kèm.

2.2. Các Thuộc Tính Quan Trọng Và Vấn Đề An Ninh Của Cookie

Các cookie attributes như Expires (thời gian hết hạn), Max-Age, Domain, Path quy định phạm vi và thời gian sống của Cookie. Thuộc tính Secure đảm bảo Cookie chỉ được gửi qua kết nối HTTPS, tăng cường web security. HttpOnly ngăn chặn JavaScript truy cập Cookie, giúp chống lại các cuộc tấn công Cross-Site Scripting (XSS). Thuộc tính SameSite quan trọng để phòng chống Cross-Site Request Forgery (CSRF) bằng cách kiểm soát việc Cookie được gửi trong các yêu cầu chéo nguồn gốc. Tài liệu chỉ ra rằng "Kích thước request tăng khi bao hàm cookie", "Tính an ninh không cao", và "Tính riêng tư bị vi phạm do trình duyệt nhớ cookie" là những vấn đề chính. Việc quản lý các thuộc tính này đúng cách là then chốt để đảm bảo data persistence an toàn và bảo vệ browser data khỏi các rủi ro bảo mật.

III. Session Giải Pháp Lưu Trạng Thái Ứng Dụng Web Phía Server Mạnh Mẽ

Web Session cung cấp một giải pháp mạnh mẽ để lưu trạng thái ứng dụng web bằng cách lưu trữ dữ liệu ở phía máy chủ, khắc phục nhiều hạn chế về bảo mật và kích thước của Cookie. Khác với Cookie lưu trữ dữ liệu trực tiếp trên trình duyệt, Session chỉ lưu một session ID nhỏ ở phía client (thường là trong một Cookie), trong khi tất cả dữ liệu trạng thái thực tế được giữ an toàn trên máy chủ. "Phiên (session) là cuộc thoại (dialogue/conversation) giữa trình khách và trình phục vụ. Server lưu các biến phiên và gửi cho client định danh phiên. Định danh phiên được server tạo ngẫu nhiên." - Lê Đình Thanh. Điều này giúp giảm thiểu rủi ro tiết lộ thông tin nhạy cảm cho người dùng cuối và cho phép lưu trữ lượng lớn dữ liệu mà không ảnh hưởng đến kích thước của mỗi yêu cầu HTTP. Session rất hữu ích cho các tác vụ như authentication (xác thực người dùng sau khi đăng nhập), authorization (phân quyền truy cập), hoặc lưu trữ kết quả tính toán trung gian trong một chuỗi tương tác phức tạp. Việc quản lý Session đòi hỏi máy chủ phải dành tài nguyên để lưu trữ dữ liệu, nhưng đổi lại mang lại mức độ kiểm soát và bảo mật cao hơn. Hiểu rõ cách triển khai và quản lý web session là yếu tố then chốt để xây dựng các ứng dụng web phức tạp, có khả năng mở rộng và an toàn, đặc biệt là khi cần duy trì đăng nhậpcá nhân hóa trải nghiệm người dùng một cách chặt chẽ.

3.1. Cơ Chế Hoạt Động Và Quản Lý Session ID

Cơ chế của web session bắt đầu khi người dùng truy cập ứng dụng. Máy chủ tạo một session ID duy nhất, ngẫu nhiên và an toàn, sau đó gửi ID này cho trình duyệt (thường là qua một HTTP cookie có thuộc tính HttpOnly để ngăn chặn JavaScript truy cập). Tất cả dữ liệu trạng thái của phiên (như thông tin người dùng, giỏ hàng, tùy chọn) được lưu trữ trên server-side storage và liên kết với session ID đó. Trong các yêu cầu tiếp theo, trình duyệt gửi lại session ID và máy chủ sử dụng ID này để truy xuất dữ liệu trạng thái tương ứng. "Trình duyệt bao gồm định danh phiên trong các requests sau, server ánh xạ định danh phiên sang các biến phiên." (Lê Đình Thanh). Điều này cho phép state management mà không cần truyền toàn bộ dữ liệu qua lại giữa client và server, tăng cường web security và hiệu quả.

3.2. Ưu Nhược Điểm Của Session Trong Lưu Trạng Thái Ứng Dụng Web

Web session mang lại nhiều ưu điểm: tăng cường web security do dữ liệu nhạy cảm được giữ ở phía máy chủ, không giới hạn dung lượng lưu trữ (chỉ bị giới hạn bởi server memory), và khả năng quản lý trạng thái phức tạp hơn. "Nên sử dụng biến phiên khi Tăng hiệu năng, Cần chuỗi các tương tác, Kết quả trung gian, Cá nhân hóa" (Lê Đình Thanh). Tuy nhiên, nhược điểm là yêu cầu tài nguyên máy chủ để lưu trữ và quản lý, có thể gây khó khăn cho scalability trong môi trường load balancing hoặc distributed systems. "Nếu lạm dụng sử dụng biến phiên, server sẽ phải dành nhiều bộ nhớ để lưu" (Lê Đình Thanh). Ngoài ra, nếu không được quản lý đúng cách, Session vẫn tiềm ẩn rủi ro bảo mật như session hijacking hoặc session fixation, đòi hỏi các biện pháp bảo vệ chặt chẽ.

IV. Web Security Bí Quyết Bảo Mật Cookie Session Hiệu Quả Nhất

Bảo mật là một khía cạnh không thể bỏ qua khi triển khai Cookie & Session để lưu trạng thái ứng dụng web. Cả hai cơ chế này đều tiềm ẩn các lỗ hổng nếu không được cấu hình và quản lý đúng cách, dẫn đến các cuộc tấn công nghiêm trọng. Tài liệu gốc của Lê Đình Thanh nhấn mạnh "Đảm bảo an ninh" là một nội dung quan trọng, bao gồm "Quản lý truy cập", "Xử lý dữ liệu vào", và "Đối phó với tấn công". Các mối đe dọa phổ biến bao gồm Cross-Site Scripting (XSS), nơi kẻ tấn công có thể tiêm mã độc vào trang web để đánh cắp Cookie; Cross-Site Request Forgery (CSRF), cho phép kẻ tấn công thực hiện hành động trái phép thay mặt người dùng đã đăng nhập; và các hình thức tấn công vào Session như session hijacking (đánh cắp session ID) hay session fixation (buộc người dùng sử dụng một session ID do kẻ tấn công cung cấp). Để đảm bảo web security, cần áp dụng các biện pháp bảo mật đa lớp, từ việc cấu hình chặt chẽ các cookie attributes (như HttpOnly, Secure, SameSite) đến việc triển khai quản lý session ID an toàn, bao gồm tạo ID phức tạp, thay đổi ID sau khi đăng nhập và thiết lập thời gian hết hạn phiên hợp lý. Việc liên tục cập nhật kiến thức về các lỗ hổng và áp dụng các thực tiễn tốt nhất là điều cần thiết để bảo vệ data persistenceuser preferences trong các ứng dụng web.

4.1. Phòng Chống Tấn Công XSS Và CSRF Với Cookie

Để phòng chống Cross-Site Scripting (XSS), việc sử dụng thuộc tính HttpOnly cho HTTP cookie là cực kỳ quan trọng. Thuộc tính này ngăn chặn các JavaScript độc hại truy cập vào Cookie, làm giảm khả năng kẻ tấn công đánh cắp session ID hoặc thông tin nhạy cảm khác. Đối với Cross-Site Request Forgery (CSRF), thuộc tính SameSite của Cookie đóng vai trò then chốt. Bằng cách thiết lập SameSite thành Lax hoặc Strict, trình duyệt sẽ hạn chế việc gửi Cookie trong các yêu cầu chéo nguồn gốc, làm cho các cuộc tấn công CSRF trở nên khó thực hiện hơn. Lê Đình Thanh cũng đề cập đến "Xử lý dữ liệu vào" và "Làm sạch" dữ liệu để đối phó với tấn công. Kết hợp với việc xác thực dữ liệu đầu vào và mã hóa đầu ra, các biện pháp này tạo thành lá chắn mạnh mẽ bảo vệ web application stateuser experience.

4.2. Bảo Vệ Session Khỏi Session Hijacking Và Session Fixation

Bảo vệ web session đòi hỏi sự quản lý chặt chẽ session ID. Để ngăn chặn session hijacking, session ID phải được tạo ngẫu nhiên, có độ dài và độ phức tạp cao, khó đoán hoặc làm giả. Điều quan trọng là phải thay đổi session ID ngay sau khi người dùng đăng nhập thành công để chống lại session fixation, nơi kẻ tấn công cố gắng buộc người dùng sử dụng một ID phiên đã biết. "Đảm bảo an ninh cho phiên o Cấp định danh phiên Dài và phức tạp để tránh bị làm giả" (Lê Đình Thanh). Ngoài ra, việc thiết lập thời gian hết hạn phiên (timeout) hợp lý, cũng như hủy phiên khi người dùng đăng xuất hoặc khi phiên không hoạt động trong một khoảng thời gian nhất định, là các biện pháp cần thiết để giảm thiểu rủi ro bảo mật. Lưu trữ dữ liệu phiên trên server-side storage an toàn cũng góp phần bảo vệ user preferencesauthentication.

V. Ngoài Cookie Session Các Giải Pháp Lưu Trạng Thái Tối Ưu Khác

Trong bối cảnh phát triển web hiện đại, ngoài Cookie & Session truyền thống, nhiều phương pháp và công nghệ mới đã xuất hiện để lưu trạng thái ứng dụng web, cung cấp sự linh hoạt và hiệu quả hơn cho các nhu cầu cụ thể. Các giải pháp client-side storage như localStoragesessionStorage cho phép ứng dụng web lưu trữ lượng lớn browser data trực tiếp trong trình duyệt mà không bị gửi đi trong mỗi yêu cầu HTTP, giúp giảm tải mạng và tăng hiệu năng. Đặc biệt, JSON Web Token (JWT) đã trở thành một lựa chọn phổ biến cho việc authenticationauthorization trong các ứng dụng web không trạng thái (stateless) hoặc các API RESTful. JWT cung cấp một cách an toàn để truyền thông tin giữa các bên dưới dạng đối tượng JSON, được ký điện tử để đảm bảo tính toàn vẹn và xác thực. Việc hiểu và lựa chọn phương pháp data persistence phù hợp là yếu tố then chốt để xây dựng các ứng dụng web hiện đại, có khả năng scalability cao, và hoạt động tốt trong môi trường phân tán. Mỗi giải pháp có những ưu và nhược điểm riêng, việc cân nhắc kỹ lưỡng các yếu tố như bảo mật, hiệu năng, dung lượng lưu trữ và kiến trúc ứng dụng là điều cần thiết để tối ưu hóa user experienceweb application state.

5.1. localStorage và sessionStorage Lưu Trữ Dữ Liệu Phía Client Hiệu Quả

localStoragesessionStorage là hai API của HTML5, cung cấp khả năng lưu trữ browser data dưới dạng cặp key-value string trực tiếp trong trình duyệt của người dùng. Ưu điểm chính của chúng là khả năng lưu trữ dung lượng lớn hơn nhiều so với Cookie (thường là 5MB hoặc hơn) và dữ liệu không được tự động gửi lên máy chủ trong mỗi yêu cầu HTTP, giúp giảm network overhead. localStorage lưu trữ dữ liệu vĩnh viễn (cho đến khi người dùng xóa thủ công hoặc bằng mã), lý tưởng cho user preferences hoặc data persistence dài hạn. Ngược lại, sessionStorage lưu trữ dữ liệu chỉ trong suốt phiên làm việc của trình duyệt (tab cụ thể), rất phù hợp cho shopping cart tạm thời hoặc trạng thái biểu mẫu đa bước. Cả hai đều cung cấp giải pháp client-side storage mạnh mẽ cho lưu trạng thái ứng dụng web mà không cần liên tục tương tác với server.

5.2. JSON Web Token JWT Xác Thực Không Trạng Thái Cho API

JSON Web Token (JWT) đại diện cho một phương pháp hiện đại để lưu trạng thái ứng dụng web và xử lý authentication, đặc biệt trong kiến trúc microservices và API RESTful. Thay vì sử dụng session ID và lưu trữ trạng thái trên máy chủ, JWT đóng gói thông tin xác thực và ủy quyền vào một chuỗi token đã ký. Sau khi người dùng đăng nhập, máy chủ tạo và gửi một JWT cho client. Client sẽ gửi JWT này trong tiêu đề của mỗi yêu cầu tiếp theo. Máy chủ có thể xác minh tính toàn vẹn và xác thực của token mà không cần tra cứu trong cơ sở dữ liệu hoặc server-side storage. Điều này giúp giảm gánh nặng server memory và cải thiện scalability, đặc biệt trong môi trường load balancing. JWT rất lý tưởng cho các ứng dụng yêu cầu phi trạng thái, nơi tính chất độc lập của mỗi yêu cầu là ưu tiên.

VI. Tổng Kết Tương Lai Nào Cho Việc Lưu Trạng Thái Ứng Dụng Web

Việc lưu trạng thái ứng dụng web là một yếu tố then chốt để xây dựng các trải nghiệm người dùng hiện đại và tương tác. Từ sự ra đời của HTTP cookie đến sự phát triển của web session và các giải pháp tiên tiến hơn như localStorage, sessionStorage, hay JSON Web Token (JWT), mỗi công nghệ đều đóng góp vào việc giải quyết vấn đề phi trạng thái cố hữu của giao thức HTTP. Lựa chọn giữa các phương pháp này phụ thuộc vào nhiều yếu tố: kích thước dữ liệu cần lưu, yêu cầu web security, nhu cầu scalability, và kiến trúc tổng thể của ứng dụng. Ví dụ, Cookie thường được dùng cho các dữ liệu nhỏ, duy trì đăng nhập cơ bản; Session lý tưởng cho dữ liệu nhạy cảm cần server-side storage; trong khi localStorage/sessionStorage phù hợp cho client-side storage lớn, không cần gửi lên server; và JWT là lựa chọn mạnh mẽ cho authentication không trạng thái trong các API. Tương lai của việc quản lý trạng thái ứng dụng web sẽ tiếp tục chứng kiến sự đổi mới, hướng tới các giải pháp an toàn hơn, hiệu quả hơn và dễ dàng mở rộng trong môi trường phân tán. Điều này đòi hỏi các nhà phát triển phải liên tục cập nhật kiến thức, nắm vững ưu nhược điểm của từng phương pháp để đưa ra lựa chọn tối ưu, đảm bảo data persistence hiệu quả và user experience vượt trội.

6.1. Hướng Dẫn Lựa Chọn Phương Pháp Lưu Trạng Thái Ứng Dụng Web Phù Hợp

Việc lựa chọn phương pháp lưu trạng thái ứng dụng web phù hợp đòi hỏi sự cân nhắc kỹ lưỡng. Đối với duy trì đăng nhậppersonalization đơn giản, HTTP cookie có thể là lựa chọn tiện lợi, nhưng cần áp dụng các thuộc tính bảo mật như HttpOnly và Secure. Khi cần lưu trữ dữ liệu nhạy cảm hoặc lượng lớn dữ liệu, web session với server-side storage là ưu tiên hàng đầu, kèm theo các biện pháp chống session hijacking. Đối với client-side storage dung lượng lớn, không cần gửi lên server, localStorage hoặc sessionStorage là lý tưởng. Còn đối với các API RESTful hoặc kiến trúc microservices cần authentication không trạng thái và scalability, JSON Web Token (JWT) thường là giải pháp tối ưu. Việc hiểu rõ mục đích sử dụng, yêu cầu web security, và khả năng mở rộng của từng phương pháp giúp đưa ra quyết định thông minh.

6.2. Tương Lai Của Quản Lý Trạng Thái Ứng Dụng Web Và Các Xu Hướng Mới

Tương lai của quản lý trạng thái ứng dụng web sẽ tiếp tục phát triển theo hướng an toàn hơn, hiệu quả hơn và hỗ trợ tốt hơn cho các kiến trúc phân tán. Các xu hướng hiện tại bao gồm việc sử dụng rộng rãi JSON Web Token (JWT) cho xác thực không trạng thái, đặc biệt trong các môi trường cloud và serverless. Các giải pháp lưu trữ trạng thái phân tán như Redis hoặc Memcached đang trở nên phổ biến để hỗ trợ web session trong các hệ thống load balancing và có scalability cao. Ngoài ra, sự chú trọng vào web security sẽ ngày càng tăng, với các tiêu chuẩn mới và thuộc tính Cookie nâng cao như SameSite trở thành bắt buộc. Các công nghệ blockchain và cơ chế định danh phi tập trung cũng có thể mở ra những hướng đi mới cho data persistenceauthentication trong tương lai, thay đổi cách chúng ta lưu trạng thái ứng dụng web.

30/09/2025

Trích đoạn nội dung tài liệu

Bài giảng PHÁT TRIỂN ỨNG DỤNG WEB Lê Đình Thanh Khoa Công nghệ Thông tin Trường Đại học Công nghệ, ĐHQGHN E-mail: thanhld@vnu.504 1 Chương 8 Lưu trạng thái và đảm bảo an ninh 2 Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Nội dung • Lưu trạng thái  Cookie  Phiên • Đảm bảo an ninh  Quản lý truy cập  Xử lý dữ liệu vào  Đối phó với tấn công  Bảo vệ dữ liệu bằng mật mã học  Một số rủi ro an ninh ứng dụng web Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Trạng thái của ứng dụng • HTTP là giao thức phi trạng thái  Mỗi yêu cầu (request) được xử lý độc lập. Không yêu cầu server nhớ trạng thái của các xử lý trước • Ứng dụng có thể cần nhớ trạng thái  Khi xử lý trên nhiều trang, cần sự tương tác phức tạp  Ví dụ: chuyển qua nhiều trang khác nhau để chọn nhiều mặt hàng đưa vào giỏ hàng  Cần tính cá nhân hóa  Ví dụ: phải biết người dùng nào đang sử dụng để cung cấp nội dung phù hợp Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Các phương pháp lưu trạng thái • Lưu trạng thái ở trình khách  Sử dụng cookie • Lưu trạng thái ở trình phục vụ  Sử dụng phiên (session) Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Cookie • Một cookie là mẫu tin (tên, giá trị, …)  Server gửi cookie cho client (trong đáp ứng cho yêu cầu trước)  Client nhớ cookie và gửi cookie cho server trong các yêu cầu sau  Server xử lý theo cookie nhận được Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Tương tự cookie • Việc tạo và sử dụng cookie giống như sử dụng sổ y bạ  Server == Bác sỹ  Client == Bệnh nhân  Cookie == Nội dung được ghi trong sổ y bạ  Bác sỹ ghi bệnh lý và đơn thuốc vào sổ y bạ. Bệnh nhân cầm sổ y bạ về và đem sổ y bạ đến tại các lần khám sau.

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Server gửi cookie cho client • Trình duyệt nhớ cookie và gửi cookie trong tiêu đề của các requests tiếp sau, ví dụ HTTP/1.0 200 OK Content-type: text/html Set-Cookie: food=choco; tasty=strawberry Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Client gửi cookie cho server • Client nhớ cookie và gửi cookie cho server bằng đặt thuộc tính Cookie trong tiêu đề HTTP Request, ví dụ GET /nextPage.com Cookie: food=choco; tasty=strawberry Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Các thành phần của cookie • Các thành phần o key=<value> o Expires=<date> o Max-Age=<non-zero-digit> o Domain=<domain-value> o Path=<path-value> o Secure o HttpOnly • Ví dụ o tasty=strawberry; Expires=Wed, 21 Oct 2017 07:28:00 GMT; Secure; Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Server tạo và gửi cookie • int setcookie(string name, [string value], [int expire], [string path], [string domain], [bool secure], [bool httponly])  name: tên cookie  value: giá trị của cookie  expire: thời điểm cookie hết hạn  path: đường dẫn trình duyệt sẽ gửi cookie  domain: tên miền trình duyệt sẽ gửi cookie  secure: chỉ truyền cookie qua kết nối an toàn  httponly: trình duyệt không được truy cập cookie bằng javascript Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Server nhận và xử lý cookie • Cookie được lưu trong mảng $_COOKIE • Nếu bật register_globals (trong php.ini), biến có tên cookie được khởi tạo • Ví dụ  $tasty= $_COOKIE[“tasty”]; Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Client truy cập cookie bằng javascript • Nếu httponly = false • Ví dụ <script type=”text/javascript”> console.cookie = "amount=3"; console.cookie); </script> Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Ví dụ sử dụng cookie <?php if (!isset($_COOKIE["guideshown"])) { //Truy cập trang lần đầu ?> <div id="guide"> Chào mừng quý vị ghé thăm trang của chúng tôi.

Quý vị vui lòng giành ít thời gian xem bản giới thiệu.<br><br> <button id="closeguide">Đóng</button> </div> <script> document.onclick = function() { document.display = "none"; }; </script> <?php setcookie("guideshown", "shown"); } ?> Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Vấn đề của cookie • Kích thước request tăng khi bao hàm cookie • Tính an ninh không cao • Tính riêng tư bị vi phạm do trình duyệt nhớ cookie Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Phiên • Phiên (session) là cuộc thoại (dialogue/conversation) giữa trình khách và trình phục vụ. • Server lưu các biến phiên và gửi cho client định danh phiên.

Định danh phiên được server tạo ngẫu nhiên. • Trình duyệt bao gồm định danh phiên trong các requests sau, server ánh xạ định danh phiên sang các biến phiên • Phiên phải có thời gian hết hạn (timeout). • Các biến phiên bị hủy khi ngắt kết nối hoặc hết hạn phiên Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Tương tự biến phiên • Việc tạo và sử dụng biến phiên giống như sử dụng sổ theo dõi bệnh nhân  Server == Bác sỹ  Client == Bệnh nhân  Phiên == Nội dung được ghi trong sổ theo dõi  Bác sỹ ghi bệnh lý và đơn thuốc vào sổ theo dõi, cấp cho bệnh nhân thẻ khám chữa bệnh (định danh phiên) nhưng không đưa sổ cho bệnh nhân.

Bệnh nhân cầm thẻ về và đem thẻ đến tại các lần khám sau. Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Đăng ký và sử dụng biến phiên • Khởi động phiên session_start( ); • Sử dụng biến phiên $_SESSION[“svName”]; • Hủy phiên session_destroy( ); Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Ví dụ sử dụng biến phiên <?php if (!isset($_SESSION["guideshown"])) { //Truy cập trang lần đầu trong phiên ?> <div id="guide"> Chào mừng quý vị ghé thăm trang của chúng tôi.

Quý vị vui lòng giành ít thời gian xem bản giới thiệu.<br><br> <button id="closeguide">Đóng</button> </div> <script> document.onclick = function() { document.display = "none"; }; </script> <?php $_SESSION["guideshown"] = "shown"; } ?> Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Khi nào nên/không nên sử dụng biến phiên • Nên  Tăng hiệu năng: Thực hiện tính toán phức tạp một lần, lưu kết quả trong biến phiên, sử dụng kết quả nhiều lần  Cần chuỗi các tương tác: Người dùng cần nhập liệu trên nhiều giao diện khác nhau, nếu cần có thể quay về giao diện trước để sửa dữ liệu đã được nhập ở giao diện trước  Kết quả trung gian: Nhiều kết quả trung gian nên được ghi nhớ cho các tính toán tiếp sau  Cá nhân hóa: Lưu định danh người dùng ở dạng biến phiên, căn cứ vào định danh người dùng để cung cấp nội dung phù hợp • Không nên Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Khi nào nên/không nên sử dụng biến phiên • Nên • Không nên  Lưu trữ trên server: Nếu lạm dụng sử dụng biến phiên, server sẽ phải dành nhiều bộ nhớ để lưu  An ninh: Hacker có thể lợi dụng phiên để thực hiện các tấn công Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Đảm bảo an ninh • Các nhóm giải pháp đảm bảo an ninh o Quản lý truy cập  Xác thực  Quản lý phiên  Điều khiển truy cập o Xử lý dữ liệu vào o Đối phó với tấn công o Bảo vệ dữ liệu bằng mật mã học • Một số rủi ro an ninh ứng dụng web Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Quản lý truy cập • Đảm bảo mỗi người dùng chỉ được sử dụng chức năng và dữ liệu nhất định, không được sử dụng chức năng và dữ liệu khác. • Ba cơ chế có liên quan mật thiết • Xác thực (authentication) người dùng • Quản lý phiên (session management) • Điều khiển truy cập (access control) Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Xác thực • Mục đích  Xác minh người dùng có đúng như thông tin mà họ xưng danh hay không • Phương pháp • Thông tin mà người dùng biết (tên sử dụng và mật khẩu, …) • Thông tin mà người dùng có (thẻ từ, RFID, …) • Thông tin là chính người dùng (vân tay, khuôn mặt, …) Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Xác thực • Xác thực theo tên sử dụng và mật khẩu o Phổ biến o Cung cấp tên sử dụng và mật khẩu  Theo giao thức HTTP  Sử dụng form đăng nhập Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Xác thực HTTP • Trình duyệt gửi HTTP Request lên server • Server trả lời bằng HTTP Response với mã 401 yêu cầu xác thực • Trình duyệt cho người dùng nhập tên sử dụng và mật khẩu, gửi thông tin xác thực lên server • Server gửi nội dung trang web về cho trình duyệt Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Ví dụ HTTP Response yêu cầu xác thực HTTP/1.1 401 Authorization Required Date: Mon, 21 May 2001 23:40:54 GMT Server: Apache/1.5 WWW-Authenticate: Basic realm="Marketing Secret“ Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <HTML><HEAD> <TITLE>401 Authorization Required</TITLE> </HEAD><BODY> <H1>Authorization Required</H1> This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e., bad password), or your browser doesn't understand how to supply the credentials required.<P> <HR> <ADDRESS>Apache/1.19 Server at dexter Port 80</ADDRESS> </BODY></HTML> Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Ví dụ HTTP Request có thông tin xác thực GET /auth/keys.0 Connection: Keep-Alive User-Agent: Mozilla/4.51 [en] (WinNT; I) Host: localhost Accept: image/gif, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Authorization: Basic ZGF2ZTpwbGF0eXB1cw== Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Xác thực HTTP bằng mã PHP • Dùng hàm header() để thêm yêu cầu xác thực vào HTTP response header('WWW-Authenticate: Basic realm="My Realm"'); header('HTTP/1.0 401 Unauthorized'); • Tên sử dụng và mật khẩu được người dùng nhập và gửi đến server được lưu trong các biến $_SERVER[‘PHP_AUTH_USER’] $_SERVER[‘ PHP_AUTH_PW’] Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Ví dụ xác thực HTTP bằng mã PHP <?php if(!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate:Basic realm=“Nhập tên sử dụng và mật khẩu.0 401 Unauthorized'); exit(); } else if (!isValid($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW‘])) { header('WWW-Authenticate:Basic realm="Tên sử dụng hoặc mật khẩu không đúng. Vui lòng nhập lại.0 401 Unauthorized'); exit(); } //Logic ứng dụng … ?> Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Hạn chế của xác thực HTTP • Trình duyệt có thể nhớ tên đăng nhập và mật khẩu dẫn đến có thể truy cập lại trang.

• Nếu người dùng không nhớ tên đăng nhập hoặc mật khẩu thì không có cách gì (ví dụ sử dụng câu hỏi an ninh) để tiếp tục sử dụng tài khoản • Ứng dụng có thể yêu cầu đăng nhập nhiều lần. Ví dụ, để vào mục cài đặt cần phải đăng nhập lại một lần nữa Lê Đình Thanh, Bài giảng Phát triển ứng dụng web. Sử dụng form đăng nhập <?php //Login.php $err = “”; if (isset($_POST["tdn"])) { //Đã đệ trình form if (isValid($_POST["tdn"], $_POST["mk"]) { header('Location:/homepage'); } else { $err = "Sai tên đăng nhập hoặc mật khẩu"; } } ?> <!DOCTYPE html><head>…</head><body> <?php echo $err; ?

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ