You are on page 1of 68

Kiểm tra/nhắc lại bài học trước

CÔNG NGHỆ WEB AN TOÀN

Bài 3-3. MỘT SỐ VẤN ĐỀ KHÁC


Mục tiêu buổi học

1. Trình bày được về các phương pháp xác thực người dùng
2. Trình bày được về việc phân quyền và xử lý hợp thức
3. Tạo được một trang web động có thêm phần xác thực, phân
quyền và xử lý hợp thức

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 3 of 68
Tài liệu tham khảo

1. https://www.w3schools.com/
2. Bài giảng “Phát triển ứng dụng Web”, Lê Đình Thanh, Trường Đại
học Công nghệ, ĐHQGHN.
3. Bộ bài tập học phần.

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 4 of 68
1 Xác thực người dùng
2 Phân quyền
3 Xử lý hợp thức
4 Viết lại URL
5 Định tuyến URL
1 Xác thực người dùng
2 Phân quyền
3 Xử lý hợp thức
4 Viết lại URL
5 Định tuyến URL
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 6 of 68
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, …)

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 7 of 68
Xác thực…
• Xác thực theo tên sử dụng và mật khẩu
̶ Phổ biến
̶ 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

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 8 of 68
Xác thực HTTP
• Trình duyệt gửi HTTP
Request lên serve
• 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
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 9 of 68
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.3.19 (Unix) PHP/4.0.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.g., bad password), or your browser doesn't
understand how to supply the credentials required.<P> <HR>
<ADDRESS>Apache/1.3.19 Server at dexter Port 80</ADDRESS>
</BODY></HTML>
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 10 of 68
Ví dụ HTTP Request có thông tin xác thực
GET /auth/keys.php HTTP/1.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==

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 11 of 68
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’+
https://www.w3schools.com/php/func_network_header.asp
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 12 of 68
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."');
header('HTTP/1.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."');
header('HTTP/1.0 401 Unauthorized');
exit();
}
//Logic ứng dụng

