Nhưng một trong những đối tượng quan trọngnhất của sự an toàn và bảo mật Internet chính là các máy chủ Web Web server, nơi cómột số lượng rất lớn các tương tác trực tiếp với người sử dụn
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
Tel (84-511) 736 949, Fax (84-511) 842 771Website: itf.ud.edu.vn, Mail: cntt@edu.ud.vn
LUẬN VĂN TỐT NGHIỆP KỸ SƯ
NGÀNH CÔNG NGHỆ THÔNG TIN
MÃ NGÀNH : 05115
ĐỀ TÀI : TÌM HIỂU MỘT SỐ LỖI BẢO MẬT VÀ PHƯƠNG PHÁP KHẮC PHỤC LỖI BẢO MẬT CỦA CÁC ỨNG DỤNG TRÊN PHP
Mã số : 06T1-039 Ngày bảo vệ : 15-16/06/2011
SINH VIÊN : TRẦN QUỐC THẮNG LỚP : 06T1
CBHD : PGS.TS VÕ TRUNG HÙNG
ĐÀ NẴNG, 06/2011
Trang 2Với tình cảm chân thành nhất, cho phép em được bày tỏ lòng biết ơn sâu sắc đến tất cả các cá nhân, đơn vị đã tạo điều kiện thuận lợi, giúp đỡ
em trong suốt quá trình học tập và thực hiện đồ án đồ án tốt nghiệp này.
Đầu tiên em xin bày tỏ lòng biết ơn sâu sắc đến quý thầy, cô giáo trong trường Đại Học Bách Khoa Đà Nẵng đã tận tình giảng dạy, truyền đạt kiến thức cho em trong suốt năm năm học vừa qua.Em xin chân thành cảm
ơn các thầy cô khoa Công nghệ thông tin-Trường Đại học Bách Khoa Đà Nẵng đã trang bị cho em những kiến thức cơ bản cần thiết để em có thể thực hiện tốt đồ án này cũng như đủ tự tin để làm việc sau này.
Đặc biệt em xin gửi lời cám ơn đến thầy giáo PGS.TS.Võ Trung Hùng
đã trực tiếp hướng dẫn và luôn giúp đỡ em trong suốt thời gian em thực hiện đồ án tốt nghiệp này.
Cuối cùng em xin được gửi lời cám ơn tới gia đình, người thân và tất cả các bạn bè đã luôn động viên, khích lệ em trong suốt quá trình học tập cũng như trong thời gian thực hiện để hoàn thành đồ án tốt nghiệp này.
Mặc dù đã có nhiều cố gắng, song do kiến thức, năng lực cũng như kinh nghiệm của bản thân còn hạn chế nên không thể tránh khỏi những sai sót về nội dung lẫn hình thức Kính mong nhận được sự giúp đỡ đóng góp ý kiến của thầy cô giáo và bạn bè để đồ án tốt nghiệp này được hoàn thiện hơn.
Xin chân thành cám ơn!
Huế, tháng 6 năm 2011 Sinh viên thực hiện Trần Quốc Thắng
Trang 3Tôi xin cam đoan :
1 Những nội dung trong luận văn này là do tôi thực hiện dưới sự hướng dẫn trực tiếp của thầy PGS.TS.Võ Trung Hùng.
2 Mọi tham khảo dùng trong luận văn đều được trích dẫn rõ ràng tên tác giả, tên công trình, thời gian, địa điểm công bố.
3 Mọi sao chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, tôi xin chịu hoàn toàn trách nhiệm.
Sinh viên thực hiện Trần Quốc Thắng
Trang 4………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 5………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 6Chữ viết tắt Chữ đầy đủ
ASP Advanced Research Projects
Agency NetworkCGI Common Gateway InterfaceDBMS Database Management SystemHTML Hypertext Markup LanguageHTTP Hypertext Transfer ProtocolIIS Internet Information ServicesJSP Java Server Pages
OWASP The Open Web Application
Security ProjectPERL Practical Extraction and Report
LanguagePHP Hypertext PreprocessorSSL Secure Socket Layer
TCP/IP Transmission Control Protocol/
Internet ProtocolURL Uniform Resource LocatorXSS Cross Site Scripting
Trang 7Số hiệu bảng Tên bảng Trang
2 Bảng lưu tên người dùng và mật khẩu có ba cột bổ
sung
47
Trang 8Hình 1: Kiến trúc của một ứng dụng web 5
Hình 2: Mô hình hoạt động của một ứng dụng web 6
Hình 3: Một Form đăng nhập trên trình duyệt 31
Hình 4: Kịch bản tấn công Session fixation sử dụng Session ID chọn sẵn 35
Hình 5: Tấn công Session fixation đầu tiên có thể khởi tạo phiên 37
Hình 6: Một cuộc tấn công thay cookie để đăng nhập trái phép 45
Hình 7: Giao diện chính của WebScarab 50
Hình 8: Giao diện chính của FoxyProxy 52
Hình 9: Giao diện ứng dụng để thử nghiệm lỗi SQL Injection 54
Hình 10: Kết quả truy vấn có giá trị last nam:”Smith” 54
Hình 11: Ứng dụng xảy ra lỗi SQL Injection 55
Hình 12: Nội dung Email có them định danh phiên 57
Hình 13: Jane kick vào lien kết Goat Hills Financial 57
Hình 14: Màn hình đăng nhập Goat Hills Financial 58
Hình 15: Màn hình đăng nhập name và password của Goat Hills Financial 58
Hình 16: Màn hình của Joe có liên kết đến site Goat Hills Financial 59
Hinh 17: Màn hình khi Joe kick liên kết đến site Goat Hills Financial 59
Hình 18: URL ở thanh address 60
Hình 19: Thay “NOVALIDSESSION” bằng “TranQuocThang” 60
Hình 20: Joe đã đăng nhập thành công 61
Trang 9CHƯƠNG I NGHIÊN CỨU TỔNG QUAN 5
I Giới thiệu ứng dụng web 5
I.1 Khái niệm 5
I.2 Hoạt động của một ứng dụng web 6
I.3 Một số nguyên tắc bảo mật cơ bản trong các ứng dụng web 7
II Ngôn ngữ lập trình PHP 9
II.1 Giới thiệu 9
II.2 Các cơ chế bảo mật trong PHP 11
III Hệ quản trị cơ sở dữ liệu My SQL 14
III.1 Giới thiệu 15
III.2 Cơ chế bảo mật trong My SQL 15
IV Kết luận chương 17
CHƯƠNG II KHẮC PHỤC LỖI BẢO MẬT TRÊN PHP 18
I Một số khái niệm và thuật ngữ liên quan 18
II Một số lỗi bảo mật trên Form và URL 21
II.1 Phương pháp tấn công thay đổi ngữ nghĩa URL 21
II.2 Phương pháp tấn công file upload 23
II.3 Phương pháp tấn công chèn mã lệnh thực thi trên trình duyệt ( XSS ) 26
II.4 Phương pháp tấn công giả mạo form 28
III Một số lỗi bảo mật với cơ sở dữ liệu và câu truy vấn SQL 29
III.1 Phương pháp đánh cắp chứng thực quyền truy cập 29
III.2 Phương pháp chèn câu truy vấn SQL 31
IV Một số lỗi bảo mật với phiên ( Session ) và Cookie 34
IV.1 Phương pháp ứng định phiên 34
IV.2 Phương pháp đánh cắp phiên 38
V Một số lỗi bảo mật với chứng thực và xác thực 40
V.1 Phương pháp tấn công vét cạn 40
V.2 Phương pháp lấy user name và password ở cookie 44
VI Kết luận chương 49
CHƯƠNG III CÀI ĐẶT THỬ NGHIỆM 50
I Giới thiệu một số công cụ 50
I.1 Webscarab 50
I.2 FoxyProxy 52
I.3 WebGoat 53
II Cài đặt thử nghiệm 53
II.1 Kỹ thuật tấn công chèn câu truy vấn SQL ( SQL Injection ) 53
II.2 Kỹ thuật tấn công ấn định phiên 56
III Kết luận chương 61
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 62
TÀI LIỆU THAM KHẢO
TÓM TẮT LUẬN VĂN TỐT NGHIỆP
Trang 10Giới thiệu bối cảnh đề tài:
Ngày nay, với sự phát triển mạnh mẽ của Internet, hầu hết cá nhân, tổ chức và doanhnghiệp đều có nhu cầu đăng tải thông tin lên các trang thông tin Web và thực hiện cácgiao dịch kinh doanh trực tuyến Vấn đề nảy sinh là khi phạm vi ứng dụng của các ứngdụng Web ngày càng mở rộng thì khả năng xuất hiện lỗi và bị tấn công càng cao, trởthành đối tượng cho nhiều người tấn công với các mục đích khác nhau
Cùng với sự phát triển không ngừng của Internet và các dịch vụ trên Internet, số lượngcác vụ tấn công trên Internet cũng tăng theo cấp số nhân Không chỉ số lượng các cuộc tấncông tăng lên nhanh chóng mà các phương pháp tấn công ngày càng tinh vi và có tổ chức.Mặt khác, việc quản trị các hệ thống mạng đòi hỏi nhà quản trị hệ thống phải có kiến thức
và kinh nghiệm, nếu không sự yếu kém trong quản lý sẽ tạo điều kiện cho các kẻ tấn côngkhai thác
Khi nói đến vấn đề bảo mật, hầu hết các chuyên gia bảo mật đều chú trọng đến sự antoàn của hệ thống mạng và hệ điều hành Nhưng một trong những đối tượng quan trọngnhất của sự an toàn và bảo mật Internet chính là các máy chủ Web (Web server), nơi cómột số lượng rất lớn các tương tác trực tiếp với người sử dụng Internet như xem thông tin,trao đổi dữ liệu, thực hiện các giao dịch tài chính, Ngoài ra, vấn đề an toàn và bảo mậtWeb phụ thuộc vào nhiều yếu tố quan trọng khác, mà trong đó các ngôn ngữ lập trìnhWeb như ASP, PHP, có một ảnh hưởng không nhỏ Với những công cụ tự tìm lỗ hổngtuy giúp rất nhiều cho những nhà lập trình nhưng vẫn không thể ngăn chặn toàn bộ lỗi vìcông nghệ Web đang phát triển rất nhanh chóng (nhưng chủ yếu chú trọng đến yếu tốthẩm mĩ, tốc độ, ) nên dẫn đến nhiều khuyết điểm mới phát sinh
Để góp phần ngăn chặn các cuộc tấn công bảo mật vào các ứng dụng web, đồ án tốt
nghiếp này được thực hiện với đề tài “Tìm hiểu một số lỗi bảo mật và phương pháp khắc
phục lỗi bảo mật của các ứng dụng trên PHP” nhằm tìm hiểu, phân tích các lỗ hổng bảo
mật, các kỹ thuật tấn công và đưa ra các phương pháp phòng tránh khắc phục cho các ứngdụng web được xây dựng bằng ngôn ngữ PHP
Mục đích của đề tài:
Tìm hiểu lý thuyết bảo mật và ứng dụng Web
Tìm hiểu ngôn ngữ lập trình PHP, hệ quản trị cơ sở dữ liệu MySQL
Tìm hiểu một số kỹ thuật tấn công và phương pháp khắc phục lỗi bảo mật của các ứngdụng được xây dựng với ngôn ngữ PHP
Thành công trong việc cài đặt thử nghiệm một số kỹ thuật tấn công bảo mật và đưa raphương pháp khắc phục
Đối tượng và phạm vi nghiên cứu:
Trang 11Các cơ chế bảo mật trong ứng dụng web, ngôn ngữ lập trình PHP và hệ quản trị cơCác kỹ thuật tấn công bảo mật và phương pháp khắc phục.
Cài đặt các máy chủ web sử dụng Apache, Tomcat,
Các ứng dụng web sử dụng ngôn ngữ lập trình PHP và website của một số doanhnghiệp được xây dựng bằng ngôn ngữ PHP
Ý nghĩa và thực tiễn của đề tài:
PHP là một trong những ngôn ngữ lập trình web nổi tiếng nhất và được sử dụng rấtrộng rãi, đặc biệt trong các ứng dụng trực tuyến Tuy nhiên, chính việc khai thác mạnh mẽ
và tính dễ sử dụng đã dẫn đến PHP bị sử dụng sai Gần đây, có nhiều cảnh báo bảo mậtliên quan đến PHP nhưng trên thực tế, hầu hết các lỗi này không phải do lỗ hổng trongPHP mà do việc sử dụng không đúng và không an toàn của người phát triển ứng dụng.Mặc dù chúng ta không thể hoàn toàn thành công trong việc chống lại các cuộc tấncông bảo mật nhưng chúng ta có thể khắc phục tối đa các lỗi bảo mật nhằm nâng cao khảnăng bảo mật của ứng dụng Luận văn sẽ xem xét cụ thể đến một số loại lỗi bảo mật và
mô tả các cách phát hiện, phòng tránh các lỗi đó nhằm giảm thiểu thiệt hại cho các ứngdụng Web được xây dựng bằng PHP
Phương pháp triển khai đề tài:
Tìm kiếm, thu thập, tham khảo các tài liệu và các chương trình demo liên quan đến đềtài từ nhiều nguồn như sách, các bài báo, internet
Tìm hiểu các website được xây dựng bằng ngôn ngữ PHP
Cài đặt một số máy chủ web, ứng dụng web trên máy tính cá nhân
Làm báo cáo đồ án theo bố cục như sau:
Chương I : TỔNG QUAN VỀ ỨNG DỤNG WEB,NGÔN NGỮ PHP VÀ HỆ QUẢN TRỊ CƠ SỠ DỮ LIỆU My SQL Chương này giới thiệu một cách tổng
quan về ứng dụng web, mô hình hoạt động của một ứng dụng web, một số nguyêntắc bảo mật cơ bản trong các ứng dụng web, ngôn ngữ lập trình PHP và một số cơchế bảo mật của PHP, hệ quản trị cơ sở dữ liệu MySQL và các cơ chế bảo mậttrong MySQL
Chương II : PHƯƠNG PHÁP KHẮC PHỤC LỖI BẢO MẬT CỦA CÁC ỨNG DỤNG TRÊN PHP Nội dung của chương này tập trung tìm hiểu các kỹ
thuật tấn công bảo mật và phương pháp khắc phục cho các ứng dụng web xâydựng bằng ngôn ngữ PHP, được chia thành 4 nhóm chính: lỗi bảo mật trên form vàURL, lỗi bảo mật với cơ sở dữ liệu và câu truy vấn SQL, lỗi bảo mật với Phiên,Cookie và cuối cùng là lỗi bảo mật với chứng thực và xác thực
Chương III: CÀI ĐẶT THỬ NGHIỆM MỘT SỐ KỸ THUẬT TẤN CÔNG
VÀ GIẢI PHÁP KHẮC PHỤC Nội dung chương này chủ yếu trình bày kết quả
cài đặt thử nghiệm một số kỹ thuật tấn công bảo mật quan trọng sử dụng ứng dụng
Trang 12WebGoat và áp dụng các phương pháp khắc phục để kiểm tra xem tính hiệu quảcủa các phương pháp đó.
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Phần này tóm tắt lại các kết quả đạt được của
luận văn Đồng thời đưa ra hướng nghiên cứu tiếp theo đối với việc phòng tránh khắc phục các lỗi bảo mật của các ứng dụng web
Trang 13NGHIÊN CỨU TỔNG QUAN
Chương này ta giới thiệu tổng quan về ứng dụng web,ngôn ngữ PHP và hệ quả trị cơ sở
My SQL
I Giới thiệu ứng dụng web
Hằng ngày, bạn có nhu cầu đăng tải thông tin lên các trang thông tin Web và thực hiệncác giao dịch kinh doanh trực tuyến được thực hiện qua các ứng dụng web.Nếu bạn làmviệc ở trên mạng Internet nhiều, có thể bạn sẽ sữ dụng rất nhiều ứng dụng web mà bạnkhông đếm nổi Thực tế các ứng dụng web đã trở thành một công cụ đăng tin,giao dịch…
vô cùng hữu hiệu trong cuộc sống hiện đại của chúng ta
Ứng dụng web là một ứng dụng khách/chủ (client/server) sử dụng giao thức HTTP để
tương tác với người dùng hay hệ thống khác Trình khách dành cho người sử dụng thường
là một trình duyệt như Internet Explorer, Firefox hay Netscape Navigator, Người dùnggửi và nhận các thông tin từ trình chủ thông qua việc tác động vào các trang Web Cácchương trình có thể là các trang trao đổi mua bán, các diễn đàn hoặc ứng dụng gửi nhận e-mail,…
Các kỹ thuật xây dựng ứng dụng Web có tốc độ phát triển rất nhanh Trước đây nhữngứng dụng Web thường được xây dựng bằng CGI (Common Gateway Interface) chạy trêncác trình chủ Web và có thể kết nối vào các cơ sở dữ liệu đơn giản trên cùng máy chủ.Ngày nay ứng dụng Web thường được viết bằng Java, ASP, PHP, và chạy trên máy chủphân tán, kết nối đến nhiều nguồn dữ liệu
Một ứng dụng web thường gồm có cấu trúc như sau:
Hình 1: Kiến trúc của một ứng dụng web
Trang 14 Lớp trình bày: Lớp này có nhiệm vụ hiển thị dữ liệu cho người dùng, ngoài ra còn
có thể có thêm các ứng dụng tạo bố cục cho trang web
Lớp ứng dụng: là nơi xử lý của ứng dụng Web Nó sẽ xử lý thông tin người dùngyêu cầu, đưa ra quyết định, gửi kết quả đến "lớp trình bày" Lớp này thường đượccài đặt bằng các ngôn ngữ lập trình như CGI, Java, NET , PHP, và được triểnkhai trên các trình chủ như IBM WebSphere, WebLogic, Apache, IIS,…
Lớp dữ liệu: thường là các hệ quản trị cơ sở dữ liệu (DBMS) chịu trách nhiệmquản lý các tập tin dữ liệu và quyền sử dụng
Mô hình hoạt động của một ứng dụng web:
Hình 2: Mô hình hoạt động của một ứng dụng web
Trong đó:
Trình khách: là các trình duyệt Internet Explorer, Firefox,…
Trình chủ: Apache, IIS,…
Hệ quản trị cơ sở dữ liệu: SQL Server, MySQL, DB2, Access,…
Một giải pháp dùng để bảo vệ một hệ thống mạng thường được sử dụng là tường lửa(Firewall) Tường lửa có vai trò như là lớp rào chắn bên ngoài một hệ thống mạng vớichức năng chính là kiểm soát luồng thông tin giữa các máy tính Có thể xem tường lửanhư một bộ lọc thông tin, nó xác định và cho phép một máy tính có được truy xuất đếnmột máy tính khác hay không, một mạng này có được truy xuất đến mạng kia hay không.Người ta thường dùng tường lửa vào mục đích:
Cho phép hoặc cấm những dịch vụ truy xuất ra ngoài
Cho phép hoặc cấm những dịch vụ từ bên ngoài truy nhập vào trong
Kiểm soát địa chỉ truy nhập
Trang 15Đầu tiên trình duyệt sẽ gửi một yêu cầu (request) đến trình chủ Web thông qua các lệnh
cơ bản GET, POST,…của giao thức HTTP, trình chủ lúc này có thể cho thực thi mộtchương trình được xây dựng bằng một ngôn ngữ lập trình như Perl, C/C++,…hoặc trìnhchủ yêu cầu bộ diễn dịch thực thi các trang ASP, JSP,…theo yêu cầu của trình khách.Tùy theo các tác vụ của chương trình được cài đặt mà nó kết nối đến cơ sở dữ liệu, xử
lý, tính toán, lưu các thông tin do trình khách gửi đến,…và từ đó trả về cho trình kháchmột luồng dữ liệu có định dạng theo giao thức HTTP, gồm 2 phần:
Header: mô tả các thông tin về gói dữ liệu, các thuộc tính và trạng thái trao đổigiữa trình duyệt và máy chủ web
Body: là phần nội dung dữ liệu mà Server gửi về Client, có thể là một tập tinHTML, một hình ảnh, một đoạn phim hay một văn bản bất kỳ
Theo mô hình ở Hình 2, đối với tường lửa thì luồng thông tin giữa trình chủ và trìnhkhách là luồng thông tin hợp lệ Vì thế, nếu kẻ tấn công tìm thấy vài lỗ hổng trong ứngdụng Web thì tường lửa không còn hữu dụng trong việc ngăn chặn kẻ tấn công này Do
đó, các kỹ thuật tấn công vào một hệ thống mạng ngày nay đang dần tập trung vào những
lỗ hổng phát sinh trong quá trình phát triển ứng dụng Web hơn là tấn công trực tiếp vào hệthống mạng hoặc hệ điều hành
a Ứng dụng có thể không cần sử dụng các cookie thường trực
Cookie thường trực là những tệp được các ứng dụng Web gửi tới máy tính người dùng
và vẫn tồn tại trên máy tính ngay cả khi họ không còn duyệt site Chúng lưu một số thôngtin về người dùng để các ứng dụng Web tuỳ biến nội dung cho phù hợp với từng đối tượngngười dùng hoặc cho phép bỏ qua giai đoạn đăng nhập
Các cookie không thường trực được lưu trong bộ nhớ máy tính của người dùng và chỉtồn tại trong thời gian người dùng duyệt site
Nếu site của bạn sử dụng cookie thường trực thì không nên yêu cầu lưu trữ chúng trongtệp log Khi tệp log lưu lại tất cả các thông tin đăng nhập của người dùng thì có nhiều khảnăng là những thông tin này có thể bị tiết lộ ra ngoài
b Sử dụng SSL (Secure Socket Layer) cho tất cả các trang nhạy cảm được chuyển trên mạng Internet
SSL mã hoá nội dung của các thông điệp TCP/IP để nó không bị nhòm ngó trên đườngtruyền SSL hoặc một giải pháp mã hoá khác là rất cần thiết khi gửi các thông tin nhạycảm (như số thẻ tín dụng) qua mạng vì cơ hội thâm nhập đường truyền và lấy cắp cácthông tin bí mật là thấp song không phải không thể có Người dùng sẽ không đặt niềm tinvào site của bạn nếu các thông tin nhạy cảm không được mã hoá
Tuy nhiên, mặt trái của SSL là làm giảm hiệu năng thực hiện của ứng dụng Mức sửdụng tài nguyên hệ thống CPU đòi hỏi trong tiến trình mã hoá và giải mã cho một trangSSL có thể cao hơn từ 10 đến 100% so với các trang bình thường
Trang 16c Yêu cầu người dùng đăng nhập mỗi khi sử dụng ứng dụng
Nguyên tắc này áp dụng cho các ứng dụng có yêu cầu thủ tục đăng nhập Điều này cónghĩa là việc đăng nhập tự động dựa trên cookie là không được phép Mặc dù người dùng
có thể thấy phiền hà nhưng nếu cho họ đăng nhập tự động dựa trên cookie thì sẽ rất nguyhiểm vì như ta đã thấy, sử dụng các cookie thường trực không phải lúc nào cũng phù hợp.Một biện pháp tiếp theo cần thiết để bảo vệ mật khẩu là huỷ tính năng Autocompletecủa các trình duyệt trên các trường mật khẩu Điều này có thể thực hiện bằng cách thêmthuộc tính Autocomplete ="off" cho thẻ <form> hoặc <input>
Vídụ: <input type="password" name="pwd" size=16 maxlength=16 Autocomplete="Off">
d Đăng xuất người dùng ra khỏi hệ thống ngay khi họ rời trang web
Giả sử một người dùng đang xem một trang web của bạn, sau đó họ truy cập một trangmới nhưng cuối cùng lại quyết định quay trở lại trang của bạn bằng cách ấn phím BACK.Trong trường hợp này, ứng dụng phải yêu cầu người dùng đăng nhập lại một lần nữa Đểphát hiện những tình huống như thế này thì phải dựa hoàn toàn vào các script chạy ở phíatrình duyệt mà không thể dựa vào trình chủ vì nó không biết người dùng đã ở những đâu Cách giải quyết tốt nhất cho vấn đề này là sử dụng một giải pháp bảo mật ProxyServer Proxy Server là một loại bộ đệm nằm giữa máy tính của người dùng và tài nguyêninternet, sẽ giám sát mọi yêu cầu từ trình duyệt, ghi lại mọi địa chỉ trình duyệt đã truy cập
Trong giải pháp thứ nhất: ta đặt giới hạn phiên là một khoảng thời gian mong muốn nào
đó Trong ứng dụng, lưu trữ thông tin truy nhập vào một biến phiên làm việc và kiểm tra
nó trên mọi trang người sử dụng duyệt qua Nếu thông tin truy nhập không thuộc về mộtbiến phiên, người sử dụng sẽ bị cắt kết nối với site và ứng dụng cần định hướng họ sangtrang truy nhập hệ thống
Giải pháp thứ hai: phía client chèn thêm đoạn mã JavaScript như sau vào đầu của mọitrang Web để cắt kết nối người sử dụng với ứng dụng 9000 là khoảng thời tối đa tínhbằng mily giây người sử dụng vẫn duy trì phiên làm việc của họ trong trường hợp không
có tương tác nào với site
<script Language="JavaScript">
window.setTimeout("window.navigate('Logout.php')", 9000);
</script>
Trang 17II Ngôn ngữ lập trình PHP
Vấn đề an toàn và bảo mật Web phụ thuộc vào nhiều yếu tố, mà trong đó các ngôn ngữlập trình Web như ASP, PHP, có một ảnh hưởng không nhỏ Có bao giờ bạn nghĩ sẽ tìmhiểu về những ngôn ngữ này không?Chúng ta hãy cùng tìm hiểu về ngôn ngữ lập trìnhPHP
II.1 Giới thiệu
PHP (viết tắt "PHP: Hypertext Preprocessor") là một ngôn ngữ lập trình kịch bản
mã nguồn mở chủ yếu được dùng để phát triển các ứng dụng viết cho máy chủ và có thể
dễ dàng nhúng vào trang HTML Do được tối ưu hóa cho các ứng dụng web, tốc độnhanh, nhỏ gọn, dễ học, cú pháp giống C và Java và thời gian xây dựng sản phẩm tươngđối ngắn hơn so với các ngôn ngữ khác nên PHP đã nhanh chóng trở thành một ngôn ngữlập trình web phổ biến nhất thế giới
PHP được phát triển từ một sản phẩm có tên là PHP/FI PHP/FI do Rasmus Lerdorf tạo
ra năm 1995, ban đầu được xem như là một tập con đơn giản của các mã kịch bản ngônngữ Perl để theo dõi tình hình truy cập đến bản sơ yếu lý lịch của ông trên mạng Ông đãđặt tên cho bộ mã kịch bản này là 'Personal Home Page Tools' Khi cần đến các chức năngrộng hơn, Rasmus đã viết ra một bộ thực thi bằng C lớn hơn để có thể truy vấn tới các cơ
sở dữ liệu và giúp cho người sử dụng phát triển các ứng dụng web đơn giản Sau đó,Rasmus đã quyết định công bố mã nguồn của PHP/FI
Ví dụ: đoạn mã PHP đơn giản sau đây sẽ hiển thị dòng chữ “Hello World” ra màn hình
Trang 18Thẻ <?php và thẻ ?> đánh đấu sự bắt đầu và kết thúc của phần mã PHP qua đó máychủ biết để xử lý và dịch mã cho đúng Đây là một điểm khá tiện lợi của PHP giúp choviệc viết mã PHP trở nên khá trực quan và dễ dàng trong việc xây dựng phần giao diệnứng dụng HTTP.
Ngôn ngữ, các thư viện, tài liệu gốc của PHP được xây dựng bởi cộng đồng và có sựđóng góp rất lớn của Zend Inc., công ty do các nhà phát triển cốt lõi của PHP lập nênnhằm tạo ra một môi trường chuyên nghiệp để PHP phát triển
Quá trình phát triển của ngôn ngữ lập trình PHP qua các phiên bản như sau:
PHP/FI (Personal Home Page/Forms Interpreter):
PHP/FI 2.0 được chính thức công bố vào tháng 11 năm 1997, bao gồm một số cácchức năng cơ bản cho PHP như ta đã biết ngày nay Nhưng không lâu sau đó, nó
đã được thay thế bởi các bản alpha đầu tiên của PHP 3.0
PHP 3:
PHP 3.0 là phiên bản được Andi Gutmans và Zeev Suraski tạo ra năm 1997 saukhi viết lại hoàn toàn bộ mã nguồn trước đó Một trong những sức mạnh lớn nhấtcủa PHP 3.0 là các tính năng mở rộng mạnh mẽ Ngoài khả năng cung cấp chongười dùng cuối một cơ sở hạ tầng chặt chẽ dùng cho nhiều cơ sở dữ liệu, giaothức và API khác nhau, các tính năng mở rộng của PHP 3.0 đã thu hút rất nhiềunhà phát triển tham gia và đề xuất các mô đun mở rộng mới Nó đã được đặt tênngắn gọn là 'PHP', viết tắt của "Hypertext Preprocessor" PHP 3.0 đã chính thứcđược công bố vào tháng 6 năm 1998
PHP 4:
PHP 4.0 chính thức được công bố vào tháng 5 năm 2000 Ngoài tốc độ xử lý đượccải thiện rất nhiều, PHP 4.0 đem đến các tính năng chủ yếu khác gồm có sự hỗ trợnhiều máy chủ Web hơn, hỗ trợ phiên làm việc HTTP, tạo bộ đệm thông tin đầu
ra, nhiều cách xử lý thông tin người sử dụng nhập vào bảo mật hơn và cung cấpmột vài cấu trúc ngôn ngữ mới
PHP 5:
Ngày 29 tháng 6 năm 2003, PHP 5 Beta 1 chính thức được công bố để cộng đồngkiểm nghiệm Phiên bản Beta 2 sau đó ra mắt vào tháng 10 năm 2003 với sự xuấthiện của hai tính năng rất được chờ đợi: Iterators, Reflection Ngày 21 tháng 12năm 2003, PHP 5 Beta 3 đã được công bố để kiểm tra với khả năng gọi các hàmPHP, sửa chữa nhiều lỗi và thêm khá nhiều hàm mới PHP 5 bản chính thức đã ramắt ngày 13 tháng 7 năm 2004 Ngày 14 tháng 7 năm 2005, PHP 5.1 Beta 3 đượcPHP Team công bố đánh dấu sự chín muồi mới của PHP
PHP 6:
Hiện nay phiên bản tiếp theo của PHP đang được phát triển, PHP 6 bản sử dụngthử đã có thể được download tại địa chỉ http://snaps.php.net
Trang 19II.2 Các cơ chế bảo mật trong PHP
Ngôn ngữ kịch bản PHP cung cấp nhiều cơ chế bảo mật giúp ngăn chặn việc khai tháccác lỗ hổng hoặc làm giảm thiệt hại gây ra bởi các cuộc tấn công Trong các cấu hìnhchuẩn của PHP, tất cả các tuỳ chọn bảo mật thường bị vô hiệu hoá vì lý do tương thích.Mỗi một cơ chế áp đặt một hạn chế đặc biệt khi lập trình Khi các cấu hình bảo mật PHPđược nới lỏng thì các máy chủ web ít khi buộc các nhà phát triển phải xem xét đến các hạnchế đó
Các nhà cung cấp dịch vụ lưu trữ web (web hosting) không thể kiểm soát chặt chẽ bảomật trên tất cả các máy chủ web cung cấp cho khách hàng Nếu xem xét một số gói lưu trữweb thì có thể thấy rằng không có nhà cung cấp nào thực hiện cấu hình đúng các tuỳ chọn
bảo mật, thậm chí là tuỳ chọn bảo mật quan trọng nhất như register_globals = off.
Hầu hết các nhà cung cấp sử dụng máy chủ web Apache Máy chủ loại này sử dụng hai
cách thực thi PHP: mod_php và cơ chế CGI Ta có thể thu được các thông tin về web hosting bằng cách thực thi đoạn mã <?php phpinfo();?> Nếu đoạn mã này trả về giá trị
“Apache Handler” ở trường “Server API” thì máy chủ sử dụng mod_php, ngược lại kết
quả là “CGI”.
a PHP sử dụng CGI
Giải pháp CGI được sử dụng bởi hầu hết các nhà cung cấp là rất linh hoạt và khá antoàn nếu được cấu hình đúng Nó thực thi các ứng dụng PHP như các tiến trình riêng biệtthông qua cơ chế CGI cổ điển Để ngăn chặn các kịch bản chạy trên máy chủ đầy đủ chứ
không phải ở cấp đặc quyền người dùng (user privilege), nhà cung cấp thực thi các môđun
mod_suexec hoặc mod_suphp của Apache Cách này không những bảo vệ máy chủ mà
còn bảo vệ người dùng trên máy chủ chống lại các cuộc tấn công
Ngoài ra, người dùng web có thể kiểm soát các tuỳ chọn PHP trong một cấu hình CGIbằng nhiều cách Trong chế độ CGI, các trình biên dịch PHP cho phép tập tin php.ini nằmcùng thư mục với các tập tin kịch bản PHP được thực thi
Không giống như tập tin htaccess, tập tin php.ini không ảnh hưởng đến các thư mục
con Vì vậy, mỗi thư mục chứa các kịch bản thực thi PHP cần một tập tin php.ini riêngnhưng không phải thư mục nào cũng đòi hỏi tập tin này, ví dụ như thư mục wp-contentcủa hệ thống Wordpress
b Một số tuỳ chọn bảo mật của PHP
allow_url_fopen (khuyến cáo: off): kiểm soát chức năng cho phép truy cập tập tin PHP
thông qua URL hay không Khi tuỳ chọn này bị cấm thì khả năng bị tấn công bằng mã
độc từ xa rất thấp Kể từ phiên bản PHP 5.2.0, allow_url_include kiểm soát include() và
require() riêng biệt.
display_errors (khuyến cáo: off): điều khiển việc tắt mở hiển thị thông báo lỗi PHP.
Chức năng này vừa hỗ trợ cho việc lập trình nhưng cũng vừa cung cấp cho kẻ tấn côngcác thông tin chi tiết trong ứng dụng để thực hiện tấn công
Trang 20disable_functions: cho biết danh sách các hàm PHP bị vô hiệu hoá (disable) Các ứng
dụng PHP thường tránh sử dụng các hàm như exec().
open_basedir: giới hạn thực thi tập tin PHP đối với các thư mục cụ thể Nếu áp dụng
cho nhiều thư mục thì các thư mục cách nhau bởi dấu hai chấm “:” Kết thúc một đường dẫn bằng dấu xuyệt “/”.
register_globals (khuyến cáo: off): xác định tham số từ URL hay từ phương thức
POST được gửi đến các kịch bản như là biến toàn cục
safe_mode (khuyến cáo: on): xác định PHP có hoạt động ở chế độ an toàn đặc biệt hay
không Ở chế độ này, PHP có thể thực hiện kiểm tra bổ sung cho hoạt động của một tậptin, giới hạn truy cập vào các biến môi trường
sql.safe_mode: xác định các yêu cầu đăng nhập có được xử lý một cách đặc biệt cho
các máy chủ cơ sở dữ liệu hay không Ở chế độ này, các hàm PHP sử dụng tài khoản hệthống để đăng nhập vào cơ sở dữ liệu Vì tên của người sử dụng cơ sở dữ liệu hiếm khitương ứng với người dùng hệ thống trong môi trường web hosting chia sẻ nên tuỳ chọnnày chỉ được sử dụng trong các trường hợp cụ thể
Áp dụng các tuỳ chọn này thì tập tin php.ini sẽ bao gồm:
[PHP]
register_globals = off
allow_url_fopen = off
safe_mode = on
open_basedir = <path name of web directory>
disable_functions = exec, system, passthru, shell_exec, popen, escapeshellcmd, proc_open, proc_nice, ini_restore
display_errors = off
c PHP sử dụng mod_php
Hai nhà cung cấp dịch vụ web hosting Server4u và all-inkl sử dụng mod_php và cho phép các khách hàng cấu hình PHP cơ bản thông qua tập tin htaccess Các tập tin
.htaccess này chỉ có thể điều khiển hai trong số các tuỳ chọn bảo mật chính của PHP.
Ngoài việc bảo vệ nơi lưu trữ web thông qua chứng thực HTTP thông thường, một tập tin
.htaccess được chứa trong thư mục gốc root và bao gồm:
php_flag register_globals off
php_flag display_errors off
Trang 21Tập tin htaccess chuẩn sẽ được áp dụng cho mọi thư mục con.
Tuy nhiên, khi thực hiện thì tất cả các kịch bản PHP sử dụng định danh (ID) người dùng (user) và nhóm người dùng (group) của tiến trình máy chủ web Khi quá trình này
đòi hỏi nhiều đặc quyền đọc hơn để truy cập thư mục thì có thể gây hậu quả nghiêm trọngcho các người dùng khác hoặc thậm chí cho cả máy chủ trong trường hợp bị tấn công.Trong trường hợp đó, các nhà cung cấp thường sử dụng nhiều cơ chế bảo vệ khác nhau
Chẳng hạn, nhà cung cấp all-inkl hạn chế truy cập tập tin PHP bằng cách thiết lập
open_basedir cho thư mục của khách hàng.
Bảng sau cung cấp giá trị thiết lập cho các tuỳ chọn bảo mật:
Tuỳ chọn bảo mật Giá trị mặc định php.ini htaccess
allow_url_include off yes no
register_globals on yes yes
Bảng 1: Thiết lập các tùy chọn bảo mật
Nếu allow_url_fopen = off được thiết lập thì không cho phép hệ thống diễn đàn như
phpBB tải hình ảnh từ máy chủ bên ngoài Vì vậy, mở rộng thử nghiệm thiết lập tạm thời
diplay_error = on là rất quan trọng Trong trường hợp các giới hạn chức năng bị gián
đoạn hoặc không được chấp nhận thì các thiết lập bảo mật trong tập tin php.ini tương ứng
cần được nới lỏng Nếu thông báo lỗi không đưa ra được nguyên nhân của lỗi thì thửnghiệm với từng tuỳ chọn là cách duy nhất
Tuy nhiên, trong các ứng dụng PHP hiện đại, trình cài đặt thường đưa ra khuyến cáo
các lỗi có thể có đối với từng tuỳ chọn bảo mật cụ thể Ví dụ, phiên bản phpBB 3 kiểm tra
nhiều tuỳ chọn bảo mật PHP khác nhau trong suốt quá trình cài đặt và đưa ra các khuyếncáo kèm theo Ngược lại, hệ thống quản trị nội dung Joomla cung cấp các cảnh bảo rõ
ràng về những cấu hình máy chủ không an toàn, ví dụ cảnh báo khi thiết lập
register_blobals = on.
Trong các môi trường lưu trữ web chia sẻ, các tập tin chứa dữ liệu truy cập như mậtkhẩu được quan tâm đặc biệt Hầu hết các ứng dụng web sử dụng hệ quản trị cơ sở dữ liệu
MySQL lưu trữ mật khẩu cơ sở dữ liệu trong thư mục web dưới dạng plain/text Ví dụ,
Trong Wordpress, tập tin này là wp-config.php, trong phpBB là config.php Ta nên thiết lập chỉ cho phép owner được quyền truy cập những tập tin này bằng cách sử dụng chức
năng cài đặt quyền truy cập tập tin có sẵn ở hầu hết các chương trình FTP
Trang 22Ví dụ: các gói web của hai nhà cung cấp all-inkl và Server4u yêu cầu quyền đọc của
người dùng đối với tập tin PHP và tập tin include Khi đặc quyền bị thiếu, máy chủ đưa rathông báo lỗi hoặc hiện tài liệu rỗng ở trình duyệt
Ta cũng có thể loại bỏ quyền ghi vào tập tin php.ini cũng như các thư mục chứa chúng
và sử dụng disable_functions để ngăn chặn các kịch bản PHP tác động đến đặc quyền truy cập thông qua chmod() Sau đó, các chương trình độc hại không thể chèn các giá trị gây
lỗi vào các tập tin này hoặc xoá chúng
Tuy nhiên, đặc quyền ghi cần được tạm thời phục hồi để thực hiện cập nhật Công việc
này rất tốn thời gian, dễ gây lỗi Khi chmod() bị vô hiệu hoá, các hệ thống như Wordpress
sẽ không thể điều chỉnh đặc quyền truy cập của các tập tin hoặc tải thư mục tự động Do
đó, các quản trị viên phải thực hiện một cách thủ công
Tất cả các cơ chế phía người dùng nêu trên không thể bảo vệ khỏi mọi cuộc tấn công
Cụ thể, chúng không loại trừ trách nhiệm của người dùng web hosting đối với việc duy trì
và cập nhật thường xuyên các bản vá lỗi bảo mật mới nhất cho các ứng dụng PHP Khicác kịch bản PHP được lập trình cẩu thả cho phép ghi dữ liệu người dùng vào cơ sở dữliệu mà không cần lọc, những kẻ tấn công hoặc phần mềm độc hại có thể thao tác dữ liệucủa ứng dụng bất kể tất cả các biện pháp bảo mật
Ngoài ra, tuỳ chọn allow_url_fopen = off có thể được bỏ qua bằng cách sử dụng các dòng “php://input” và “data://” Khi kẻ tấn công cố gắng lấy mật khẩu cơ sở dữ liệu, chúng có thể đọc các tập tin ngoài thư mục gốc open_basedir thông qua MySQL.
III Hệ quản trị cơ sở dữ liệu My SQL
Hiện nay có rất nhiều loại hệ quản trị cơ sở dữ liệu khác nhau: từ phần mềm nhỏ chạytrên máy tính cá nhân cho đến những hệ quản trị phức tạp chạy trên một hoặc nhiều siêumáy tính Các hệ quản trị CSDL phổ biến được nhiều người biết đến là MySQL, Oracle,PostgreSQL, SQL Server, DB2, Infomix,… Chúng ta cùng tìm hiểu hệ quản trị cơ sở dữliệu My SQL
III.1 Giới thiệu
a Khái niệm:
MySQL là một hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở phổ biến nhất hiện nay.
Nó được phát triển, hỗ trợ bởi MySQL AB, một công ty thương mại được thành lập bởinhóm phát triển MySQL
MySQL không chỉ là cơ sở dữ liệu mã nguồn mở phổ biến nhất trên thế giới, nó còn trởthành cơ sở dữ liệu được chọn cho thế hệ mới của các ứng dụng xây dựng trên nền Linux,Apache, MySQL, PHP/Perl/Python MySQL chạy trên hơn 20 flatform bao gồm: Linux,Windows, HP-UX, Netware, mang đến tính linh hoạt trong việc sử dụng
Máy chủ cơ sở dữ liệu MySQL cung cấp đặc tính linh hoạt, có sức chứa để xử lý cácứng dụng chạy các kho dữ liệu đồ sộ lên đến hàng terabytes thông tin Thêm một lý do để
Trang 23người ta chọn MySQL là tốc độ, mặc dù MySQL xử lý giao tác không tốt như Oracle haySQL Server nhưng về tốc độ, nó chạy nhanh hơn rất nhiều Cộng thêm mã nguồn mở vàmiễn phí, nó là giải pháp cơ sở dữ liệu tốt nhất cho các website.
MySQL đưa ra tính năng bảo mật đặc biệt để chắc chắn dữ liệu sẽ được bảo mật tuyệtđối Trong việc xác nhận truy cập cơ sở dữ liệu, MySQL cung cấp các kỹ thuật mạnh màchắc chắn chỉ có người sử dụng đã được xác nhận mới có thể truy nhập được vào máy chủ
cơ sở dữ liệu
Tiện ích backup và recovery cung cấp bởi MySQL và các hãng phần mềm thứ ba chophép backup logic và vật lý hoàn thiện cũng như recovery toàn bộ Thêm vào đó, các tínhnăng mạnh của MySQL đang được bổ sung dần qua từng phiên bản Phiên bản hiện tạikhông ít tính năng mấy so với MS SQL Server
b Các kiểu dữ liệu và câu truy vấn
Các kiểu dữ liệu: MySQL hỗ trợ các kiểu dữ liệu thông dụng như Signed/UnSignedIntergers, Float, Double, Char, Varchar, Text, Blob, Date, Time, DateTime, TimeStamp,Year, Set, Enum,
Câu truy vấn và hàm: MySQL hỗ trợ toàn bộ các toán tử và chức năng trong câu lệnhtruy vấn Select và Where, các câu truy vấn SQL Group By và Order By, hỗ trợ Left OuterJoin và Right Outer Join theo cú pháp chuẩn của SQL, ODBC và việc ghi các alias chotable, column Bên cạnh đó, MySQL còn hỗ trợ các hàm gom nhóm Count(), Avg(), Std(),Sum(), Max(), Min(),
III.2 Cơ chế bảo mật trong My SQL
Bảo mật cơ sở dữ liệu là một yếu tố cần thiết trong bất kỳ hệ thống cơ sở dữ liệu nào.MySQL là một trong các hệ quản trị cơ sở dữ liệu an toàn nhất hiện nay vì cơ chế bảo mậtcủa MySQL rất tốt Hệ thống đặc quyền và mật khẩu của MySQL rất linh hoạt Mật khẩurất bảo mật vì tất cả các dòng di chuyển mật khẩu đều được mã hoá khi người dùng kếtnối vào server
Cơ chế bảo mật của hệ quản trị cơ sở dữ liệu MySQL gồm hai lĩnh vực chính là bảomật trong môi trường mạng và bảo mật cơ sở dữ liệu
a Bảo mật trong môi trường mạng:
Kể từ phiên bản 4.0.0, MySQL hỗ trợ cho các kết nối an toàn giữa các MySQLclient và server dùng giao thức Secure Socket Layer (SSL)
Cấu hình chuẩn của MySQL có khuynh hướng sao cho chạy nhanh nhất có thểnhưng việc mã hoá các kết nối không thể dùng mặc định vì như thế có thể làm choclient/server chậm hơn Mã hoá dữ liệu là thao tác cần CPU xử lý nhiều và đòi hỏimáy tính cần phải thực hiện thêm một số công việc nên có thể làm trì hoãn cácnhiệm vụ khác của MySQL
b Bảo mật cơ sở dữ liệu:
Trang 24 MySQL thực hiện bảo mật cơ sở dữ liệu dựa vào hệ thống quyền truy cập Chứcnăng chính của hệ thống điều khiển truy cập gồm:
+ Chứng thực sự kết nối của user vào MySQL Server
+ Kết hợp user với các quyền riêng trên cơ sở dữ liệu chẳng hạn như Select,Update, Insert, Delete
Để thực hiện điều khiển hệ thống cần phải truy cập một số thông tin đặc biệt Cácthông tin này được tổ chức thành một cơ sở dữ liệu chính là mysql Ngay sau khicài đặt hệ quản trị cơ sở dữ liệu MySQL thì sẽ có 2 cơ sở dữ liệu được tạo ra:
+ mysql: lưu trữ các thông tin phục vụ cho việc quản trị
+ test: cơ sở dữ liệu mà người dùng nào cũng có đầy đủ các quyền trên đó
Ở đây, ta chỉ quan tâm đến cơ sở dữ liệu mysql Cơ sở dữ liệu mysql lưu trữ cácthông tin chung và các đặc quyền của user để kiểm tra kết nối và quyền thực hiệncác câu lệnh Do đó, chỉ nên cho phép các nhà quản trị cơ sở dữ liệu quyền truycập và thao tác trên cơ sở dữ liệu này Cơ sở dữ liệu mysql cũng giống như bất kỳmột cơ sở dữ liệu nào khác trong MySQL, tất cả các tập tin dữ liệu của nó lưu trữ
dữ liệu trong một thư mục gốc mysql
Các bảng trong cơ sở dữ liệu mysql sử dụng cho mục đích bảo mật là bảng user,
db, host, columns_priv, tables_priv, procs_priv, còn được gọi là các bảng phân
quyền (grant tables) Tuy nhiên, người dùng vẫn có thể thực thi các câu lệnh trêncác bảng này như bất kỳ bảng nào khác trong cơ sở dữ liệu bình thường khác
c Điều khiển truy cập đặc quyền khi người dùng kết nối với MySQL:
MySQL yêu cầu username, password và hostname khi thực hiện kết nối:
+ Username: là tên tài khoản dùng để truy cập vào MySQL
+ Password: là mật khẩu để xác nhận người dùng
+ Hostname: là tên máy mà người dùng kết nối
Khi người dùng kết nối với MySQL thì nó sẽ kiểm tra trong bảng user cóhostname, username và password đó không Việc kiểm tra được thực hiện bằngcách đối chiếu ba cột phạm vi của bảng user (host, user, password) với hostname,username và password do người dùng cung cấp Nếu có, người dùng được quyềntruy cập vào hệ thống Khi đó, nếu người đó thực thi một câu lệnh truy vấn thìtrước tiên MySQL xem trong bảng user xem người dùng có những quyền gì Nếungười dùng có đặc quyền trong bảng đó thì sẽ được phép làm bất cứ thao tác gìtrên cơ sở dữ liệu trong MySQL, ngược lại MySQL sẽ tìm tiếp trong bảng db Nếungười dùng vẫn không có quyền để thực thi câu truy vấn thì MySQL sẽ tìm tiếptrong bảng tables_priv và sau đó là bảng columns_priv để kiểm tra người đó cóquyền thực thi câu truy vấn hay không Nếu không tìm thấy thì hệ thống sẽ báo lỗi
IV Kết luận chương
Chương này đã giới thiệu một cách tổng quan về ứng dụng Web, ngôn ngữ lập trìnhPHP và hệ quản trị cơ sở dữ liệu MySQL Trong đó có đề cập đến các nguyên tắc bảo mậtcần áp dụng trong một ứng dụng Web cũng như các cơ chế bảo mật của ngôn ngữ PHP và
Trang 25hệ quản trị cơ sở dữ liệu MySQL mà một nhà phát triển ứng dụng Web với ngôn ngữ PHP
sử dụng MySQL cần phải nắm vững để phòng tránh các lỗi bảo mật xảy ra khi xây dựng
Trang 26KHẮC PHỤC LỖI BẢO MẬT TRÊN PHP
Chương này ta tìm hiểu về phương pháp khắc phục lỗi bảo mật của các ứng dụng trênPHP
I Một số khái niệm và thuật ngữ liên quan
a Hacker
Hacker là một thuật ngữ dùng để chỉ những kẻ phá hoại các hệ thống mạng, các ứngdụng,… Hacker thường là những chuyên gia về máy tính, không tạo ra các kẽ hở cho hệthống nhưng hacker lại là những người am hiểu về hệ điều hành, hệ quản trị cơ sở dữ liệu,các ngôn ngữ lập trình,… Họ sử dụng kiến thức của mình trong việc tìm tòi và khai tháccác lỗ hổng của hệ thống mạng, ứng dụng
WhiteHat (Hacker mũ trắng): hacker chỉ dừng lại việc phát hiện và thông báo lỗi tìmđược cho những nhà bảo mật hay người phát triển chương trình
BlackHat (Hacker mũ đen): hacker dựa vào những lỗ hổng thực hiện việc khai thác tráiphép nhằm mục đích phá hoại hay mưu lợi riêng
b HTTP Header
HTTP header là phần đầu (header) của thông tin mà trình khách và trình chủ gửi chonhau Những thông tin trình khách gửi cho trình chủ được gọi là HTTP requests (yêu cầu)còn trình chủ gửi cho trình khách là HTTP responses (trả lời) Thông thường, một HTTPheader gồm nhiều dòng, mỗi dòng chứa tên tham số và giá trị Một số tham số có thể đượcdùng trong cả header yêu cầu và header trả lời, còn số khác thì chỉ đuợc dùng riêng trongtừng loại
c Phiên ( Session )
HTTP là giao thức hướng đối tượng tổng quát, phi trạng thái, nghĩa là HTTP không lưutrữ trạng thái làm việc giữa trình duyệt với trình chủ Sự thiếu sót này gây khó khăn chomột số ứng dụng Web bởi vì trình chủ không biết được trước đó trình duyệt đã có nhữngtrạng thái nào Để giải quyết vấn đề này, ứng dụng Web đưa ra khái niệm phiên làm việc(Session)
SessionID là một chuỗi để chứng thực phiên làm việc Một số trình chủ sẽ cung cấpmột SessionID cho người dùng khi họ xem trang web trên trình chủ Để duy trì phiên làmviệc thì sessionID thường được lưu vào biến trên URL, biến ẩn form và Cookie Phiên làmviệc chỉ tồn tại trong một khoảng thời gian cho phép, thời gian này được cấu hình qui địnhtại trình chủ hoặc bởi ứng dụng thực thi Trình chủ sẽ tự động giải phóng phiên làm việc
để khôi phục lại tài nguyên của hệ thống
Trang 27d Cookie
Cookie là những phần dữ liệu nhỏ có cấu trúc được chia sẻ giữa trình chủ và trìnhduyệt của người dùng
Các cookie được lưu trữ dưới những tập tin dữ liệu nhỏ dạng text, được ứng dụng tạo ra
để lưu trữ, nhận biết các thông tin về người dùng đã ghé thăm trang Web và những vùng
mà họ đi qua trong trang Những thông tin này có thể bao gồm tên/định danh người dùng,mật khẩu, sở thích, thói quen, Cookie được trình duyệt của người dùng chấp nhận lưutrên đĩa cứng của máy mình, tuy nhiên không phải lúc nào trình duyệt cũng hỗ trợ cookie,
mà còn tùy thuộc vào người dùng có chấp nhận việc lưu trữ đó hay không
Ở những lần truy cập sau đến trang Web đó, ứng dụng có thể dùng lại những thông tintrong cookie để người dùng không phải làm lại thao tác đăng nhập hay phải cung cấp lạicác thông tin khác
Các thành phần của một cookie gồm:
Domain: Tên miền của trang web đã tạo cookie
Flag: mang giá trị TRUE/FALSE: Xác định các máy khác với cùng tên miền cóđược truy xuất đến cookie hay không
Path: Phạm vi các địa chỉ có thể truy xuất cookie
Sercure: mang giá trị TRUE/FALSE: Xác định đây là một secure cookie haykhông nghĩa là kết nối có sử dụng SSL hay không
Expiration: thời gian hết hạn của cookie, được tính bằng giây kể từ 00:00:00 giờ
Name: Tên biến
Value: Với cookie được tạo ở trên thì giá trị của biến có tên Name
Form dữ liệu được gửi bằng cách sử dụng phương thức GET hoặc POST Khi tạo một
form HTML, ta định nghĩa phương thức này trong thuộc tính method:
<form action="http://example.org/register.php" method="GET">
Phương thức GET: Khi sử dụng phương thức GET thì tất cả các tên biến và giá trị của
nó sẽ xuất hiện trong URL
Trang 28Ví dụ, xét form sau đây:
<form action="http://example.org/login.php" method="GET">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" /></p>
</form>
Nếu chúng ta nhập username là tennguoidung và password là matkhau thì
http://example.org/login.php?username=tennguoidung&password=matkhau sẽ hiển thị
sau khi nhấn Submit
Phương thức POST: xét ví dụ như trên nhưng sửa đổi thuộc tính method của form thành
POST thay vì GET:
<form action="http://example.org/login.php" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" /></p>
</form>
Form này dẫn đến liên kết http://example.org/login.php sau khi nhấn Submit Dữ liệu
của form nằm trong nội dung của truy vấn thay vì nằm trong chuỗi truy vấn của URL
f URL
URL (Uniform Resource Locator) dùng để chỉ tài nguyên trên Internet Sức mạnh củaweb là khả năng tạo ra những liên kết siêu văn bản đến các thông tin liên quan Nhữngthông tin này có thể là những trang web khác, những hình ảnh, âm thanh,… Những liênkết này thường được biểu diễn bằng những chữ màu xanh có gạch dưới được gọi làanchor Các URL có thể được truy xuất thông qua một trình duyệt như Internet Explorer,Firefox,
Ví dụ: Một URL có dạng http://www.user.vn/index.php
Trong đó:
http: là giao thức
http://www.user.vn/ là địa chỉ máy chứa tài nguyên.
index.php là tên đường dẫn trên máy chứa tài nguyên.
Nhờ địa chỉ URL mà ta có thể từ bất kỳ một máy nào trong mạng Internet truy cập tới
Trang 29II Một số lỗi bảo mật trên Form và URL
II.1 Phương pháp tấn công thay đổi ngữ nghĩa URL
a Giới thiệu
Kỹ thuật tấn công thay đổi ngữ nghĩa URL (Semantic URL Attack) liên quan đến việc
người dùng thử sửa đổi các URL để khám phá kết quả gì sẽ xảy ra
Ví dụ, nếu người dùng chris nhấp vào một liên kết trong ứng dụng và dẫn đến liên kết
http://example.org/private.php?user=chris
Sau đó thì anh ta sẽ có thể thử xem chuyện gì xảy ra nếu giá trị của user thay đổi, anh ta
có thể thử http://example.org/private.php?user=rasmus để xem anh ta có thể truy cập
thông tin của một người khác có tên là rasmus hay không
b Ví dụ
Xét một ứng dụng email trên nền web mà người dùng đăng nhập và kiểm tra tài khoảnemail của họ Bất kỳ ứng dụng nào đòi hỏi người sử dụng đăng nhập thì cần phải cung cấpmột cơ chế đòi hỏi nhập mật khẩu Một kỹ thuật phổ biến là yêu cầu người dùng trả lời
một câu hỏi ngẫu nhiên mà một cuộc tấn công thường không trả lời được (ví dụ: tên thời
con gái của mẹ là gì?)
Trong trường hợp cần đặt lại mật khẩu mới thì ứng dụng gửi mật khẩu mới đến địa chỉemail đã được lưu trong tài khoản của người dùng Tuy nhiên, cũng có khi một địa chỉemail không được lưu trữ sẵn, do đó người trả lời câu hỏi xác minh được yêu cầu cung cấpmột địa chỉ email (mục đích không chỉ để gửi mật khẩu mới đến địa chỉ này, mà còn đểthu thập một địa chỉ thay thế để sử dụng trong tương lai) Form sau đây yêu cầu một người
sử dụng cung cấp một địa chỉ email thay thế và tên tài khoản được xác định trong một biếndạng ẩn:
<form action="reset.php" method="GET">
<input type="hidden" name="user" value="chris" />
<p>Please specify the email address where your new password sent:</p>
<input type="text" name="email" /><br />
<input type="submit" value="Send Password" />
</form>
Kịch bản tiếp nhận, reset.php có các thông tin cần thiết để thiết lập lại mật khẩu: tên tài
khoản cần thiết lập lại mật khẩu và địa chỉ email mà mật khẩu mới sẽ được gửi đến
Nếu người dùng sử dụng form này (sau khi trả lời đúng câu hỏi xác minh) thì có thểđảm bảo rằng họ là chủ sở hữu hợp pháp của tài khoản chris Sau đó nếu người dùng cung
cấp địa chỉ email chris@example.org và submit thì dẫn đến URL sau:
Trang 30Nếu reset.php xác định các giá trị này được cung cấp bởi người dùng thì sẽ dễ bị tấn
công kiểu thay đổi URL Mật khẩu mới sẽ được tạo cho tài khoản email
php@example.org và được gửi đến địa chỉ email chris@example.org.Như vậy, chris đã
ăn cắp tài khoản php thành công
$clean['email'] = $_POST['email'];
$user = $_SESSION['user'];
$new_password = md5(uniqid(rand(), TRUE));
if ($_SESSION['verified']) {
/* Update Password */
mail($clean['email'], 'Your New Password', $new_password);
} }
?>
Điều này thể hiện sự thiếu bảo mật đối với địa chỉ email được cung cấp bởi người dùng,quan trọng hơn là các biến session phải nhận biết người dùng hiện tại có trả lời đúng câuhỏi xác minh hay không và có đúng tên tài khoản mà câu hỏi xác minh được trả lời không
Trang 31Vậy, xem xét dữ liệu đầu vào là chìa khóa để ngăn ngừa các lỗ hổng như thế trong cácứng dụng.
II.2 Phương pháp tấn công file upload
a Giới thiệu
Một số ứng dụng cho phép người dùng tải tập tin (upload file) ở form dữ liệu Bởi vìcác tập tin không được gửi như các form dữ liệu khác nên phải chỉ định kiểu mã hóa
multipart/form-data cụ thể:
<form action="upload.php" method="POST" enctype="multipart/form-data">
Một yêu cầu HTTP bao gồm cả form dữ liệu thông thường và các tập tin có định dạng
đặc biệt thì thuộc tính enctype này là cần thiết để trình duyệt chấp nhận.
Thành phần form được sử dụng để cho phép người sử dụng chọn tập tin để tải lên nhưsau:
<input type="file" name="attachment" />
Giao diện của nó bao gồm một trường văn bản chuẩn và một nút để người dùng có thểtùy chọn nhập đường dẫn tập tin bằng tay hoặc chỉ đến nó
Form sau cho phép người dùng tải một tập tin đính kèm:
<form action="upload.php" method="POST" enctype="multipart/form-data">
<p>Please choose a file to upload:
<input type="hidden" name="MAX_FILE_SIZE" value="1024" />
<input type="file" name="attachment" /><br />
<input type="submit" value="Upload Attachment" /></p>
</form>
Biến ẩn MAX_FILE_SIZE cho biết kích thước tập tin tối đa (bytes) mà trình duyệt cho
phép Với giới hạn từ phía máy khách thì biến này dễ bị tấn công nhưng được sử dụng đểhướng dẫn cho người sử dụng Giới hạn này cần phải được thiết lập trên máy chủ để bảomật hơn
Hàm upload_max_filesize trong PHP có thể được sử dụng để kiểm tra kích thước tập tin tối đa cho phép Ngoài ra có thể sử dụng hàm post_max_size vì các tập tin tải lên nằm
trong phương thức POST
Kịch bản nhận, upload.php thể hiện nội dung của mảng toàn cục $_FILES:
<?php
Trang 32[name] => author.txt [type] => text/plain [tmp_name] => /tmp/phpShfltt [error] => 0
[size] => 36 )
)
Điều này minh họa chính xác những gì PHP cung cấp trong mảng $_FILES nhưng
không giúp xác định nguồn gốc của thông tin này Người phát triển cần có khả năng xácđịnh đầu vào, kiểm tra các yêu cầu HTTP để biết chính xác những gì trình duyệt sẽ gửi:
Trang 33Content-Disposition: form-data; name="attachment"; filename="author.txt"
Vì PHP lưu trữ tập tin được tải lên tạm thời trên hệ thống tập tin (ở ví dụ là
/tmp/phpShfltt) nên sau đó phải di chuyển tập tin đến một nơi nào đó và đọc nó vào bộ
nhớ Nếu mã của bạn sử dụng tmp_name mà không cần xác minh nó có phải là tập tin
được tải lên hay không (không phải như /etc/passwd) thì tiềm ẩn nguy cơ trên lý thuyết (vì thực tế không có kẻ tấn công sửa đổi tmp_name).
Trang 34/* $old_filename is an uploaded file, and the move was successful */ }
Phương pháp này không nhằm vào máy chủ hệ thống mà chủ yếu tấn công trên máycủa người sử dụng Hacker lợi dụng sự kiểm tra lỏng lẻo của ứng dụng, hiểu biết hạn chếcủa người dùng cũng như biết đánh vào sự tò mò của họ để đánh cắp thông tin một cách
dễ dàng
Những ứng dụng email, các diễn đàn, guestbooks và cả blog là các ứng dụng dễ bị tấncông Trong thực tế, nếu các ứng dụng web có dữ liệu đầu vào không được lọc thì sẽ cókhả năng tồn tại lỗ hổng loại này
Trang 35<p>Name: <input type="text" name="name" /><br />Comment: <textarea name="comment" rows="10" cols="60"> </textarea><br />
<input type="submit" value="Add Comment" /></p>
phép thêm đoạn javascript vào mã nguồn Người sử dụng sẽ vô tình gửi các cookies (những cookies liên quan đến ứng dụng) đến evil.example.org và kịch bản nhận steal.php
có thể truy cập tất cả các cookie trong $_GET['cookies'].
Lọc ra bất kì một đoạn mã JavaScript, VBScript nào.
Lọc dấu nháy đơn hay kép
Lọc kí tự Null (khả năng thêm một đoạn mã bất kì sau kí tự Null khiến cho ứng dụng dù đã lọc bỏ thẻ <script> vẫn không nhận ra do ứng dụng nghĩ rằng chuỗi đã kết thúc từ kí tự Null này).
Xóa những kí tự “>”, “<”.
Mã hóa các kí tự đặc biệt theo chuẩn riêng
Ta có thể sử dụng hàm htmlentities() để lọc dữ liệu gửi đến client Hàm này chuyển đổi
tất cả các ký tự đặc biệt thành ký hiệu HTML tương đương với giá trị ban đầu của nó đượcbảo tồn
Thay đổi sau làm cho đoạn mã hiển thị một ý kiến comment an toàn:
<?php