2. Kết nối bảo mật và giao thức SSL
Xác thực cho website
Mã hóa và giải mã dữ liệu
Mục tiêu
Bài 4 - Bảo mật cho website 2
3. Giới thiệu về kết nối bảo mật
Lấy một chứng nhận bảo mật điện tử
Yêu cầu một kết nối bảo mật
Chuyển hướng một kết nối bảo mật
Kết nối bảo mật và giao thức SSL
Bài 4 - Bảo mật cho website 3
4. Hình ảnh một yêu cầu kết nối bảo mật:
Kết nối bảo mật
Bài 4 - Bảo mật cho website 4
5. Kết nối bảo mật (secure connection): ngăn chặn
dữ liệu bị đọc được trong quá trình truyền tải
qua Internet
Kết nối được bảo mật thường chậm hơn kết nối
thường: phải mã hóa và giải mã dữ liệu
Cách xác định kết nối bảo mật: HTTPS
Kết nối bảo mật
Bài 4 - Bảo mật cho website 5
6. Hai loại giao thức:
SSL (Secure Sockets Layer): giao thức cũ
TLS (Transport Layer Security): giao thức mới, chỉ có
các trình duyệt mới ra gần đây mới hỗ trợ
Xác thực SSL phía máy chủ
Xác thực SSL phía máy khách
Một số khái niệm
Bài 4 - Bảo mật cho website 6
7. Hình ảnh một chứng nhận bảo mật điện tử:
Chứng nhận bảo mật điện tử
Bài 4 - Bảo mật cho website 7
8. Chứng nhận phía máy chủ
Chứng nhận phía máy khách
Hai loại
chứng nhận bảo mật điện tử
Bài 4 - Bảo mật cho website 8
9. Trước khi kết nối được thiết lập, máy chủ sử
dụng xác thực SSL phía máy chủ để tự xác thực
bằng cách cung cấp một chứng nhận bảo mật
điện tử cho trình duyệt
Mặc định thì trình duyệt sẽ chấp nhận các chứng
nhận bảo mật điện tử từ các nguồn tin cậy
(trusted sources)
Cơ chế làm việc của SSL
Bài 4 - Bảo mật cho website 9
10. Nếu chứng nhận bảo mật không phải của nguồn
tin cậy thì trình duyệt thông báo để người dùng
tự quyết định
Trong một vài trường hợp, máy khách có thể tự
xác nhận với xác thực SSL phía máy khách bằng
cách cài sẵn chứng nhận bảo mật điện tử
Cơ chế làm việc của SSL
Bài 4 - Bảo mật cho website 10
11. Để sử dụng SSL trong ứng dụng web thì bạn cần
mua một chứng nhận bảo mật điện tử
Các loại cấp độ bảo mật SSL:
40 bit
56 bit
128 bit
256 bit
Khái niệm
Bài 4 - Bảo mật cho website 11
12. Cơ quan chứng nhận (Certification Authority -
CA)
Cơ quan đăng ký (Registration Authority - RA)
Khái niệm
Bài 4 - Bảo mật cho website 12
13. Địa chỉ kiểm tra
kết nối bảo mật trong mạng nội bộ
Bài 4 - Bảo mật cho website 13
//Kiểm tra kết nối bảo mật được thiết lập đúng chưa
https://localhost/
//Yêu cầu một kết nối bảo mật
https://localhost/book_apps/ch21_ssl/
//Trả về một kết nối thông thường
http://localhost/book_apps.ch21_ssl/
14. Địa chỉ kiểm tra
kết nối bảo mật trên Internet
Bài 4 - Bảo mật cho website 14
//Yêu cầu một kết nối bảo mật
https://www.murach.com/
//Trả về một kết nối thông thường
http://www.murach.com/
16. File chuyển hướng
tới kết nối bảo mật
Bài 4 - Bảo mật cho website 16
<?php
//Đảm bảo trang web sử dụng kết nối bảo mật
if (!isset($_SERVER['HTTPS'])) {
$url = 'https://' . $_SERVER['HTTP_HOST'] .
$_SERVER['REQUEST_URI'];
header("Location: " . $url);
exit();
}
?>
17. Ba loại xác thực
Sử dụng xác thực dạng form
Sử dụng xác thực cơ bản
Sử dụng xác thực (authentication)
Bài 4 - Bảo mật cho website 17
18. Xác thực dạng form:
Cho phép nhà phát triển viết form đăng nhập để lấy
tên tài khoản và mật khẩu
Cho phép chỉ yêu cầu tên tài khoản và mật khẩu một
lần duy nhất trong mỗi phiên làm việc
Mặc định không mã hóa tên tài khoản và mật khẩu
trước khi gửi lên máy chủ
Ba loại xác thực
Bài 4 - Bảo mật cho website 18
19. Xác thực cơ bản:
Trình duyệt hiển thị hộp thoại để lấy tên tài khoản và
mật khẩu
Đòi hỏi trình duyệt gửi tên tài khoản và mật khẩu cho
mỗi trang được bảo vệ
Mặc định không mã hóa tên tài khoản và mật khẩu
trước khi gửi lên máy chủ
Xác thực rút gọn:
Trình duyệt hiển thị hộp thoại để lấy tên tài khoản và
mật khẩu
Mã hóa tên tài khoản và mật khẩu trước khi gửi lên
máy chủ
Ba loại quá trình xác thực
Bài 4 - Bảo mật cho website 19
20. Hàm sha1($string [, $bin])
Ví dụ: Lưu trữ và xác nhận mật khẩu:
Hàm mã hóa dữ liệu
Bài 4 - Bảo mật cho website 20
<?php
function add_admin($email, $password) {
global $db;
$password = sha1($email . $password);
$query = 'INSERT INTO administrators (emailAddress,
password) VALUES (:email, :password)';
$statement = $db->prepare($query);
$statement->bindValue(':email', $email);
$statement->bindValue(':password', $password);
$statement->execute();
$statement->closeCursor();
}
21. Hàm mã hóa dữ liệu
Bài 4 - Bảo mật cho website 21
function is_valid_admin_login($email, $password) {
global $db;
$query = 'SELECT adminID FROM administrators WHERE
emailAddress=:email AND password=:password';
$statement = $db->prepare($query);
$statement->bindValue(':email', $email);
$statement->bindValue(':password', $password);
$statement->execute();
$valid = ($statement->rowCount() == 1);
$statement->closeCursor();
return $valid;
}
?>
23. Trang web được bảo vệ
(protected page)
Bài 4 - Bảo mật cho website 23
24. Mã điều khiển
cho trang web được bảo vệ
Bài 4 - Bảo mật cho website 24
<?php
//Bắt đầu session và include các hàm cần thiết
session_start();
require_once('model/database.php');
require_once('model/admin_db.php');
//Lấy thông tin về hành động
if (isset($_POST['action'])) {
$action = $_POST['action'];
} else if (isset($_GET['action'])) {
$action = $_GET['action'];
} else {
$action = 'show_admin_menu';
}
//Nếu người dùng chưa đăng nhập thì bắt buộc phải đăng
nhập
if (!isset($_SESSION['is_valid_admin'])) {
$action = 'login';
}
25. Mã điều khiển
cho trang web được bảo vệ
Bài 4 - Bảo mật cho website 25
//Thực thi hành động
switch($action) {
case 'login':
$email = $_POST['email'];
$password = $_POST['password'];
if (is_valid_admin_login($email, $password))
{
$_SESSION['is_valid_admin'] = true;
include('view/admin_menu.php');
} else {
$login_message = 'You must login to
view this page';
include('view/login.php');
}
break;
26. Mã điều khiển
cho trang web được bảo vệ
Bài 4 - Bảo mật cho website 26
case 'show_admin_menu':
include('view/admin_menu.php');
break;
case 'show_product_manager':
include('view/product_manager.php');
break;
case 'show_order_manager':
include('view/order_manager.php');
break;
case 'logout':
$_SESSION = array();
session_destroy();
$login_message = 'You have been logged out';
include('view/login.php');
break;
}
27. File xác nhận tài khoản admin:
Đoạn mã ở đầu trang đăng nhập:
Áp dụng
Bài 4 - Bảo mật cho website 27
<?php
//Đảm bảo người dùng tài khoản admin đúng
if (!isset($_SESSION['is_valid_admin'])) {
header("Location: .");
}
?>
<?php
//Đòi hỏi kết nối bảo mật
require_once('util/secure_conn.php');
?>
28. Đoạn mã ở đầu các trang được bảo vệ:
Áp dụng
Bài 4 - Bảo mật cho website 28
<?php
//Đòi hỏi kết nối bảo mật
require_once('util/secure_conn.php');
//Đòi hỏi tài khoản người dùng đúng
require_once('util/valid_admin.php');
?>
29. Hình ảnh minh họa
cho xác thực cơ bản
Bài 4 - Bảo mật cho website 29
33. Mã PHP đảm bảo tài khoản người dùng là đúng:
Ví dụ
Bài 4 - Bảo mật cho website 33
<?php
require_once('model/database.php');
require_once('model/admin_db.php');
$email = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
if (!is_valid_admin_login($email, $password)) {
header('WWW-Authenticate: Basic realm="Admin"');
header('HTTP/1.0 401 unauthorized');
include('unauthorized.php');
exit();
}
?>
34. Mã PHP ở đầu mỗi trang web được bảo vệ:
Ví dụ
Bài 4 - Bảo mật cho website 34
<?php
//Đòi hỏi kết nối bảo mật
require_once('util/secure_conn.php');
//Đòi hỏi tài khoản admin đúng
require_once('util/valid_admin.php');
?>
35. Giới thiệu thư viện mcrypt
Cách mã hóa và giải mã dữ liệu
Lớp chứa dữ liệu được mã hóa
Mã hóa và giải mã dữ liệu
Bài 4 - Bảo mật cho website 35
36. PHP cung cấp sẵn thư viện mcrypt để hỗ trợ mã
hóa và giải mã dữ liệu
Một số khái niệm:
Cipher
Chế độ hoạt động (mode of operation)
CBC (cipher-block chaining)
Vector khởi tạo (Initialization Vector - IV)
Thư viện mcrypt
Bài 4 - Bảo mật cho website 36
37. Một số hàm trong thư viện mcrypt:
Mcrypt_get_iv_size($cipher, $mode)
Mcrypt_create_iv($ivs)
Mcrypt_encrypt($cipher, $key, $data, $move, $iv)
Mcrypt_decrypt(($cipher, $key, $data, $move, $iv)
Thư viện mcrypt
Bài 4 - Bảo mật cho website 37
38. Một số hằng trong thư viện mcrypt:
MCRYPT_RIJNDAEL_128
MCRYPT_RIJNDAEL_192
MCRYPT_RIJNDAEL_256
MCRYPT_MODE_CBC
Hai hàm chuyển đổi giữa dữ liệu nhị phân và
base64:
Base64_encode($data)
Base64_decode($data)
Thư viện mcrypt
Bài 4 - Bảo mật cho website 38
41. Lớp Crypt
Bài 4 - Bảo mật cho website 41
public function encrypt($data) {
$data = mcrypt_encrypt($this->cipher, $this-
>key, $data, $this->mode, $this->iv);
$data = base64_encode($data);
return $data;
}
public function decrypt($data) {
$data = base64_decode($data);
$data = mcrypt_decrypt($this->cipher, $this-
>key, $data, $this->mode, $this->iv);
return $data;
}
}
?>
42. Sử dụng lớp Crypt
Bài 4 - Bảo mật cho website 42
require 'crypt.php';
$credit_card_no = '4111111111111111111';
//Tạo đối tượng Crypt
$crypt = new Crypt();
//Sử dụng đối tượng Crypt để mã hóa dữ liệu
$data = $crypt->encrypt($credit_card_no);
echo 'Encrypted data: ' . $data . '<br />';
//Sử dụng đối tượng Crypt để giải mã dữ liệu
$credit_card_no = $crypt->decrypt($data);
echo 'Decrypted data: ' . $credit_card_no . '<br />';
43. Kết nối bảo mật sử dụng giao thức TLS và SSL
Khi trình duyệt gửi yêu cầu tới máy chủ qua kết
nối bảo mật thì máy chủ tự xác thực bằng chứng
nhận bảo mật điện tử (digital secure certificate)
Bài 4 - Bảo mật cho website 43
Tổng kết bài học
44. Quy trình sử dụng SSL trong ứng dụng web:
Người dùng gửi yêu cầu mua chứng nhận bảo mật
điện tử tới CA
CA xác thực thông tin yêu cầu quá RA
CA gửi cho người dùng chứng nhận bảo mật điện tử
Người dùng gửi cho người quản trị hosting để cài lên
máy chủ
Mã hóa dữ liệu bằng hàm sha1
PHP cung cấp thư viện mcrypt hỗ trợ mã hóa và
giải mã dữ liệu
Tổng kết bài học
Bài 4 - Bảo mật cho website 44