BAN CƠ YẾU CHÍNH PHỦ
HỌC VIỆN KỸ THUẬT MẬT MÃ
TS. NGUYỄN TUẤN ANH, KS. HỒNG THANH NAM
GIÁO TRÌNH
XÂY DỰNG ỨNG DỤNG WEB AN TOÀN
HÀ NỘI, 2013
BAN CƠ YẾU CHÍNH PHỦ
HỌC VIỆN KỸ THUẬT MẬT MÃ
TS. NGUYỄN TUẤN ANH, KS. HỒNG THANH NAM
GIÁO TRÌNH
XÂY DỰNG ỨNG DỤNG WEB AN TOÀN
HÀ NỘI, 2013
MỤC LỤC
Mục lục..................................................................................................................ii
Danh mục từ viết tắt............................................................................................v
Lời nói đầu...........................................................................................................vi
Chương 1. Giới thiệu chung về xây dựng ứng dụng web an toàn...................1
1.1. Ứng dụng web................................................................................................1
1.2. Giao thức HTTP.............................................................................................4
1.2.1. Truy vấn HTTP...................................................................................5
1.2.2. Phản hồi HTTP....................................................................................6
1.2.3. Phương thức HTTP.............................................................................7
1.2.4. Cookie và Session...............................................................................8
1.2.5. HTTPS...............................................................................................11
1.3. Ngôn ngữ HTML và các thành phần của trang web....................................11
1.4. Ngơn ngữ lập trình web...............................................................................13
1.5. Hiểm họa an tồn ứng dụng web.................................................................16
1.5.1. Nhóm hiểm họa xác thực..................................................................16
1.5.2. Nhóm hiểm họa trao quyền...............................................................17
1.5.3. Nhóm hiểm họa tấn cơng lên máy khách..........................................19
1.5.4. Nhóm hiểm họa thực thi câu lệnh.....................................................20
1.5.5. Nhóm hiểm họa làm lộ thơng tin.......................................................21
1.5.6. Nhóm hiểm họa tấn cơng logic.........................................................22
1.6. Quy trình xây dựng ứng dụng web an tồn..................................................23
1.7. Câu hỏi ôn tập..............................................................................................25
Chương 2. Các tấn công ứng dụng web thường gặp và cách phịng tránh...26
2.1. Tấn cơng XSS..............................................................................................26
2.1.1. Ví dụ về XSS.....................................................................................26
2.1.2. Phân loại XSS...................................................................................29
2.1.3. Khả năng của XSS.............................................................................33
2.1.4. Phịng chống XSS.............................................................................35
2.2. Tấn cơng CSRF............................................................................................39
2.2.1. Ví dụ về CSRF..................................................................................40
2.2.2. Phịng chống CSRF...........................................................................42
2.2.3. Tự bảo vệ mình trước CSRF.............................................................48
ii
2.3. Tấn cơng SQL Injection...............................................................................49
2.3.1. Ví dụ về SQL Injection.....................................................................49
2.3.2. Xác định phiên bản DBMS được dùng trên website.........................52
2.3.3. Kỹ thuật khai thác dữ liệu thơng qua tốn tử UNION......................56
2.3.4. Kỹ thuật khai thác thông qua các câu lệnh điều kiện........................63
2.3.5. Kỹ thuật khai thác dữ liệu với Blind SQL Injection.........................66
2.3.6. Kỹ thuật vượt qua các bộ lọc tham số đầu vào.................................66
2.3.7. Một tấn công SQL Injection trên thực tế...........................................69
2.3.8. Phòng chống SQL Injection ở mức xây dựng ứng dụng...................75
2.3.9. Phòng chống SQL Injection ở mức nền tảng hệ thống.....................79
2.4. Tấn công từ chối dịch vụ..............................................................................79
2.4.1. Khái niệm và dạng thức tấn công từ chối dịch vụ.............................79
2.4.2. Các dạng tấn công từ chối dịch vụ....................................................80
2.4.3. Tấn công từ chối dịch vụ phân tán....................................................86
2.4.4. Phịng chống tấn cơng từ chối dịch vụ..............................................90
2.5. Một số tấn công khác...................................................................................90
2.5.1. Tấn công Path Traversal....................................................................90
2.5.2. Tấn công Content Spoofing..............................................................91
2.6. Câu hỏi ôn tập..............................................................................................93
Chương 3. Xây dựng ứng dụng web an toàn...................................................94
3.1. Quản lý tài khoản người dùng......................................................................94
3.1.1. Quy định về thông tin định danh và xác thực...................................94
3.1.2. Quản lý mật khẩu..............................................................................96
3.1.3. Cơ chế phục hồi mật khẩu...............................................................100
3.2. Xác thực và phân quyền người dùng.........................................................102
3.2.1. Xác thực người dùng.......................................................................103
3.2.2. Chống tấn cơng dị mật khẩu...........................................................105
3.2.3. Phân quyền người dùng...................................................................107
3.3. Quản lý trạng thái phiên làm việc..............................................................110
3.3.1. Vấn đề ghi nhớ trạng thái................................................................110
3.3.2. Quản lý trạng thái phía client sử dụng cookie.................................112
3.3.3. Quản lý trạng thái phía server sử dụng session...............................117
3.4. Mã hóa dữ liệu nhạy cảm...........................................................................122
iii
3.4.1. Bảo vệ dữ liệu bằng giao thức HTTPS............................................123
3.4.2. Khả năng mật mã của các ngơn ngữ lập trình web.........................126
3.4.3. Bảo vệ mật khẩu của người dùng trên server..................................129
3.4.4. Bảo vệ các dữ liệu khác trên server.................................................131
3.5. Lọc dữ liệu người dùng..............................................................................133
3.5.1. Xác định các nguồn nhập dữ liệu....................................................134
3.5.2. Chiến lược phòng thủ khi xây dựng ứng dụng web........................137
3.5.3. Kỹ thuật lọc dữ liệu người dùng.....................................................141
3.5.4. Công cụ lọc dữ liệu người dùng......................................................143
3.5.5. Hạn chế tối đa tác động của dữ liệu người dùng.............................146
3.6. Bảo vệ cơ sở dữ liệu...................................................................................148
3.6.1. Lựa chọn vị trí an tồn cho DBMS.................................................148
3.6.2. Hạn chế bề mặt tấn công.................................................................150
3.6.3. Cấp phép truy cập dữ liệu với đặc quyền tối thiểu..........................150
3.6.4. Cập nhật DBMS..............................................................................150
3.6.5. Phòng chống tấn công SQL Injection..............................................150
3.7. Nội dung thực hành....................................................................................151
3.8. Câu hỏi ôn tập............................................................................................151
Chương 4. Triển khai và vận hành an toàn ứng dụng web..........................152
4.1. Những yếu tố đảm bảo an toàn ứng dụng web..........................................152
4.2. Đánh giá an toàn ứng dụng web.................................................................154
4.3. Cấu hình an tồn cho máy chủ web...........................................................156
4.3.1. Cấu hình an tồn cho IIS.................................................................156
4.3.2. Cấu hình an tồn cho Apache..........................................................160
4.4. Bảo vệ máy chủ web..................................................................................167
4.4.1. Mơ hình bảo vệ máy chủ web.........................................................167
4.4.2. Cân bằng tải.....................................................................................171
4.4.3. Vượt qua lỗi.....................................................................................176
4.5. Nội dung thực hành....................................................................................177
4.6. Câu hỏi ôn tập............................................................................................177
Tài liệu tham khảo..............................................................................................178
iv
DANH MỤC TỪ VIẾT TẮT
ACL
Access Control List
ASP
Active Server Pages
CAPTCHA
Completely Automated Public Turing test to tell Computers and
Humans Apart
CSRF
Cross-Site Request Fogery
DBMS
Data Base Management System
DDoS
Distributed Denial of Service
DLL
Dynamic-link Library
DOM
Document Object Model
DoS
Denial of Service
IIS
Internet Information Service
IRC
Internet Relay Chat
OSI
Open System Interconnection
OTP
One Times Password
OWASP
Open Web Application Security Project
PHP
Personal Home Page (old), Hypertext Preprocessor (new)
PoD
Ping of Death
RFC
Request For Comment
SQL
Structed Query Language
URL
Uniform Resource Locator
WAMP
Windows, Apache, MySQL, PHP
XSRF
Cross-Site Request Fogery
XSS
Cross-Site Scripting
v
LỜI NĨI ĐẦU
Xu thế tin học hóa xã hội đã có từ nhiều thập kỉ qua, đến nay vẫn diễn ra
mạnh mẽ. Rất nhiều dịch vụ thương mại và hành chính đã được cung cấp trực
tuyến. Nhiều quốc gia trên thế giới, trong đó có Việt Nam, đã và đang nỗ lực
trong việc xây dựng chính phủ điện tử. Ngày nay, mạng Internet đã lan tỏa khắp
các ngõ ngách trên thế giới; các dịch vụ Internet cũng đã đi sâu vào đời sống xã
hội Việt Nam. Ngày nay, thông qua Internet, mà cụ thể là thông qua World Wide
Web, chúng ta có thể tiếp cận được các dịch vụ như thơng tin, giải trí, giao tiếp
với người thân, học tập, mua sắm, giao dịch ngân hàng... Sự tiện lợi của Internet
đã khiến nó trở thành một phần khơng thể thiếu đối với một bộ phận đông đảo
người dân. Tuy nhiên, trong mấy năm vừa qua, rất nhiều website trên Internet bị
tấn công, gây ra những thiệt hại nặng nề cho các cá nhân, tổ chức và chính phủ.
Điều này đã gióng lên hồi chng cảnh báo về nguy cơ mất an tồn khi tham gia
vào mạng máy tính tồn cầu này. Nhưng xu thế tin học hóa xã hội là khơng thể
cưỡng lại, việc càng ngày càng có nhiều dịch vụ được đưa lên Internet là điều tất
yếu vì những lợi ích to lớn mà nó mang lại. Vấn đề đặt ra là phải đảm bảo an
toàn cho cả người dùng và nhà cung cấp dịch vụ khi tham gia vào môi trường
trực tuyến.
Hầu hết các dịch vụ trực tuyến hiện nay đều được cung cấp bởi các ứng
dụng web, Học viện Kỹ thuật mật mã đã quyết định đưa học phần "Xây dựng
ứng dụng we an toàn" vào chương trình đào tạo Kĩ sư an tồn thơng tin. Học
phần này sẽ giúp sinh viên nắm bắt được các hiểm họa an toàn đối với ứng dụng
web, bản chất và cách thực hiện cũng như cách thức phòng tránh các tấn công
lên ứng dụng web, cách thức xây dựng một ứng dụng web an toàn với khả năng
chống lại các tấn công, và những vấn đề quan trọng trong triển khai và vận hành
để đảm bảo an toàn cho ứng dụng web. Để tiếp thu hiệu quả kiến thức của học
phần này, sinh viên cần có kiến thức căn bản về lập trình ứng dụng web, đặc biệt
là sử dụng ngơn ngữ PHP và ASP.NET.
Học phần này cịn mới ở Việt Nam, giáo trình lại được biên soạn trong
thời gian hạn chế nên khơng thể tránh khỏi những thiếu sót. Rất mong nhận
được ý kiến đóng góp của đồng nghiệp và tồn thể bạn đọc để chúng tơi có thể
hồn thiện giáo trình này.
CÁC TÁC GIẢ
vi
CHƯƠNG 1. GIỚI THIỆU CHUNG VỀ
XÂY DỰNG ỨNG DỤNG WEB AN TOÀN
1.1. ỨNG DỤNG WEB
Tiền thân của mạng Internet ngày nay là mạng ARPANET được xây dựng
vào năm 1969 theo u cầu của bộ quốc phịng Mỹ. Ban đầu, nó được sử dụng
để liên kết 4 địa điểm là: Viện nghiên cứu Stanford, Đại học California ở Los
Angeles, Đại học Utah và Đại học California ở Santa Barbara. Và đó cũng
chính là mạng diện rộng (Wide Area Network - WAN) đầu tiên được xây dựng.
Khi đó, ARPANET được các nhà khoa học nghiên cứu xây dựng nhằm phục vụ
mục đích quân sự. Nhưng về sau, mạng liên lạc này nhanh chóng phát triển, nó
được sử dụng cho cả mục đích khoa học. Vào năm 1973, phạm vi kết nối của nó
đã vươn ra khỏi biên giới nước Mỹ, sang đến nước Anh và Na Uy. Vào cuối
những năm 70, nhiều giao thức truyền tin đã được xây dựng để sử dụng trong
mạng ARPNET, những giao thức này được chuẩn hóa vào những năm 19811982. Vào ngày 01/01/1983, hoạt động của mạng ARPANET được chuyển từ
giao thức NCP sang giao thức TCP/IP và giao thức TCP/IP đã được sử dụng từ
đó cho đến nay. Cũng chính trong năm 1983, người ta bắt đầu gọi ARPANET là
Internet.
Tuy nhiên, vào năm 1984, một đối thủ của ARPANET đã xuất hiện, đó là
mạng NFSNet được xây dựng bởi Quỹ khoa học quốc gia Mỹ (NSF - National
Science Foundation). Mạng này được cấu thành từ nhiều mạng nhỏ, kết nối các
trường đại học với nhau. Trong vịng năm có khoảng 10 nghìn máy tính đã kết
nối vào mạng này. Điều đó khiến cho NSFNet có băng thông lớn hơn hẳn so với
ARPANET, và tên gọi "Internet" dần được chuyển từ ARPANET sang cho
1
NSFNet. Đến năm 1990 thì ARPANET hồn tồn ngừng hoạt động, nhường chỗ
cho NSFNet, tức Internet1.
World Wide Web (gọi tắt là web) chính thức xuất hiện trên Internet vào
năm 1991. Có thể nói đây là một cuộc cách mạng trên Internet vì nhờ đó mà
người ta có thể truy cập, trao đổi thông tin một cách dễ dàng. Mặc dù ra đời khá
muộn so với Internet, nhưng chính nhờ web mà Internet đã trở nên phổ biến như
ngày nay. Nhiệm vụ ban đầu của web là cung cấp thông tin, dữ liệu một cách
nhanh chóng, thuận tiện từ người có đến người cần. Cùng với sự phát triển của
khoa học công nghệ, bên cạnh việc cung cấp thông tin, dữ liệu, ngày nay web
còn cung cấp dịch vụ (dịch vụ tin học văn phòng trực tuyến, dịch vụ thư điện
tử,...) và cịn có thể đóng vai trị là mơi trường thực hiện các giao dịch thương
mại.
Nói đến web, khơng thể khơng nói đến các khái niệm: webpage, website,
web application, web server, web client và web browser.
Hình Giới thiệu chung về xây dựng ứng dụng web an toàn.1. Các thực thể trên World Wide
Web
Web server (máy chủ web) thường được dùng với hai nghĩa. Nghĩa thứ
nhất là chỉ máy tính (hoặc cụm máy tính) vật lý 2 mà trên đó website hoạt động.
1
Ở đây, tên gọi Internet phải viết hoa. Nếu viết thường (internet) thì nó có nghĩa là một liên mạng, tức
là chỉ một mạng bất kì được cấu thành từ nhiều mạng nhỏ, mà không nhất thiết chỉ mạng tồn cầu Internet.
2
Ngày nay, với sự phát triển của cơng nghệ ảo hóa thì yếu tố "vật lý" là khơng nhất thiết, thay vào đó
máy chủ web có thể là một (một số) trong nhiều máy tính ảo cùng hoạt động trên một máy tính vật lý.
2
Nghĩa thứ hai là để chỉ phần mềm (ví dụ như Apache, IIS) chạy trên máy chủ
web vật lý, tương tác trực tiếp với web client, đóng vai trị trung gian giữa web
client và website.
Web client (máy khách web) cũng có thể được dùng với hai nghĩa. Nghĩa
thứ nhất là chỉ máy tính vật lý mà từ đó người dùng truy cập tới các website.
Nghĩa thứ hai là chỉ phần mềm chạy trên máy khách web vật lý, thay mặt người
dùng gửi các truy vấn tới web server và hiển thị kết quả mà web server trả về.
Thông thường, web client là các web browser (trình duyệt web) như Firefox,
Chrome, IE, Opera... nhưng cũng có những web client khơng phải là web
browser, được xây dựng với những mục đích đặc biệt, ví dụ để tải website về
máy mà khơng hiển thị chúng, ví dụ như TeleportPro, Httrack.
Webpage là tồn bộ nội dung hiển thị trên trình duyệt web khi duyệt một
địa chỉ nhất định. Nội dung của webpage thường được xác định bởi URL mà
người dùng yêu cầu. Tuy nhiên, điều này chỉ mang tính tương đối. Ngày nay,
một phần lớn các website được xây dựng bằng công nghệ web động (dynamic
web). Khi đó, trong những điều kiện khác nhau, một URL sẽ ứng với những nội
dung khác nhau. Điều kiện ở đây có thể là: thời điểm duyệt web, tài khoản được
sử dụng để duyệt web, các thao tác mà người dùng đã thực hiện trong quá trình
duyệt web...
Website là tập hợp các webpage có chung tên miền cơ sở. Ví dụ, các
webpage sau đây đều thuộc cùng một website:
/> /> /> />Các webpage này có chung tên miền cơ sở là example.com. Một website
có thể chỉ gồm một webpage, nhưng cũng có thể gồm hàng trăm triệu webpage.
Về nội dung, một website có thể chứa nhiều thơng tin dành cho nhiều người cho
nhiều mục đích và nhu cầu khác nhau. Tuy nhiên một webpage chỉ phục vụ cho
một mục đích và/hoặc một nhu cầu cụ thể. Số lượng website trên Internet đến
cuối năm 2012 được ước tính vào khoảng 600 triệu; con số tương ứng tại năm
2010 là 255 triệu.
3
Một website có thể được xây dựng bằng ngơn ngữ HTML thuần túy (xem
mục 1.3); website có thể được xây dựng bằng những công cụ khác nhau, từ đơn
giản như Notepad đến đồ sộ như Macromedia Dreamweaver nhưng kết quả cuối
cùng là những file HTML. Trong trường hợp này, web server khơng phải thực
hiện bất kì xử lý nào, ngoại trừ việc cung cấp cho web client một cách nguyên
vẹn những file được yêu cầu. Điều đó cũng có nghĩa là trong trường hợp này,
website không thể tiếp nhận, xử lý dữ liệu từ phía người dùng; nội dung của các
webpage là khơng thay đổi. Nhưng một website cũng có thể được xây dựng
bằng ngơn ngữ lập trình. Trong trường hợp này, website chính là một ứng dụng
web. Ứng dụng web là ứng dụng chạy trên máy chủ web, đáp ứng các truy vấn
HTTP gửi tới máy chủ web. Ứng dụng web có ba đặc điểm. Trước hết, đó phải
là một ứng dụng – một chương trình có thể thực thi được. Ứng dụng đó có thể
được viết bằng ngơn ngữ lập trình thơng thường (C/C++, C#, Java, Delphi…)
hay ngơn ngữ kịch bản (PHP, ASP…). Thứ hai, nó phải thực thi trên máy chủ
web. Và thứ ba, nó phải tiếp nhận, xử lý và đáp ứng các truy vấn HTTP gửi tới
máy chủ web. Tương tự như một ứng dụng thơng thường, một ứng dụng web có
thể gồm một hoặc nhiều "chương trình" (mỗi chương trình là một file có thể
thực thi được) có quan hệ tương hỗ vơi nhau.
1.2. GIAO THỨC HTTP
Giao thức cơ bản và chính yếu để web client (thường là trình duyệt) và
web server giao tiếp với nhau là HTTP. HTTP là viết tắt của HyperText Transfer
Protocol, tức Giao thức truyền tải siêu văn bản. Nó là một giao thức tầng ứng
dụng trong bộ giao thức TCP/IP, được mô tả chi tiết trong các RFC 1945 1, RFC
26162 và một số RFC khác. HTTP là một giao thức đơn giản, ban đầu được phát
triển để truyền tải những văn bản tĩnh. Về sau, nó được mở rộng để hỗ trợ những
ứng dụng phức tạp hơn.
HTTP hoạt động theo mơ hình dựa trên thơng điệp (message-based
model), theo đó máy khách gửi tới máy chủ một thơng điệp truy vấn (request
message) và máy chủ gửi lại cho máy khách một thông điệp phản hồi (response
message). HTTP là giao thức không trạng thái (stateless), tức là trong giao thức
1
2
/> />
4
này khơng có cơ chế ghi nhớ kết quả của các truy vấn trước, khi thực hiện các
truy vấn sau.
1.2.1. Truy vấn HTTP
Mọi thông điệp HTTP (cả truy vấn và phản hồi) đều chứa một hoặc nhiều
tiêu đề (header). Mỗi tiêu đề được ghi trên một dòng. Sau tiêu đề là phần thân
(body) của thơng điệp. Phần thân có thể có hoặc khơng. Nếu có thì nó được phân
cách với phần tiêu đề bởi một dòng trống. Một truy vấn HTTP điển hình có dạng
như sau:
Ví dụ 1.1. Truy vấn HTTP điển hình
GET /auth/488/YourDetails.ashx?uid=129&group=admin HTTP/1.1
Accept: application/x-ms-application, image/jpeg,
application/xaml+xml, image/gif, image/pjpeg, application/xms-xbap, application/x-shockwave-flash, */*
Referer: />Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;
WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR
3.5.30729; .NET CLR 3.0.30729; .NET4.0C; InfoPath.3; .NET4.0E;
FDM; .NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: mdsec.net
Connection: Keep-Alive
Cookie: SessionId=5B70C71F3FD4968935CDB6682E545476
Dòng đầu tiên (tiêu đề thứ nhất) là bắt buộc. Tiêu đề này có ba phần, được
phân tách bởi dấu cách. Phần thứ nhất cho biết phương thức truy vấn. Trong ví
dụ trên, phương thức được sử dụng là GET. Đó cũng là phương thức thơng dụng
nhất, và ý nghĩa của nó là để yêu cầu tài nguyên từ web server. Phương thức
GET khơng địi hỏi truy vấn phải có phần thân, tức là truy vấn chỉ bao gồm các
tiêu đề. Các phương thức HTTP sẽ được trình bày trong mục 1.2.3. Phần thứ hai
(/auth/488/YourDetails.ashx?uid=129&group=admin) là URL được yêu cầu.
Thông thường, URL này gồm đường dẫn tới một tài nguyên
(/auth/488/YourDetails.ashx)
và
một
chuỗi
các
tham
số
(?
uid=129&group=admin) mà web client gửi tới web server. Chuỗi tham số bắt
đầu bằng dấu chấm hỏi (?) và các tham số được phân cách bởi dấu và (&). Mỗi
tham số gồm tên của tham số và giá trị tương ứng của nó được phân tách bởi dấu
bằng (=). Trong ví dụ trên, tham số uid có giá trị '129', cịn tham số group
có giá trị là 'admin'. Phần thứ ba cho biết phiên bản của giao thức HTTP mà
5
web client sử dụng. Hiện nay có hai phiên bản được dùng phổ biến trên Internet
là 1.0 và 1.1, trong đó hầu hết trình duyệt web theo mặc định đều sử dụng phiên
bản 1.1. Ở nước ta, theo thông tư số 01/2011/TT-BTTTT của Bộ trưởng Bộ
Thông tin và Truyền thông về việc Công bố Danh mục tiêu chuẩn kỹ thuật về
ứng dụng công nghệ thông tin trong cơ quan nhà nước thì các hệ thống cơng
nghệ thơng tin trong cơ quan nhà nước bắt buộc phải hỗ trợ HTTP v1.1 khi thực
hiện truyền siêu văn bản. Giữa các phiên bản 1.0 và 1.1 có một số điểm khác
biệt, nhưng xét từ quan điểm bảo vệ ứng dụng web thì điểm khác biệt duy nhất
đáng quan tâm là trong phiên bản 1.1 truy vấn HTTP phải có một tiêu đề bắt
buộc nữa là Host.
Ngồi ra, có thể điểm qua một số tiêu đề đáng quan tâm trong ví dụ trên
đây như sau.
Tiêu đề Referer cho biết điểm xuất phát của truy vấn. Ví dụ, nếu người
dùng đang xem một webpage và nhấn chuột lên một đường liên kết trên
webpage đó thì sẽ có một truy vấn HTTP được phát sinh và dòng tiêu đề
Referer sẽ chứa URL của webpage mà người dùng đang xem. Trong ví dụ
trên, URL này là />Tiêu đề Cookie được dùng để đệ trình các tham số mà giá trị của chúng
được web server gửi cho web client trước đó. Vấn đề này sẽ được xem xét cụ
thể ở mục 1.2.4.
1.2.2. Phản hồi HTTP
Phản hồi HTTP là một thông điệp mà web server trả lời cho một truy vấn
từ web client. Nó cũng bao gồm các dịng tiêu đề và phần thân. Phần thân dược
phân tách với phần tiêu đề bởi một dòng trống. Một phản hồi HTTP điển hình có
dạng như sau:
Ví dụ 1.2. Phản hồi HTTP điển hình
HTTP/1.1 200 OK
Date: Tue, 19 Apr 2011 09:23:32 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc
X-AspNet-Version: 2.0.50727
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
6
Content-Type: text/html; charset=utf-8
Content-Length: 1067
“ xmlns=” />><head><title>Your details</title>
...
Dòng đầu tiên của mọi phản hồi HTTP bao gồm ba phần được phân tách
bởi dấu cách. Phần thứ nhất cho biết phiên bản của giao thức HTTP được sử
dụng. Phiên bản này tất nhiên không được mới hơn phiên bản mà web client yêu
cầu trong truy vấn. Phần thứ hai là mã kết quả truy vấn. Giá trị thường gặp nhất
của mã này là 200, tức là truy vấn thành công và nội dung của phản hồi này là
câu trả lời cho truy vấn. Phần thứ ba là chuỗi kí tự mơ tả trạng thái của phản
hồi, thường là lời giải thích cho mã kết quả truy vấn. Hiện nay, mọi trình duyệt
đều bỏ qua phần thứ ba này, do đó nó có thể nhận giá trị bất kì.
Hầu hết mọi phản hồi HTTP đều có phần thân. Nội dung của tiêu đề
Content-Type cho biết định dạng dữ liệu của phần thân. Trong ví dụ trên,
nội dung của phần thân là một trang HTML sử dụng bộ mã UTF8. Tiêu đề
Content-Lenght cho biết độ dài (tính bằng byte) của thân phản hồi.
Tiêu đề Set-Cookie dùng để thiết lập giá trị cookie mới cho web
client. Giá trị này sẽ được web client gửi lại cho web server trong truy vấn kế
tiếp.
1.2.3. Phương thức HTTP
Giao thức HTTP quy định nhiều phương thức truy vấn khác nhau. Trong
đó hai phương thức được dùng phổ biến nhất là GET và POST.
Phương thức GET được sử dụng để yêu cầu tài nguyên. Các tham số nếu
có được ghi trong URL truy vấn. Điều này khiến ta có thể đánh dấu (bookmark)
URL của một tài nguyên động để gọi lại về sau. Các URL có thể được đánh dấu
(bookmark) để dùng lại, có thể được lưu trong lịch sử duyệt web, lưu lại trong
nhật ký của web server, có thể được gửi tới các web server bên ngồi thơng qua
tiêu đề Referer (xem Ví dụ 1.1.) nếu một webpage chứa đường liên kết tới
trang khác. Chính vì thế, khơng được dùng phương thức GET khi cần truyền dữ
liệu nhạy cảm tới web server. Thay vào đó, cần dùng phương thức POST.
7
Theo thiết kế, phương thức POST được sử dụng để thực hiện các hành
động. Các tham số có thể được truyền qua URL và cả qua thân truy vấn. Các
tham số được truyền trong thân truy vấn sẽ không bị lưu lại trong các kí hiệu
đánh dấu (bookmark), trong lịch sử duyệt web và không bị thể hiện trong tiêu đề
Referer. Như thế, phương thức POST cần được dùng thay cho GET khi cần
gửi những thông tin nhạy cảm đến web server.
Bên cạnh hai phương thức thông dụng là GET và POST thì giao thức
HTTP cịn định nghĩa các phương thức khác như HEAD, TRACE, OPTIONS và
PUT.
1.2.4. Cookie và Session
1.2.4.1.Cookie
Cookie là một phần thiết yếu của giao thức HTTP và được sử dụng bởi đa
phần ứng dụng web. Và cũng chính cookie là đối tượng thường bị lợi dụng để
khai thác các điểm yếu bảo mật. Cookie là cơ chế để web server gửi các dữ liệu
khác nhau tới web client; web client phải lưu trữ những giá trị này và sau đó tự
động đệ trình trở lại web server mỗi khi thực hiện truy vấn. Trên trình duyệt của
người dùng, giá trị cookie được thiết lập riêng cho từng domain (hoặc
subdomain), và khi thực hiện truy vấn tới một domain (subdomain) nào đó, trình
duyệt chỉ đệ trình giá trị cookie ứng với domain (subdomain) đó.
Web server thiết lập giá trị cookie thông qua tiêu đề Set-Cookie trong
phản hồi HTTP. Cookie bao gồm một hoặc nhiều cặp name=value, nhưng mỗi
cặp như thế có thể được thay bởi một chuỗi kí tự bất kì khơng có dấu cách. Các
cặp name=value khác nhau có thể được thiết lập trong các tiêu đề SetCookie khác nhau, hoặc trong cùng một tiêu đề. Nếu thiết lập nhiều cặp trong
cùng một tiêu đề Set-Cookie thì các cặp được phân tách bởi dấu chấm phẩy.
Set-Cookie: cf=somestring
Set-Cookie: btzh=89Tvp99;path=/forum
Cịn web client đệ trình cookie thơng qua tiêu đề Cookie. Tất cả các cặp
name=value của cookie được đệ trình trong cùng một tiêu đề và được phân
tách bằng dấu chấm phẩy:
Cookie: cf=somestring;btzh=89Tvp99;path=/forum
8
Ngoài các cặp name=value sẽ được web client lưu trữ và đệ trình trở lại
web server thì trong tiêu đề Set-Cookie có thể có những thuộc tính dùng để
quy định việc sử dụng cookie trên web client.
Thuộc tính expires quy định thời hạn có hiệu lực của cookie. Trình
duyệt sẽ lưu trữ cookie và sử dụng nó cho đến ngày được quy định
trong thuộc tính này. Nếu thuộc tính expires khơng được thiết lập thì
cookie chỉ có giá trị trong một phiên làm việc.
Thuộc tính domain cho biết domain mà cookie này có hiệu lực.
Domain này phải trùng với chính domain đã gửi cookie hoặc là domain
cấp trên của nó.
Thuộc tính path chỉ ra đường dẫn URL mà cookie có hiệu lực.
Nếu thuộc tính secure được bật thì cookie chỉ được gửi đi trong các
truy vấn HTTPS.
Nếu thuộc tính HttpOnly được bật thì khơng thể truy xuất trực tiếp
đến cookie bằng các đoạn mã JavaScript.
Như vậy, cookie có thể được sử dụng để tổ chức phiên làm việc cho người
dùng web. Tuy nhiên, khi đó giữa web server và web client có thể phải truyền
qua lại liên tục một lượng lớn các tham số, trong đó có thể chứa những thơng tin
nhạy cảm. Điều bất tiện này có thể được giải quyết nhờ vào sử dụng session
(phiên làm việc).
1.2.4.2.Session
Trên thực tế, session (phiên làm việc) khơng phải là một thành phần của
giao thức HTTP. Nói cách khác, giao thức HTTP chỉ quy định về cookie mà
khơng quy định về session. Thay vào đó, các ngơn ngữ lập trình web (PHP, JSP,
ASP...) sử dụng cookie để hỗ trợ tính năng quản lý session. Mặt khác, session
vẫn có thể được hỗ trợ ngay cả khi khơng sử dụng cookie hoặc khi tính năng
cookie bị người dùng vơ hiệu hóa.
Session là cách đơn giản để lưu trữ một biến và khiến biến đó có thể được
sử dụng khi người dùng duyệt từ webpage này sang webpage khác. Đối với các
biến thơng thường (khai báo trong mã chương trình của ứng dụng web), khi ứng
dụng được thực thi, các biến đó sẽ được cấp phát bộ nhớ; và sau khi ứng dụng
kết thúc thì vùng nhớ sẽ được thu hồi.
9
Ví dụ 1.3. Sử dụng biến thơng thường
//File name: hello.php
$name = $_REQUEST ['name'];
?>
<html>
<body>
Hello, <?php echo $name; ?>!
</body>
</html>
Trong ví dụ trên đây, mỗi khi file hello.php được thực thi, biến
$name sẽ được cấp phát mới bộ nhớ, được gán giá trị là giá trị của tham số
name mà người dùng gửi đến server; khi file hello.php thực thi xong thì
biến $name được giải phóng, tức vùng nhớ đã cấp cho nó trước đó bị thu hồi.
Nói cách khác, giá trị của biến $name trong các lần gọi file hello.php khác
nhau là hoàn toàn độc lập với nhau; đồng thời giá trị đó chỉ được sử dụng trong
file hello.php mà khơng thể sử dụng trong bất kì file nào khác.
Session sẽ khác, nó có thể được tạo ra, tồn tại trên server, được sử dụng
xuyên suốt từ truy vấn này sang truy vấn khác, chỉ mất đi khi có yêu cầu xóa nó
hoặc hết thời hạn có hiệu lực, hoặc khi đóng trình duyệt. Session khơng phải là
một biến mà là một tập hợp có thể mở rộng các biến được lưu trong một file với
tên ngẫu nhiên, khó đốn trên máy chủ. Mỗi session được xác định bởi một định
danh, gọi là session ID – cũng là một giá trị khó đốn. Chính giá trị của session
ID được truyền qua lại giữa web server và web client để duy trì phiên làm việc.
Giá trị session ID thường được truyền dưới dạng cookie và theo mặc định không
được web client ghi nhớ, vì thế, khi đóng web client (trình duyệt) thì giá trị này
trên máy người dùng sẽ mất, người dùng không thể tiếp tục phiên làm việc cũ.
Trong trường hợp trình duyệt khơng hỗ trợ cookie hoặc tính năng cookie bị vơ
hiệu hóa thì session ID có thể được truyền đi dưới dạng tham số của URL.
Ứng dụng điển hình của session là để duy trì trạng thái đăng nhập của
người dùng. HTTP là giao thức khơng có trạng thái. Do đó, nếu khơng có một
cơ chế đặc biệt để duy trì trạng thái đăng nhập thì người dùng sẽ phải thực hiện
xác thực mỗi khi thực hiện một truy vấn HTTP. Session chính là giải pháp hiệu
quả để giải quyết vấn đề này, dù rằng vấn đề cũng có thể được giải quyết bằng
cách sử dụng cookie.
Việc quản lý phiên làm việc sẽ được trình bày cụ thể ở mục 3.3, trang 113.
10
1.2.5. HTTPS
Khi sử dụng giao thức HTTP, dữ liệu được truyền đi dưới dạng rõ (khơng
được mã hóa), do vậy có thể bị chặn bắt và đọc bởi kẻ tấn công trên đường
truyền. Để khắc phục vấn đề này, người ta xây dựng giao thức HTTPS. Đó cũng
là một giao thức ở tầng ứng dụng, nhưng được xây dựng bên trên giao thức giao
vận an toàn TLS/SSL (Transport Layer Security/Secure Socket Layer) thay vì
TCP. Khi sử dụng giao thức HTTPS các truy vấn HTTP và phản hồi HTTP hồn
tồn khơng có gì thay đổi; chỉ có một sự thay đổi ở tầng bên dưới, đó là dữ liệu
được truyền tải bằng giao thức SSL.
1.3. NGÔN NGỮ HTML VÀ CÁC THÀNH PHẦN CỦA TRANG WEB
Ngôn ngữ đánh dấu siêu văn bản (HTML – HyperText Markup Language)
là ngôn ngữ được sử dụng để quy định cách hiển thị nội dung của một webpage.
HTML được phát triển và chuẩn hóa bởi (W3C – World Wide Web Consortium).
Dưới đây là một ví dụ nhỏ về mã của một webpage. Đoạn mã này được lưu
trong file index.html.
Ví dụ 1.4. Mã của một trang HTML đơn giản
<!-- FileName: index.html -->
<html>
<head>
<title>Một trang HTML</title>
</head>
<body>
Tiêu đề được căn giữa
Đây là một đường siêu liên kết (hyperlink):
nhưng được soạn theo quy cách của ngôn ngữ HTML. Đặc trưng dễ thấy là
trong file này có sử dụng các thẻ (HTML tags). Thẻ HTML thường đi theo cặp,
gồm thẻ mở và thẻ đóng. Ví dụ, để xác định tiêu đề của webpage, người ta dùng
của webpage, người ta dùng thẻ mở <body> và thẻ đóng </body>. Mỗi
thẻ/cặp thẻ HTML lại có các thuộc tính khác nhau. Việc xem xét các thẻ HTML,
khác, bao gồm tài liệu trên website />Mặc dù nội dung của file index.html chỉ là văn bản thuần túy, nhưng
thiệu chung về xây dựng ứng dụng web an tồn.2).
Hình Giới thiệu chung về xây dựng ứng dụng web an toàn.2. Thể hiện của trang HTML bởi
thực hiện không phải một mà là hai truy vấn tới web server. Bằng cơng cụ HTTP
Giới thiệu chung về xây dựng ứng dụng web an toàn.3). Truy vấn thứ nhất là để
tải về nội dung của chính file index.html. Sau khi tải và phân tích nội dung
như trên Hình Giới thiệu chung về xây dựng ứng dụng web an tồn.2.
Hình Giới thiệu chung về xây dựng ứng dụng web an toàn.3. Các truy vấn tới web server khi
hết sẽ tải về một đoạn mã HTML (theo yêu cầu của người dùng). Sau đó, căn cứ
cầu của người dùng) tải về các thành phần cần thiết khác. Ngoài thành phần hình
nhúng (*.swf)... và nhiều thành phần khác.
1.4. NGƠN NGỮ LẬP TRÌNH WEB
(Common Gateway Interface). Các chương trình CGI cung cấp một sự liên hệ
trình duyệt. Các chương trình CGI có thể được viết bằng bất cứ ngơn ngữ lập
shell…). Máy chủ web sử dụng CGI như là một cổng truy cập chặn giữa yêu cầu
của người dùng và dữ liệu được yêu cầu. Nó sẽ được nạp vào bộ nhớ như một
chương trình bình thường. Thơng thường các máy chủ web sẽ chuyển các yêu
cầu và triệu gọi chương trình CGI. Sau khi chương trình kết thúc, máy chủ web
sẽ đọc dữ liệu trả về từ chương trình và gửi nó đến trình duyệt web.
Nhược điểm lớn nhất của kỹ thuật CGI là nó hoạt động kém hiệu quả.
Mỗi khi máy chủ web nhận một yêu cầu, một tiến trình mới lại được tạo ra. Mỗi
lẫn nhau, do đó gây ra lãng phí bộ nhớ. Để khắc phục nhược điểm này,
cho phép chia sẻ mã lệnh giữa các tiến trình. Đây chính là các kỹ thuật ISAPI và
NSAPI.
như bảo trì mã lệnh trở nên vất vả hơn bao giờ hết.
đoạn Script, các thành phần xử lý phía server trong cùng một file. Kỹ thuật được
gọi là ASP (Active Server Pages), với phiên bản mới nhất hiện nay là ASP.NET 1.
Ngơn ngữ lập trình được sử dụng là VBScript, Jscript và C#. ASP được triệu gọi
Internet Information Service). Về bản chất, có thể coi ASP như là một ngơn ngữ
thơng dịch. Một trang ASP có thể sử dụng HTML, JScript và VBScript; trong
ASP.NET có thể sử dụng C#. Qua các đoạn mã nhúng này, ASP có thể truy cập
đến các thành phần phía server. Các thành phần này có thể được viết trên bất kỳ
Ý kiến khác cho rằng ASP.NET không phải là một ngơn ngữ lập trình mà là một nền tảng phát triển
ứng dụng (Framework), bởi vì mã của ứng dụng web có thể được viết bằng C# hoặc Visual Basic .NET. Ngồi
ra, ASP.NET khơng phải là phiên bản kế tiếp của ASP mà là một công nghệ xây dựng ứng dụng web hoàn toàn
mới, bởi ứng dụng web ASP chỉ gồm những đoạn mã kịch bản (script), trong khi ASP.NET hỗ trợ các ngơn ngữ
lập trình đầy đủ tính năng (full-feature programming language) là C# và Visual Basic .NET. Tuy nhiên, trong
giáo trình này, để đơn giản, ta chấp nhận quan điểm coi ASP.NET như một ngôn ngữ lập trình, bởi điều này
khơng ảnh hưởng đến nội dung giáo trình.
ngôn ngữ nào hỗ trợ các thành phần COM của Microsoft. Và đây chính là sức
với các thành phần COM. Sau khi được thi hành, ASP sẽ sản sinh ra một trang
Web có khn dạng HTML và trả nó về cho Web server.
trên máy chủ web của Microsoft. Các nhà phát triển đang nghiên cứu các giải
hiếm được sử dụng trong thực tế.
Một ngơn ngữ lập trình nữa phải kể đến là Java Server Pages hay JSP.
để gửi về trình duyệt web. Việc giao tiếp với trình duyệt web được thực hiện
HttpServletResponse. Ứng dụng web viết bằng JSP sẽ được biên dịch thành
bytecode trước khi thực thi. Nhược điểm chính của JSP là phải đi kèm với máy
ảo Java, vốn khơng được đánh giá cao về mặt tốc độ.
Ví dụ 1.5. Một đoạn mã viết bằng JSP
Preprocessor). Vào khoảng năm 1994, Rasmus Lerdorf đưa một số đoạn Perl
script vào các webpage để theo dõi xem ai đang đọc tài liệu của mình. Dần dần,
có tên là "Personal Home Pages" (nghĩa đầu tiên của PHP). Từ đó đến nay, PHP
đã phát triển nhanh chóng. Đội ngũ các nhà phát triển (Rasmus Lerdorf, Andi
cách viết các module cho nó. Cấu trúc của ngơn ngữ đã được tinh chế, được kết
hay các ngôn ngữ hướng thủ tục. Nếu đã biết một vài ngơn ngữ lập trình khác thì
việc tìm hiểu PHP sẽ rất đơn giản.
dụng trong hơn 244 triệu website. PHP là ngôn ngữ thông dịch, mã nguồn mở và
nghiệp [31].
1.5. HIỂM HỌA AN TỒN ỨNG DỤNG WEB
hiểm họa an tồn ứng dụng web. Theo kết quả năm 2010 [32, 118], tất cả các
1. Authentication (xác thực)
2. Authorization (trao quyền)
3. Client-side Attacks (tấn công lên máy khách)
4. Command Execution (thực thi câu lệnh)
5. Information Disclosure (làm lộ thông tin)
6. Logical Attacks (tấn cơng logic)
1.5.1. Nhóm hiểm họa xác thực
dụng để xác thực người dùng, dịch vụ hay ứng dụng khác. Như đã biết, việc xác
"cái gì đó mà chỉ người dùng có" (thẻ từ, smartcard, token,...), "cái gì đó mà chỉ
người dùng" (vân tay, giọng nói, võng mạc...). Trong trường hợp ứng dụng web,
việc xác thực người dùng thường được thực hiện bằng mật khẩu. Khi đó, có
pháp nào đó (bao gồm phương pháp vét cạn) dò ra mật khẩu người dùng.
khơng cần có thông tin xác thực.
công có thể lấy được hoặc thay đổi mật khẩu của người dùng. Đa phần các
câu hỏi riêng tư nào đó như tên con vật ni đầu tiên, tên ngôi trường đầu tiên...
triển mạng xã hội như ngày nay. Tức là kẻ tấn cơng có nhiều khả năng thành
cơng trong việc đoán ra câu trả lời cho những câu hỏi như thế.
1.5.2. Nhóm hiểm họa trao quyền
hay khơng. Nhiều website phân chia người dùng thành các nhóm khác nhau, và
người dùng thuộc các nhóm khác nhau được trao những quyền khác nhau. Ví dụ,
users... Trong đó người dùng thuộc nhóm users chỉ được phép sửa/xóa bài viết
viết của bất kì ai trong chuyên mục mà mình phụ trách.
có quyền thực hiện. Các hiểm họa an tồn thơng tin liên quan đến cơ chế trao
(session ID). Nếu có thể đốn được session ID của người dùng nào đó thì có thể
sử dụng ID đó với để làm việc với server trong giới hạn quyền của nạn nhân.
Hình Giới thiệu chung về xây dựng ứng dụng web an tồn.4. Ví dụ về định danh dễ bị đốn
(username hay user ID) [57]. Nếu xác định được mối quan hệ này, kẻ tấn cơng
dùng đó để thực hiện các hành động trên server.
là khơng có quyền thực hiện (mà không cần leo thang đặc quyền).
hiệu lực hoặc xác định thời hạn có hiệu lực của phiên làm việc quá dài, thông tin
phép.
làm việc với web server với tồn bộ quyền hạn của nạn nhân.