?>

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 13 of 68
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

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 14 of 68
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:Index.php');
} else {
$err = "Sai tên đăng nhập hoặc mật khẩu";
}
}
?>
<!DOCTYPE html><head>…</head><body>
<?php echo $err; ?>
<form method="post">
Tên đăng nhập: <input type="text" name="tdn"/> <br/>
Mật khẩu: <input type="password" name="mk" /> <br/>
<input type="submit" value="Đăng nhập" />
</form>
</body></html>
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 15 of 68
Xác minh tên đăng nhập và mật khẩu
• Kiểm tra tên đăng nhập và mật khẩu do người dùng cung cấp có
hợp hợp lệ hay không
• Các tên đăng nhập và mật khẩu hợp lệ = tài khoản người dùng
̶ Được lưu trong cơ sở dữ liệu, trong tệp cấu hình hay cố định cứng trong
mã nguồn
• Sử dụng giá trị băm của mật khẩu
̶ password_hash($password, $algo)
̶ crypt($password, $salt)
• Xác minh mật khẩu bằng cách so sánh các giá trị băm
̶ password_verify($password, $hash)
https://www.w3schools.com/php/func_string_crypt.asp
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 16 of 68
1 Xác thực người dùng
2 Phân quyền
3 Xử lý hợp thức
4 Viết lại URL
5 Định tuyến URL
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 17 of 68
Phân quyền
• Bước cuối cùng trong quản lý truy cập
• Quyết định liệu người dùng có được thực hiện từng hành
động hay truy cập từng dữ liệu cụ thể hay không.
• Ứng dụng có thể hỗ trợ nhiều vai trò người dùng (user roles).
Mỗi vai trò được quyền truy cập tập chức năng và dữ liệu xác
định. Ứng dụng cũng có thể cho phép từng người dùng truy
cập những chức năng và dữ liệu cụ thể.

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 18 of 68
1 Xác thực người dùng
2 Phân quyền
3 Xử lý hợp thức
4 Viết lại URL
5 Định tuyến URL
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 19 of 68
Xử lý hợp thức…
• Mục đích
̶ Đảm bảo dữ liệu do người dùng nhập đầy đủ
(trường bắt buộc) và đúng đắn (độ dài, kiểu, định
dạng, phạm vi). Thông báo lỗi nếu dữ liệu nhập
chưa đảm bảo các ràng buộc trên. Chỉ sử dụng,
lưu dữ liệu vào CSDL khi dữ liệu được nhập đủ
và đúng.
̶ Đảm bảo dữ liệu nhập được làm sạch, chuyển
đổi và chuẩn hóa, ví dụ chuyển ngày Việt thành
Anh để lưu CSDL, chuẩn hóa tên, …

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 20 of 68
Xử lý hợp thức…
• Thực hiện
̶ Phải thực hiện ở cả client và server
• Kiểm tra hợp thức phía client (javascript) Là cách kiểm tra
hiệu quả (truyền thông và thời gian thực hiện) và thân thiện
(không tải lại trang, kiểm tra từng phần ngay khi vừa nhập
xong) hơn, tăng được tương tác với người dùng.
• Kiểm tra hợp thức phía server: Bằng ngôn ngữ kịch bản.
Không thể bỏ qua kiểm tra phía server vì kiểm tra phía
client có thể thất bại do trình duyệt bị tắt javascript

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 21 of 68
Kiểm tra phía client…
• Sử dụng style hoặc text để biểu thị các trường buộc phải nhập
• Hiển thị hướng dẫn nhập nếu cần
• Có thể kiểm tra bộ phận cho từng trường nhập ngay khi người dùng
nhập xong cho trường nhập (sử dụng sự kiện onkeyup, kiểm tra mã ký
tự là 13 (Enter) thì kiểm tra)
• Nếu việc kiểm tra cần có thông tin trên server (ví dụ kiểm tra trùng mã)
thì dùng iframe hoặc AJAX để gửi dữ liệu lên server và kiểm tra
• Có thể tự động điền/thông báo một số trường căn cứ dữ liệu đã được
nhập ở các trường khác. Ví dụ tự động tính và hiển thị tổng điểm khi
người dùng thay đổi các điểm thành phần

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 22 of 68
Kiểm tra phía client…
• Thông báo lỗi nhập liệu

̶ Sử dụng span để hiển thị thông báo lỗi (thân thiện)

̶ Sử dụng alert để hiển thị thông báo (không thân thiện, CHỈ áp
dụng cho các lỗi nghiêm trọng)

