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; ?