Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Preview:

DESCRIPTION

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

Citation preview

Bài 4Bảo mật cho website

Kết nối bảo mật và giao thức SSLXác thực cho websiteMã hóa và giải mã dữ liệu

Mục tiêu

Bài 4 - Bảo mật cho website 2

Giới thiệu về kết nối bảo mậtLấ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ậtChuyể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

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

Kết nối bảo mật (secure connection): ngăn chặndữ liệu bị đọc được trong quá trình truyền tảiqua InternetKết nối được bảo mật thường chậm hơn kết nốithường: phải mã hóa và giải mã dữ liệuCá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

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

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

Chứng nhận phía máy chủChứng nhận phía máy khách

Hai loạichứng nhận bảo mật điện tử

Bài 4 - Bảo mật cho website 8

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ựcbằ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ứngnhậ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

Nếu chứng nhận bảo mật không phải của nguồntin cậy thì trình duyệt thông báo để người dùngtự 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ằngcá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

Để sử dụng SSL trong ứng dụng web thì bạn cầnmua 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 bit56 bit128 bit256 bit

Khái niệm

Bài 4 - Bảo mật cho website 11

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

Địa chỉ kiểm trakế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ưahttps://localhost/

//Yêu cầu một kết nối bảo mậthttps://localhost/book_apps/ch21_ssl/

//Trả về một kết nối thông thườnghttp://localhost/book_apps.ch21_ssl/

Địa chỉ kiểm trakế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ậthttps://www.murach.com/

//Trả về một kết nối thông thườnghttp://www.murach.com/

Thành phần:HTTPSHTTP_HOSTREQUEST_URI

Mảng $_SERVER

Bài 4 - Bảo mật cho website 15

File chuyển hướngtớ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ậtif (!isset($_SERVER['HTTPS'])) {

$url = 'https://' . $_SERVER['HTTP_HOST'] .$_SERVER['REQUEST_URI'];

header("Location: " . $url);exit();

}?>

Ba loại xác thựcSử dụng xác thực dạng formSử 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

Xác thực dạng form:Cho phép nhà phát triển viết form đăng nhập để lấytên tài khoản và mật khẩuCho phép chỉ yêu cầu tên tài khoản và mật khẩu mộtlần duy nhất trong mỗi phiên làm việcMặc định không mã hóa tên tài khoản và mật khẩutrướ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

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 chomỗi trang được bảo vệMặc định không mã hóa tên tài khoản và mật khẩutrướ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ẩuMã hóa tên tài khoản và mật khẩu trước khi gửi lênmáy chủ

Ba loại quá trình xác thực

Bài 4 - Bảo mật cho website 19

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

<?phpfunction 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();

}

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;

}?>

Form đăng nhậpcho xác thực dạng form

Bài 4 - Bảo mật cho website 22

Trang web được bảo vệ(protected page)

Bài 4 - Bảo mật cho website 23

Mã điều khiểncho 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ếtsession_start();require_once('model/database.php');require_once('model/admin_db.php');

//Lấy thông tin về hành độngif (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 đăngnhậpif (!isset($_SESSION['is_valid_admin'])) {

$action = 'login';}

Mã điều khiểncho trang web được bảo vệ

Bài 4 - Bảo mật cho website 25

//Thực thi hành độngswitch($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;

Mã điều khiểncho 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;

}

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 đúngif (!isset($_SESSION['is_valid_admin'])) {

header("Location: .");}?>

<?php//Đòi hỏi kết nối bảo mậtrequire_once('util/secure_conn.php');?>

Đ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ậtrequire_once('util/secure_conn.php');//Đòi hỏi tài khoản người dùng đúngrequire_once('util/valid_admin.php');?>

Hình ảnh minh họacho xác thực cơ bản

Bài 4 - Bảo mật cho website 29

Trang web được bảo vệ

Bài 4 - Bảo mật cho website 30

Trang web không được xác thực

Bài 4 - Bảo mật cho website 31

Thành phần:PHP_AUTH_USERPHP_AUTH_PW

Mảng $_SERVERcho xác thực cơ bản

Bài 4 - Bảo mật cho website 32

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

<?phprequire_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();

}?>

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ậtrequire_once('util/secure_conn.php');

//Đòi hỏi tài khoản admin đúngrequire_once('util/valid_admin.php');?>

Giới thiệu thư viện mcryptCách mã hóa và giải mã dữ liệuLớ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

PHP cung cấp sẵn thư viện mcrypt để hỗ trợ mãhóa và giải mã dữ liệuMột số khái niệm:

CipherChế độ 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

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

Một số hằng trong thư viện mcrypt:MCRYPT_RIJNDAEL_128MCRYPT_RIJNDAEL_192MCRYPT_RIJNDAEL_256MCRYPT_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

Ví dụ

Bài 4 - Bảo mật cho website 39

<?php$credit_card_no = '41111111111';//Khai báo các biến$cipher = MCRYPT_RIJDAEL_128;$mode = MCRYPT_MODE_CBC;$key = sha1('secretKey', true);$ivs = mcrypt_get_iv_size($cipher, $mode);$iv = mcrypt_create_iv($ivs);

//Mã hóa dữ liệu$data = mcrypt_encrypt($cipher, $key, $credit_card_no, $mode,$iv);$data = base64_encode($data);echo 'Encrypted data: '.$data.'<br/>';

//Giải mã dữ liệu$data = base64_decode($data);$credit_card_no = mcrypt_decrypt($cipher, $key,$credit_card_no, $mode, $iv);echo 'Decrypted data: '.$credit_card_no.'<br/>';?>

Lớp Crypt

Bài 4 - Bảo mật cho website 40

class Crypt {private $key;private $ivs;private $iv;private $cipher;private $mode;

public function __construct() {$this->cipher = MCRYPT_RIJDAEL_128;$this->mode = MCRYPT_MODE_CBC;$this->key = sha1('secretKey', true);$this->ivs = mcrypt_get_iv_size($this-

>cipher, $this->mode);$this->iv = mcrypt_create_iv($this->ivs);

}

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;

}}?>

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 />';

Kết nối bảo mật sử dụng giao thức TLS và SSLKhi trình duyệt gửi yêu cầu tới máy chủ qua kếtnối bảo mật thì máy chủ tự xác thực bằng chứngnhậ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

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 CACA xác thực thông tin yêu cầu quá RACA 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ênmáy chủ

Mã hóa dữ liệu bằng hàm sha1PHP 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

Recommended