̶ Sau khi báo lỗi, có thể đặt tâm điểm vào đối tượng nhập liệu cần
nhập lại

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 23 of 68
Các hàm javascript hữu ích cho việc kiểm tra phía client…
• document.getElementById(id): Lấy tham chiếu đối tượng
có định danh là id
• document.getElementsByName(name): Trả về mảng các
tham chiếu đến các đối tượng có tên là name
• document.getElementsByTagName(tagname): Trả về
mảng các tham chiếu đến các đối tượng có kiểu (thẻ) tagname
• obj.value: Giá trị (text) người dùng đã nhập vào đối tượng obj
• str.substring(begin,end): Trả về xâu con bao gồm các
ký tự có chỉ mục từ begin đến end-1 của xâu str
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 24 of 68
Các hàm javascript hữu ích cho việc kiểm tra phía client
• str.substring(begin): Trả về xâu con bao gồm các k{ tự
có chỉ mục từ begin đến hết của xâu str
• str.split(deli): Tách xâu str bởi sử dụng xâu ngăn cách
deli. Trả về mảng các xâu kết quả
• str.toUpperCase(): Trả về xâu viết hoa của str
• str.toLowerCase(): Trả về xâu viết thường của str
• isNaN(s): true nếu s không là biểu diễn số
• parseInt(s): Giá trị nguyên của biểu diễn s
• parseFloat(s): Giá trị thực của biểu diễn s
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 25 of 68
Kiểm tra phía server…
• Chỉ có thể kiểm tra tổng thể
• Gửi nguyên dữ liệu nhập + mã và thông báo lỗi về client nếu có
lỗi nhập liệu
• Client hiển thị lại form với dữ liệu đã nhập và các thông báo

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 26 of 68
Các hàm PHP hữu ích cho việc kiểm tra…
• $input = $_POST*“tenThamso”+
• $input = $_GET*“tenThamso”+
• isset($input): true nếu $input đã được khai báo/thiết lập
• empty($input): true nếu $input rỗng
• is_numeric($input): true nếu $input là số hoặc biểu diễn số
• intval($input): Lấy giá trị nguyên của $input
• floatval($input): Lấy giá trị thực của $input
• explode($deli, $s): Tách xâu $s bởi ký tự phân cách $deli
• substr($s, $b, $l): Lấy xâu con của $s bao gồm $l ký tự bắt đầu
từ ký tự có chỉ mục $b
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 27 of 68
Các hàm PHP hữu ích cho việc kiểm tra…
• date(“d"), date(“m"), date("Y"): Lấy ngày, tháng, năm
hiện tại
• time(): Lấy thời gian hiện tại
• ereg($exp, $input): Kiểm tra $input có định dạng như
biểu thức $exp hay không
̶ $exp có dạng “^(*charList+,acceptedLengths-$”
̶ Ví dụ:
̶ "^([0-9+,4,5-)$“: Số nguyên có 4 hoặc 5 chữ số
̶ "^([0-9]{2})/([0-9]{2})/([0-9+,4-)$“: Có dạng ngày tháng DD/MM/YYYY
̶ "^[0-9a-z~!#$%&_-]([.]?[0-9a-z~!#$%&_-])*@[0-9az~!#$%&_-]([.]?[0-9a-
z~!#$%&_-+)*$“: Định dạng email
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 28 of 68
Ví dụ: Form nhập liệu
<form method="post" id="form1">
<label for="hoten" class="newrow">Họ tên:</label>
<input type="text" name="hoten" id="hoten" value="<?php echo $hoten;
?>"/>
<span id="loi_hoten" class="errornote"><?php echo $loi_hoten;?></span>
<br/>
<label for="ngaysinh" class="newrow">Ngày sinh:</label>
<input type="text" name="ngaysinh" id="ngaysinh" value="<?php echo
$ngaysinh;?>"/>
<span id="loi_ngaysinh" class="errornote"><?php echo $loi_ngaysinh;
?></span> <br/>
<label for="email" class="newrow">Email:</label>
<input type="text" name="email" id="email" value="<?php echo $email;
?>"/>
<span id="loi_email" class="errornote"><?php echo $loi_email;?></span>
<br/>
<label class="newrow"> </label>
<input type="button" id="btncn" value = "Chấp nhận"/>
<input type="button" value = "Bỏ qua"/>
</form>
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 29 of 68
Ví dụ: Xử lý hợp thức ở front end
if ($("#hoten").val() == "") {
$("#loi_hoten").html("Chưa nhập họ tên");
hople = false;
}
if ($("#ngaysinh").val() != "") {
if (!laNgayThang($("#ngaysinh").val())) {
$("#loi_ngaysinh").html("Ngày sinh không đúng");
hople = false;
}}
if ($("#email").val() != "") {
var reg_mail = /^[A-Za-z0-9]+([_\.\-]?[A-Za-z0-9])*@[A-Za-z0-
9]+([\.\-]?[A-Zaz0-9]+)*(\.[A-Za-z]+)+$/;
if(!reg_mail.test($("#email").val())) {
$("#loi_email").html("Email không đúng");
hople = false;
}}
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 30 of 68
Ví dụ: Xử lý hợp thức ở back end
if (empty($_POST["hoten"])) {
$loi_hoten = "Chưa nhập họ tên";
$hople = false;
}
if (!empty($_POST["ngaysinh"])) {
if (!laNgayThang($_POST["ngaysinh"])) {
$loi_ngaysinh = "Ngày sinh không đúng";
$hople = false;
}
}
if (!empty($_POST["email"])) {
if (!preg_match("^[a-zA-Z0-9.-_]+@[a-zA-Z0-9-]+.[a-zA-z]{2,5}$",
$_POST["email"])) {
$loi_email = "Email không đúng";
$hople = false;
}
}
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 31 of 68
1 Xác thực người dùng
2 Phân quyền
3 Xử lý hợp thức
4 Viết lại URL
5 Định tuyến URL
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 32 of 68
Viết lại URL
• Viết lại URL (URL Rewrite) là sửa đổi URL do web client yêu
cầu trước khi web server phục vụ
̶ Rewrite Engine thực hiện viết lại URL
• Apache: mod_rewrite

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 33 of 68
Tại sao lại viết lại URL
• Tạo liên kết
̶ gọn gàng, dễ nhớ, thân thiện với người dùng
̶ thân thiện với các search engines
• Che được chuỗi truy vấn đối với người dùng
• Cho site vẫn sử dụng được URL khi thay đổi công nghệ phía dưới
TRY IT YOURSELF
http://www.tienphong.vn/xa-hoi/phong-su/602827/Vuot-thoat-mot-Con-
Dao-chinh-minh.html
http://www.tienphong.vn/xa-hoi/phong-su/602827/misc.html
http://www.tienphong.vn/xa-hoi/phong-su/602827/does-not-matter.html
http://www.tienphong.vn/xa-hoi/phong-su/602827/whatever-you-like.html

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 34 of 68
Viết lại URL như thế nào?
• Rewrite Engine thực hiện
viết lại URL dựa trên tập
luật được cấu hình trước
• Luật cho biết cách sửa
đổi URL, được viết theo
biểu thức chính quy

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 35 of 68
Luật viết lại URL…

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 36 of 68
Luật viết lại URL…
• Pattern, CondPattern là xâu ký tự
được viết theo biểu thức chính quy
• Cú pháp biểu thức chính quy:
. Bất kz ký tự nào * 0 hoặc N lần xuất hiện của
[string] Bất kz ký tự nào thuộc văn bản phía trước (N > 0)
“string”
+ 1 hoặc N lần xuất hiện của
[^string] Bất kz ký tự nào khác các văn bản phía trước (N > 1)
ký tự thuộc “string”
^ Bắt đầu liên kết
(text) Nhóm văn bản
text1|text2 text1 hoặc text2 $ Kết thúc liên kết
? 0 hoặc 1 lần xuất hiện của \char ký tự đặc biệt char
văn bản phía trước
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 37 of 68
Ví dụ Pattern
• ^/wiki/.*$
̶ Khớp
• /wiki/Semantic_URL
̶ Không khớp
• /wiki-Semantic_URL

• ^/su-kien/.*-[0-9]+\.htm$
̶ Khớp
• /su-kien/mien-bac-mien-trung-mua-lon-trong-ngaytrung-thu-20171004080130699.htm
• /su-kien/bao-dan-tri-tang-qua-trung-thu-cho-cac-emco-hoan-canh-kho-khan-
20171004065430012.htm
̶ Không khớp
• /su-kien/987-error.htm.

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 38 of 68
Luật viết lại URL …
• TestString, Substitution là xâu ký tự có thể chứa các cấu
trúc mở rộng sau:
̶ $N (0 <= N <= 9) Tham chiếu ngược đến nhóm thứ N trong
Pattern
̶ %N (0 <= N <= 9) Tham chiếu ngược đến nhóm thứ N trong
CondPattern liền trước
̶ ${mapname:key|default} Giá trị ánh xạ
̶ %{NAME_OF_VARIABLE} Biến server

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 39 of 68
Ví dụ tham chiếu ngược

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 40 of 68
Biến server
• HTTP_USER_AGENT • API_VERSION QUERY_STRING
HTTP_REFERER THE_REQUEST AUTH_TYPE
HTTP_COOKIE REQUEST_URI • TIME_YEAR
HTTP_FORWARDED REQUEST_FILENAME TIME_MON
HTTP_HOST IS_SUBREQ TIME_DAY
HTTP_PROXY_CONNECTION HTTPS TIME_HOUR
HTTP_ACCEPT • REMOTE_ADDR TIME_MIN
• DOCUMENT_ROOT REMOTE_HOST TIME_SEC
SERVER_ADMIN REMOTE_PORT TIME_WDAY
SERVER_NAME REMOTE_USER TIME
SERVER_ADDR REMOTE_IDENT
SERVER_PORT REQUEST_METHOD
SERVER_PROTOCOL SCRIPT_FILENAME
SERVER_SOFTWARE PATH_INFO
https://www.w3schools.com/php/php_superglobals_server.asp
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 41 of 68
Ví dụ biến server

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 42 of 68
Ánh xạ
• RewriteMap MapName MapType:MapSource
• Ví dụ
̶ RewriteMap product2id txt:productmap.txt
̶ RewriteRule ^/product/(.*)$
/prods.php?id=${product2id:$1|0} [PT]

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 43 of 68
Luật viết lại URL…
• c-flags:
̶ nocase| NC Không phân biệt hoa thường khi so sánh TestString
với CondPattern
̶ ornext | OR Kết hợp theo logic OR với điều kiện liền sau.
̶ “” Kết hợp logic AND với điều kiện liền sau

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 44 of 68
Luật viết lại URL…
• r-flags:
̶ nocase| NC Không phân biệt hoa thường khi so sánh
̶ chain|C Tạo chuỗi luật với luật tiếp theo. Nếu một luật không
khớp, các luật phía sau trong chuỗi sẽ bị bỏ qua.
̶ last|L Dừng quá trình viết lại, không áp dụng thêm các luật khác
̶ next|N Quay về luật thứ nhất
̶ forbidden|F Trả về response có mã 403 FORBIDDEN
̶ gone|G Trả về response có mã 410 GONE
̶ redirect|R[=code] Chuyển hướng
̶ skip|S=num Bỏ qua num luật tiếp sau nếu luật hiện tại khớp
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 45 of 68
Một số chỉ dẫn khác
• RewriteBase URL-path
Tiền tố của URL được dùng trong chỉ thị RewriteRule thay thế
đường dẫn tương đối
• RewriteEngine on|off
Bật hoặc tắt viết lại URL

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 46 of 68
Ví dụ 1
• Che dấu định dạng tệp tài nguyên web
Viết lại URL từ books.php?id=12 thành books-12.html:

RewriteEngine on
RewriteRule ^books-([0-
9]+)\.html$books.php?id=$1

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 47 of 68
Ví dụ 2
• Định hướng nội dung cho người dùng
Viết lại URL từ books.php?id=12 thành books/web-
books/12.html:

RewriteEngine on
RewriteRule ^books/([a-zA-Z0-9_-]+)/([0-9]+)
\.html$ books.php?id=$2

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 48 of 68
Ví dụ 3
• Tên miền không có www thành www
Để truy cập www.uet.vnu.edu.vn mà chỉ cần nhập uet.vnu.edu.vn:

RewriteEngine On
RewriteCond %{HTTP_HOST}
^uet\.vnu\.edu\.vn$RewriteRule (.*)
http://www.uet.vnu.edu.vn/$1[R=301,L]

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 49 of 68
Ví dụ 4
• Rút gọi URL
Để chuyển đến trang thông tin của người dùng abc tại
uet.vnu.edu.vn/user.php?username=abc bằng URL
uet.vnu.edu.vn/abc:

RewriteEngine On
RewriteRule ^/([a-zA-Z0-9_-]+)$
user.php?username=$1
RewriteRule ^/([a-zA-Z0-9_-]+)/$
user.php?username=$1
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 50 of 68
Ví dụ 5
• Thay đổi thư mục web
Trang web uet.vnu.edu.vn trước đây được cài ở thư mục
/var/www/ trên máy chủ, nay quản trị viên muốn chuyển vào thư
mục /home/:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^uet\.vnu\.edu\.vn$ [OR]
RewriteCond %{HTTP_HOST} ^www\.uet\.vnu\.edu\.vn$
RewriteCond %{REQUEST_URI} !^/home/
RewriteRule (.*) /home/$1

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 51 of 68
Triển khai viết lại
• Bật mođun viết lại mod_rewrite trong Apache
sudo a2enmod rewrite
• Cấu hình thư mục gốc của ứng dụng:
<Directory /path/to/home/folder/>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
• Luật viết lại được đặt trong các tệp .htaccess thuộc các
thư mục của ứng dụng.
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 52 of 68
1 Xác thực người dùng
2 Phân quyền
3 Xử lý hợp thức
4 Viết lại URL
5 Định tuyến URL
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 53 of 68
Định tuyến URL
• Định tuyến URL (URL Routing) là phân tích url để quyết định xử lý ở
server
̶ If URL matches pattern1 then action1
̶ Else if URL matches pattern2 then action2
̶ ...

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 54 of 68
Tại sao định tuyến URL?
• Tạo liên kết
̶ gọn gàng, dễ nhớ, thân thiện với người dùng
̶ thân thiện với các search engines
• Che được chuỗi truy vấn đối với người dùng
• Cho site vẫn sử dụng được URL khi thay đổi công nghệ
phía dưới
TRY IT YOURSELF
http://demo.magentocommerce.com/index.php/electronics/co
mputers

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 55 of 68
Định tuyến URL như thế nào?
• Ứng dụng web thực hiện định tuyến URL
̶ Một trang đặc biệt được gọi là bộ điều khiển mặt trước (front
controller) tiếp nhận mọi request
• Bộ điều khiển mặt trước giống như cửa duy nhất vào ứng dụng
• Cần hỗ trợ của viết lại URL để chuyển hướng mọi request đến trang khác
về bộ điều khiển mặt trước
̶ Bộ điều khiển mặt trước
chuyển URL cho bộ định
tuyến (router)
̶ Bộ định tuyến phân tích url
để xác định xử lí sẽ phục vụ
̶ Xử lí được gọi và thực hiện.

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 56 of 68
Chuyển hướng tất cả các trang về bộ điều khiển mặt trước
• Tệp .htaccess ở thư mục gốc
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 57 of 68
Cài đặt bộ điều khiển mặt trước…
• Tệp index.php
<?php
namespace core\control;
require_once("app/core/control/Router.php");
//Bộ điều khiển mặt trước
class FrontController {
public static function proc() {
//Định tuyến
$ret = Router::proc();
//Bao hàm tệp cài đặt lớp điều khiển
$filename =
"app/".$ret["moduleName"]."/control/".ucfirst($ret["controllerName"
])."Controller.php";
require_once($filename);
//Khai báo đối tượng lớp điều khiển
$controllerName =
"\\".$ret["moduleName"]."\\control\\".ucfirst($ret["controllerName"]
)."Controller";
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 58 of 68
Cài đặt bộ điều khiển mặt trước…
• Tệp index.php…
$controller = new $controllerName();
//Kiểm tra phương thức có tồn tại hay không và thực thi
if (method_exists($controller, $ret['actionName'])) {
$action = $ret['actionName'];
$controller->$action($ret['parameters']);
} else {
echo 'Không tìm thấy trang web';
}
}
}
UrlFrontController::proc(); có dạng
http(s)://host:port/module/controller/action/parameter1/.../
parameterN
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 59 of 68
Cài đặt bộ định tuyến…
• Tệp Router.php…
<?php
namespace core\control;
class Router {
public static function proc() {
//URI có dạng /module/controller/action/p1/p2/p3
$moduleName = "fallback";//Tên module, mặc định là module báo lỗi
$controllerName="fallback";//Tên bộ điều khiển, mặc định là trình điều khiển báo lỗi
$actionName = "proc"; //Tên hành động
$parameters = ""; //Các tham số
//Phân tích URI để lấy tên module, controller, action và các parameters
$requestURI = explode('/',strtolower($_SERVER['REQUEST_URI']));
$scriptName = explode('/', strtolower($_SERVER['SCRIPT_NAME']));
$commandArray = array_diff_assoc($requestURI, $scriptName);

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 60 of 68
Cài đặt bộ định tuyến…
• Tệp Router.php…
$commandArray = array_values($commandArray);
if (count($commandArray) > 0) $moduleName = $commandArray[0];
if (count($commandArray) > 1) $controllerName = $commandArray[1];
if (count($commandArray) > 2) $actionName = $commandArray[2];
if (count($commandArray)>3)
$parameters=array_slice($commandArray,3);
//Kiểm tra có tệp cài đặt của controller hay không
$filename =
"app/".$moduleName."/control/".ucfirst($controllerName)."Controller.php
";
if(!file_exists($filename)) {
$moduleName = "fallback";
$controllerName = "fallback";
$actionName = "proc";
}
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 61 of 68
Cài đặt bộ định tuyến…
• Tệp Router.php
//không có tệp cài đặt, chuyển về hành động báo lỗi
if ($moduleName == "") $moduleName = "fallback";
if ($controllerName == "") $controllerName = "fallback";
if ($actionName == "") $actionName = "proc";
//Trả kết quả về cho bộ điều khiển mặt trước
$ret = array();
$ret["moduleName"] = $moduleName; //Tên môđun
$ret["controllerName"] = $controllerName; //Tên lớp điều khiển
$ret["actionName"] = $actionName; //Tên hành động
$ret["parameters"] = $parameters; //Giá trị các tham số
return $ret;
}
}

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 62 of 68
Model
class Post {
private $db;
public function __construct() {$this->db=new
\core\model\PDOData();}
public function __destruct() {$this->db=null;}
public function getAllPosts() {
$sql = "select * from post";
return $this->db->doQuery($sql);
}
}
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 63 of 68
View
<!DOCTYPE html><html><head>
<meta http-equiv="content-type"
content="text/html; charset=utf-8"/>
</head><body>
<?php
foreach ($data as $r) {
echo "<div id='post".$r["post_id"]."'>";
echo $r["post_time"];
echo $r["post_content"];
echo "</div>";
}
?>
</body></html>

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 64 of 68
Controller
class PostController {
public function proc($arr) {
$post = new \forum\model\Post();
$data = $post->getAllPosts();
require_once("app/forum/view/list.php");
}
public function edit($arr) {
echo "Chinh sua bai viet <br/> Tham so: ";
var_dump($arr);
}
}
Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 65 of 68
Tổng kết

1. Đã tìm hiểu về xác thực người dùng


2. Đã tìm hiểu về phân quyền
3. Đã tìm hiểu về xử lý hợp thức và một số cách sử dụng hợp thức
để xử lý dữ liệu đầu vào
4. Đã tìm hiểu về viết lại và định tuyến URL

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 67 of 68
Bài tập về nhà

1. Đọc thêm tài liệu về xác thực, phân quyền, xử lý hợp thức, viết lại
và định tuyến URL
2. Làm bài tập số 6

Bộ môn An toàn phần mềm - Khoa An toàn thông tin - HVKTMM Slide 68 of 68

You might also like