Tải bản đầy đủ (.docx) (31 trang)

Tiểu luận An toàn và bảo mật hệ thống thông tin Cách thức thu thập dữ liệu tự động từ 1 website và cách phòng chống sao chép dữ liệu cho website

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (845.13 KB, 31 trang )

NGÀNH HỆ THỐNG THÔNG TIN QUẢN LÝ
––––oo0oo––––
ĐỀ TÀI:Cách thức thu thập dữ liệu tự động từ 1 website và cách phòng chống
sao chép dữ liệu cho website
GVHD: Th.s Trương Hoài Phan.
Lớp: K09406
Lâm Hoàng Anh K094061100
Vũ Thanh Tiến Dũng K094061113
Nguyễn Thị Diệu Anh K094061102
Trần Quang Đạt K094061117
Đỗ Minh Trung K094061206
Hồ Chí Minh, Ngày 09 tháng 11 năm 2014
K09406
Mục Lục
I. Tổng quan đề tài.
1. Lý do chọn đề tài
Ngày nay công nghệ thông tin phát triển vượt trội, Internet phổ biến rộng rãi,
kho tài nguyên trên Internet ngày càng thêm phong phú. Mọi tài nguyên trên
internet đa số đều thông qua các website, các website như là sợi dây kết nối
mọi người lại với nhau, thông qua website mọi người có thể liên hệ, trao đổi,
chia sẻ với nhau một cách nhanh chóng và hiệu quả. Vì lẽ trên nội dung của
website là hết sức quan trọng. Đối với doanh nghiệp nó thậm chí được so sánh
như là một tài nguyên và cần phải bảo vệ.
Xuất phát từ nhu cầu thực tế đó, nhóm đã quyết định chọn đề tài các phương
thức thu thập dữ liệu từ một website và cách phòng chống sao chép dữ liệu cho
website để nghiên cứu.
2. Mục tiêu
Tìm hiểu cách thức thu thập, tìm kiếm các liên kết trên website để lấy nội
dung, cách bóc tách, xử lý dữ liệu thu thập được. Từ đó tiến hành phòng chống
việc lấy nội dung website.
Tiến hành thu thập nội dung, và xử lý dữ liệu của một website thực tế. Đồng


thời xây dựng tạm một website để áp dụng cá biện pháp phòng chống đã tìm
hiểu được.
3. Đối tượng và phạm vi nghiên cứu
Page 2
K09406
Đối tượng ngiên cứu của đề tài là việc tập trung nghiên cứu Cơ sở lý thuyết
tổng quan về cách thức thu thập nội dung website.
Phạm vi nghiên cứu áp dụng cho một website tin tức.
4. Phương pháp nghiên cứu
Phương pháp bàn giấy: Nhóm thực hiện việc thu thập tài liệu qua Internet về
cách thức tiến hành lấy nội dung và xử lý nội dung website. Tài liệu sử dụng
chủ yếu là các tài liệu tìm trên Google.
Phương pháp thực nghiệm : Với phương pháp này, nhóm tiến hành thực hiện
thực tế với website mẫu.
II. Nội dung đề tài.
A. Lấy thông tin:
1. Cơ sở lý thuyết:
Dựa trên mô hình tìm kiếm thông tin Crawler – Web Spider(CWS), CWS có khả
năng tìm kiếm và thu thập tài nguyên trên Internet (hình ảnh, email, số điện thoại,
bài viết, tài liệu,…) tùy theo nhucầu.
2. Mô tả quá trình hoạt động:Các công cụ CWS hoạt động dựa trên 1 chu trình
vòng lặp và có điểm dừng.
• Input: Website hoặc web page
• Output: Text (data)
Website spider sẽ tiến hành nhận Input là website hoặc web page (web page gồm
nhiều web page), xác định yêu cầu nội dung tìm kiếm, thu thập; xác định phạm vi
hoạt động.
Với các tiêu chí như trên, Web spider tiến hành điều khiển các robot (con bọ có
chức năng tìm kiếm, thu thập) duyệt các trang web trong phạm vi xác định, request
đến Server và nhận Page source của mỗi trang về, sau đó tiếp tục quá trình hoạt

động.
Page 3
K09406
Một bộ phận Web spider sẽ tiến hành nhận các Page source được trả về, xác định
yêu cầu nội dung tìm kiếm, thu thập, tiến hành quá trình bóc tách dữ liệu.
Đối với các Page source khớp với nội dung cần thu thập, sẽ được lưu vào
Database. Ngược lại, nếu không khớp, tiếp tục vòng lặp tìm kiếm và thu thập đến
khi khớp nội dung thì dừng lại.
3. Cấu trúc Crawler-Web spider:
Cấu trúc của Crawler – Web Spider
Page 4
K09406
Một CWS có 4 phần chính:
• Thành phần giao diện người dùng điều khiển.(UI Control)
• Thành phần Robot (tìm kiếm trang web)
• Thành phần thu thập dữ liệu thô – Page source(Crawler)
• Thành phần bóc tách dữ liệu (Extractor)
3.1 Thành phần UI Control:
Giao diện hỗ trợ người dùng điều khiển được trạng thái hiện tại của quá trình; có
thể tùy chỉnh các điều kiện, phạm vi, mục tiêu tìm kiếm và nội dung cần thu thập
từ website nào.
3.2 Thành phần Robot:
Tìm kiếm các link website. Có 2 phương pháp tìm kiếm: tìm kiếm theo cây và tìm
kiếm theo nội dung.
• Đối với tìm kiếm theo cây có 2 phương pháp: tìm kiếm theo chiều sâu và tìm
kiếm theo chiều rộng.
Tìm kiếm theo chiều rộng
Page 5
K09406
Tìm kiếm theo chiều sâu

• Đối với tìm kiếm theo nội dung: sử dụng phương pháp vét cạn, lấy tất cả các
phần tử link liên kết trongnội dung thu thập được, tiếp tục mở rộng tìm kiếm
nội dung sang các trang web khác, và quá trình dừng lại khi gặp điều kiện kết
thúc được đặt ra ở thành phần UI.
3.3 Thành phần thu thập dữ liệu thô (Crawler):
Thực hiện chức năng Request tới Web server đối với từng link liên kết, sau đó trả
về Page source dạng HTML.
Crawler sử dụng 1 số phương thức truyền dữ liệu GET, POST,…gửi Request đến
Web sever, yêu cầu nội dung của trang web.
3.4 Thành phần bóc tách dữ liệu (Extractor):
Nhận yêu cầu từ Robot, Extractor lấy nội dung Page source được trả về từ quá
trình Crawler và tiến hành phân tích, bóc tách theo yêu cầu.
Có 3 phương pháp hỗ trợ việc bóc tách :
• Html Agility Pack: kết hợp với chức năng Xpath, chuyển dữ liệu thô (HTML)
sang XHTML (HTML + XML), chuyển dữ liệu thành dạng DOM, thu thập nội
dung theo dạng cây.
• Regular expression: Xác định điểm đầu và điểm kết thúc của nội dung cần thu
thập.
• SubString: Xác định nội dung cần lấy bắt đầu từ vị trí nào và nội dung dài bao
nhiêu chữ cái.
4. Xây dựngCrawler-Webspider đơn giản
4.1 Xây dựng UI Control
• Mục tiêu: Hỗ trợ người dùng tùy chỉnh các giá trị: địa chỉ website cần thu thập,
điều kiện thu thập, nội dung thu thập.
Page 6
K09406
• Demo giao diện:
4.2 Xây
dựng Robot
• Mục tiêu: duyệt các đối tượng có thể là một website hoặc chuỗi nhiều website.

• Các phương pháp tiếp cận: Sitemap, RSS, Link Onpage
o RSS
a. Giới thiệu RSS
RSS (viết tắt từ Really Simple Syndication) là một tiêu chuẩn định dạng tài
liệu dựa trên XML nhằm giúp người sử dụng dễ dàng cập nhật và tra cứu
thông tin một cách nhanh chóng và thuận tiện nhất bằng cách tóm lược thông
tin vào trong một đoạn dữ liệu ngắn gọn, hợp chuẩn.
b. Mô tả cách lấy link RSS
Tìm kiếm link RSS của trang web:
Sau khi xác định được link địa chỉ RSS của trang web, tiến hành gửi nội dung
Page Source cho Crawler với yêu cầu trả về danh sách các địa chỉ liên kết.
Một số ví dụ địa chỉ RSS:
Dantri.com.vn />Vnexpress.net />Thanhnien.com.vn />24h.com.vn />Tuoitre.vn />Mfo.mquiz.net />Page 7
K09406
 Hầu hết các trang web tin tức hiện nay đều hỗ trợ RSS
c. Các bước thực hiện
- Tìm kiếm link RSS:
 Cách 1: Dùng Crawler đọc Page source của địa chỉ trang web, dùng
Extractor tìm kiếm link RSS với công thức so khớp:
alcollect =
GCF.getObject(nd,“<link(.*)type=\"application/rss+xml\”(.*)href=\"(.
*)\" />”);
Return alcollect[1];
 Cách 2: Xây dựng sẵn 1 thư viện các tên đường dẫn RSS thường hay sử
dụng của website: /rss, /rss/feed/, /feed, /rss.xml, /*.rss…sau đó tiến
hành lắp ráp thử từng địa chỉ với địa chỉ trang web, tiến hành chạy từng
link và kiểm tra xem địa chỉ nào có Content-Type bằng “text/xml”.
Tạo mảng ar_rss chứa danh sách các đuôi RSS thườn gặp:
foreach(String rss in ar_rss){
String test_rss = url + rss;

string nd = GCF.getreader(str);
if(nd.ContentType ==”text/xml”);
return True;
}
return False;
- Tạo mảng ArRSS chứa danh sách đuôi RSS.
- Chạy vòng lặp ArRSS, cộng chuỗi các phần từ trong mảng với địa chỉ trang
web và đọc nội dung từng trang.
- Kiểm tra, nếu ContentType của địa chỉ trang nào là text/xml gán cho biến
Url_Rss.
- Tạo mảng Array Listalcollect.
- Khai báo biến str kiểu String là biến chứa đường link của trang web.
- Gán biến str vào từng thành phần trong mảng alcollect.
- Dùng hàm Getreader để lấy nội dung trang web.
- Khai báo biến nd để chứa nội dung html đã lấy từ trang web khi dùng hàm
Getreader.
- Khai báo biến link dạng chuỗi có định dạng "href=\"(?<Link>.*?)\""
- Dùng hàm GetObject để lấy các dòng có cùng định dạng với biến link từ chuỗi
nội dung đã lấy về ở trên.
- Gán các dòng link đã lấy vào mảng alcollect.
- Dùng vòng lặp foreach lấy từng link trong mảng và sử dụng hàm
IsLinkWebite để loại bỏ các link ngoài.
- Xóa các link sai, giữ lại các link đúng và add vào mảng alcollect.
d. Code demo.
Page 8
K09406
ArrayList alcollect = new ArrayList();
string str = " /> alcollect.Add(str.ToString());
string nd = GCF.getreader(str);
string link = "href=\"(?<Link>.*?)\"";

alcollect = GCF.getObject(nd, link);
for (int i = 0; i < alcollect.Count; i++) {
String a = alcollect[i] as String;
bool b = GCF.IsLinkWebsite(str, a);
if (b == false) {
alcollect.RemoveAt(i);
}
else {
alcollect.Add(i);
}
}
Return alcollect;
e. Kết quả
f. Ưu điểm
- Lấy được hầu hết các link, có định dạng như yêu cầu.
- Dễ sử dụng.
- Tốc độ xử lý nhanh.
- Hầu như các trang web hiện nay đều hỗ trợ RSS, khả năng ứng dụng cao.
g. Nhược điểm
- Hiệu quả sử dụng thấp trong trường hợp có nhiều loại link khác nhau.
- Chỉ áp dụng được cho các trang web hỗ trợ RSS, nên hạn chế trong việc lấy
link của các trang web khác.
Page 9
K09406
- Tùy vào mỗi trang web mà địa chỉ RSS sẽ thay đổi nên việc xác định link
RSS cũng gặp khó khăn.
o Sitemap
a. Giới thiệu Sitemap
Site map (sơ đồ của một website) là một danh lục liệt kê tất cả các mục thông
tin trên trang web của bạn cùng sự mô tả ngắn gọn cho các mục thông tin đó.

b. Mô tả cách lấy link trên Sitemap
Xây dựng sẵn 1 thư viện các tên đường dẫn Sitemap thường hay sử dụng
của website: /sitemap.xml, /sodo.xml, /sitemaps.xml,… sau đó tiến hành
lắp ráp thử từng địa chỉ với địa chỉ trang web, tiến hành chạy từng link và
kiểm tra xem địa chỉ nào có Content-Type bằng “text/xml”.
Sau khi xác định được link địa chỉ Sitemap của trang web, tiến hành gửi
nội dung Page Source cho Crawler với yêu cầu trả về danh sách các địa chỉ
liên kết
c. Các bước thực hiện
- Hai cách mà nhóm đưa ra để xác định địa chỉ sitemap:
- Cộng thêm chuỗi “sitemap.xml” vào link website. Sau đó xác định link đó
có tồn tại
- Dò tìm địa chỉ sitemap trong robots.txt. Sau đó tiếp tục đọc nội dung khi đã
biết được địa chỉ sitemap
- Tạo mảng ar
- Dùng hàm Getreader để lấy nội dung trang web. Và dùng hàm GetObject
để lấy ra chuỗi có định dạng "<loc>(.*)</loc>"trên nội dung đã đọc từ
sitemap
- Sau đó trả kết quả link đọc được về mảng ar
d. Code demo
public static ArrayList linkinsitemap(string link_sitemap) {
ArrayList ar = new ArrayList();
ar = GCF.getObject(GCF.getreader(link), "<loc>(.*)</loc>",
1);
return ar;
}
e. Kết quả
Page 10
K09406
f. Ưu điểm

- Lấy được tất cả các link, có định dạng như yêu cầu.
- Dễ sử dụng.
- Tốc độ xử lý nhanh.
- Các file sitemap.xml của các website đều có cấu trúc giống nhau
g. Nhược điểm
- Tùy vào mỗi trang web mà địa chỉ sitemap sẽ khác nhau nên việc xác định
link sitemap cũng gặp khó khăn.
- Link trong sitemap khoongphair là toàn bộ tất cả các link trên website.
o Link Onpage
a. Giới thiệu Link Onpage:
Link OnPage là các liên kết trên trang HTML, liên kết đó là những liên kết
dẫn tới 1 trang nào đó trên website. Các link nào không bao gồm các link:
hình ảnh, javascript, css.
b. Mô tả các lấy link Onpage:
Nhập địa chỉ của Website, tiến hành phân tích, lấy tất cả các Link Onpage
trên trang đã nhập. Lúc này ta lưu đường dẫn của trang đã phân tích vào 1
HashSet visited và những link lấy được từ trang đã phân tích vào 1 HashSet
Unvisited. Tiếp tục phân tích từng link một trong Unvisited cho tới khi nào
hashset này không còn phần tử nào. Lúc này, ta được hashset Visited lưu tất
cả các link của website.
Page 11
K09406
c. Các bước thực hiện:
- Sử dụng DLL: HtmlAgilityPack
- Tạo mới 1 Class linkOnPage.cs gồm có 2 hàm chính:
o getAllLinksWebsite: nhận vào 1 URL trả về ArrayList chứa tất cả
các link của Website
 Thuật toán:
• Tạo ra 1 Hashset unvisited để chứa các link chưa được
kiểm tra

• Tạo ra 1 Hashset visited để chứa các link đã kiểm tra
• Thực hiện vòng lặp:
o Nếu trong unvisited vẫn còn phần tử thì
 Lấy phần tử đầu tiên trong unvisited đưa
vào biến xurl
 Xóa phần tử vừa lấy trong unvisited
 Thêm phần tử vừa lấy vào visited
 Load HTML của xurl và xét mỗi thẻ a
trong HTML này
• Nếu href chưa có trong visited thì
thêm vào unvisited
o Nếu trong unvisited không còn phần tử nào thì
thoát vòng lặp
• Trả về visited chứa links của website.
 Code demo:
public static ArrayList getAllLinksWebsite(string url) {
ArrayList result = new ArrayList();
HashSet<string> unvisited = new HashSet<string>();
HashSet<string> visited = new HashSet<string>();
unvisited.Add(url);
while (unvisited.Count != 0) {
string xurl = unvisited.First();
unvisited.Remove(xurl);
visited.Add(xurl);
result.Add(xurl);
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(GCF.getreader(url));
foreach (HtmlNode link in
doc.DocumentNode.SelectNodes("//a[@href]")) {
HtmlAttribute att = link.Attributes["href"];

if (!visited.Contains(att.Value)) {
Page 12
K09406
if (!att.Value.Contains("#") && att.Value.Contains(url))
{
unvisited.Add(att.Value);
}
}
}
}
return result;
}
o getAllLinksOnPage: nhận vào 1 url và trả về 1 HashSet chứa tất cả
các link trên trang vừa truyền vào
 Code demo:
public static HashSet<string> getAllLinksOnPage(string url) {
HashSet<string> result = new HashSet<string>();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(GCF.getreader(url));
try {
foreach (HtmlNode link in
doc.DocumentNode.SelectNodes("//a[@href]")) {
HtmlAttribute att = link.Attributes["href"];
if (!att.Value.Contains("#") && att.Value.Contains(url))
{
result.Add(att.Value);
}
}
}
catch (Exception)

{
}
return result;
}
d. Code demo
Page 13
K09406
e. Ưu điểm:
- Có thể lấy được tất cả các link trên website nhập vào bất kỳ.
- Dễ sử dụng.
f. Nhược điểm:
- Tốc độ chậm do thời gian phân tích mỗi trang để lấy link lâu.
- Tùy thuộc vào “độ nặng” của mỗi trang phân tích mà cho ra kết quả nhanh
hay chậm.
- Xảy ra hiện tượng trùng lắp link trong quá trình thu thập nếu không có hàm
kiểm tra.
g. Cách khắc phục:
- Tối ưu hóa hàm getReader()
4.1. Xây dựng Crawler
4.1.1. Mục tiêu: Thực hiện chức năng gửi 1 Request tới 1 URL, Web sever sẽ trả về nội
dung dạng HTML.
4.1.2. Các phương pháp: Http Web Request, Web Browser Control
o Phương pháp Http Web Request
a. Mục tiêu: Request tới Web sever 1 địa chỉ trang webvà trả về nội dung
HTML của trang đó.
b. Mô tả:
Nhập Input là 1 địa chỉ website, và trả ra Output là HTML của địa chỉ
website đó.
c. Code demo.
public static String getreader(string url){

try{
string webResponseStream = string.Empty;
HttpWebRequest request = null;
request = (HttpWebRequest)WebRequest.Create(url.Trim());
// Set value for request headers
request.Method = "GET";
Page 14
K09406
request.ProtocolVersion = HttpVersion.Version11;
request.AllowAutoRedirect = true;
request.Accept = "*/*";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
request.Headers.Add("Accept-Language", "en-us");
request.KeepAlive = true;
StreamReader responseStream = null;
HttpWebResponse webResponse = null;
// Get response for http web request
webResponse = (HttpWebResponse)request.GetResponse();
responseStream = new
StreamReader(webResponse.GetResponseStream());
// Read web response into string
webResponseStream = responseStream.ReadToEnd();
return webResponseStream;
}
catch {
return "null";
}
}
User Agent: Khai báo các thông tin chi tiết về trình duyệt sẽ được tạo ra để gửi tới

Websever.
Một số thông tin User Agent thường hay sử dụng:
- Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us)
AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b
Safari/531.21.102011-10-16 20:23:50
- Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us)
AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b
Safari/531.21.102011-10-16 20:23:10
- Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101
Firefox/7.0.12011-10-16 20:23:00
- Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; GT-I9100 Build/GINGERBREAD)
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.12011-
10-16 20:22:55
- Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR
2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR
1.1.4322)2011-10-16 20:22:33
- Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02011-10-16
20:21:42
Page 15
K09406
- Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML,
like Gecko) Chrome/14.0.835.202 Safari/535.12011-10-16 20:21:13
- Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+
(KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+2011-10-16
20:21:10
- Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)2011-
10-16 20:21:07
- Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101
Firefox/7.0.12011-10-16 20:21:05
- Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) rekonq

Safari/534.342011-10-16 20:21:01
- Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB6;
SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729;
Media Center PC 6.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)2011-10-16
20:20:48
- BlackBerry8300/4.2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/107
UP.Link/6.2.3.15.02011-10-16 20:20:17
- IE 7 ? Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322;
.NET CLR 2.0.50727; .NET CLR 3.0.04506.30)2011-10-16 20:20:09
- Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.23) Gecko/20110920
Firefox/3.6.23 SearchToolbar/1.22011-10-16 20:20:07
d. Ưu điểm:
- Dễ sử dụng, hỗ trợ hầu hết các User Agent.
e. Nhược điểm:
- Tốc độ nhanh, chậm phụ thuộc vào đường truyền Internet.
- Có một số website chặn phương thức GET, ví dụ: www.5giay.vn,
www.giacaphe.com ,…và không trả về đúng nội dung HTML theo yêu cầu.
- Nhận về đúng với nội dung Page source của trang web, có thể nội dung
không như mong muốn: bị mã hóa, bị redirect sang trang khác, trả về kết
quả null,…
o Phương pháp giả lập Web Browser.
a. Mục đích: tạo 1 Web Browser phía Client để mô phỏng lại 1 trình duyệt
web. Thông qua Web Browser giả lập, ta có thể lấy được nội dung HTML
theo yêu cầu.
b. Mô tả: Nhập địa chỉ của 1 trang web vào Web Browser giả lập, sau đó thực
hiện chức năng đọc nội dung Page source của hiện tại của Web Browser giả
lập.
c. Code demo.
public static String getWebBrowser(string url){
WebBrowser1.Navigate(url);

return WebBrowser1.DocumentText.ToString();
Page 16
K09406
}
d. Ưu điểm:
- Áp dụng được cho tất cả các trang web.
Dễ sử dụng.
e. Nhược điểm:
- Tốc độ chậm hơn so với Http Web Request vì phải load trang web trước khi
Crawler.
4.2. Xây dựng Extractor.
4.2.1. Mục tiêu: Trả về đúng phần nội dung cần thu thập theo yêu cầu từ Robot.
4.2.2. Mô tả: Sau khi lấy được Page source từ quá trình Crawler, Extractor xác định phần
nội dung cần lấy, thực hiện chức năng bóc tách và trả về kết quả.
4.2.3. Phương pháp: Html Agility Pack, Regular expression, SubString.
o Html Agility Pack
a. Giới thiệu: Html Agility Pack là thư viện của .NET, xây dựng cho nhu cầu xử lý
văn bản html và trích xuất các phần tử DOM trong văn bản HTML, sửa lỗi và
thao tác xpath, xlink, xpointer trên văn bản html.
b. Mô tả: Input là 1 nội dung HTML và điều kiện cần thu thập, Output là 1 chuỗi
hoặc 1 văn bản.
c. Code demo
public static ArrayList getAllLinksWebsite_ Html Agility Pack(string PageSource) {
ArrayList result = new ArrayList();
HtmlDocument doc = new HtmlDocument();
//get page source url
doc.LoadHtml(PageSource);
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]")){
HtmlAttribute att = link.Attributes["href"];
result.Add(att.Value);

}
Return result;
}
d. Ưu điểm:
Page 17
K09406
- Dễ sử dụng.
- Hỗ trợ nhiều chức năng được cung cấp bởi thư viện .dll.
- Trả về đúng thông tin theo yêu cầu.
e. Nhược điểm:
- Phương pháp này chỉ áp dụng được trên .NET, hạn chế ngôn ngữ.
o Regular expression (RE)
a. Giới thiệu: RE là một ngôn ngữ mạnh dùng để mô tả và thao tác văn bản
nâng cao. RE được xác định bởi công thức quy tắc của chính bản thân nó.
Công thức quy tắc có chức năng so khớp với nội dung Page source và trả về
kết quả đúng theo với quy tắc này.
b. Mục tiêu: trả về 1 chuỗi con được trích xuất từ Page source.
c. Mô tả: getbetween_RE lấy nội dung Input là 1 Page source, xác định công
thức quy tắc so khớp và tiến hành bóc tách, trả về Output 1 hoặc nhiều kết
quả được so khớp đúng cú pháp.
d. Code demo:
Lấy tất cả các thành phần nội dung khớp công thức quy tắc
public static ArrayList getObject(String content,String regex,int option=1) {
ArrayList ar = new ArrayList(); ;
Regex regu = new Regex(regex);
MatchCollection Collect = regu.Matches(content);
foreach (Match abc in Collect) {
ar.Add(abc.Groups[option].Value.ToString().Trim());
}
return ar;

}
//lấy nội dung nằm giữa 2 vị trí xác định
public static string getbetween(string content, string start, string end) {
Regex regex = new Regex(start);
string[] laydau = regex.Split(content);
Regex regex2 = new Regex(end);
string[] laycuoi = regex2.Split(laydau[1]);
return laycuoi[0];
}
e. Ưu điểm:
- Xử lý linh động, khai thác được hầu hết các nội dung.
- Hỗ trợ hầu hết các ngôn ngữ lập trình.
f. Nhược điểm:
- Phải am hiểu về các công thức quy tắc của RE.
g. Kết quả:
Page 18
K09406
o SubString
a. Giới thiệu: là 1 hàm có sẵn trong .NET và các ngôn ngữ khác. Có chức
năng trả về nội dung từ Page source khi xác định được vị trí đầu và số
lượng từ sẽ lấy.
b. Code demo
public static string getSubString(string content, int start, int lenght) {
return input.Substring(start, lenght);
}
c. Ưu điểm
Dễ sử dụng, hỗ trợ hầu hết các ngôn ngữ lập trình.
d. Nhược điểm
Page 19
K09406

Nội dung cần lấy phải cố định.
Không có tính linh động.
B. Phòng chống:
Dựa vào những nhược điểm của công cụ CWS, người quản trị web sẽ thực hiện 1
số công việc nhằm hạn chế “những vị khách không mời mà tới”. Ngoài ra nhóm sẽ
đưa ra thêm 1 số biện pháp phòng chống bổ sung.
1. Hạn chế việc lấy link thông qua Sitemap
Mục tiêu: Bởi vì mục tiêu duy nhất của việc tạo file sitemap.xml của mỗi
website là để SEO vậy nên cần tránh sự tìm thấy địa chỉ file sitemap xml của
các Tool CWS.
Mô tả:
• Không đặt địa chỉ sitemap.xml trong file robots.xml và các file khác có liên
quan.
• Chỉ duy nhất khai báo địa chỉ file sitemap.xml với công cụ tìm kiếm như
google, yahoo,…
• Tạo nhiều file sitemap xml, từ sitemap này dẫn đến file sitemap khác, hoặc
mỗi file sitemap chỉ chứa 1 phần liên kết link của website.
Ví dụ: file sitemapA.xml chứa link của chuyên mục A, file sitemapB.xml
chứa link của chuyên mục B.
Làm như vậy thì hạn chế số lượng thu thập của các CWS.
• Thay đổi tên, đường dẫn, định dạng của file sitemap:
Mặc định các website thường theo thói quen đặt file sitemap theo tên,
đường dẫn và định dạng sau: http://your-domain/sitemap.xml, vậy nên cần
thay đổi thói quen này để các Tool không tìm ra đường dẫn .
Nén các file sitemap thành các định dạng hỗ trợ công cụ tìm kiếm: *.zip,
*.gz
Ví dụ:
Địa chỉ file sitemap Độ an toàn
Thấp
Page 20

K09406
Tương đối
• Không đưa các địa chỉ nhạy cảm như: trang upload, trang đăng nhập admin,
trang thông tin cá nhân,…vào sitemap.xml.
Bởi vì nếu các CWS (kể cả google) nếu xác địnhđược các đường dẫn link
này, có thể các thông tin nhạy cảm sẽ bị thu thập và sẽ bị public, có thể sử
dụng vào các mục đích xấu khác.
Ưu điểm:
• Dễ thực hiện.
• Tăng độ an toàn cho file sitemap.
2. Hạn chế việc lấy link thông qua RSS
a. Mục tiêu: phòng chống và hạn chế tối đa các link RSS mà robot lấy được từ
trang web.
b. Mô tả:
• Không đặt tên đường dẫn đến thư mục RSS bằng những cái tên phổ biến
thường sử dụng của website như: /rss, /rss/feed/, /feed, /rss.xml, /*.rss…
• Chia nhỏ thư mục RSS thành các chuyên mục với từng đường dẫn riêng
biệt để hạn chế hoạt động của Crawler.
Ví dụ:
c. Ưu điểm:
• Gây khó khăn cho các phần mềm khi thực hiện lấy link tự động.
• Dễ thực hiện.
d. Nhược điểm:
Page 21
K09406
• Chưa thực sự gây khó khăn cho các Tool CWS nếu người lập trình các Tool
đó tạo sẵn 1 thư viện những cái tên phổ biến thường sử dụng cho thư mục
RSS và lập trình để chúng lắp ghép tự động các đường dẫn đến mục RSS.
• Tất cả các biện pháp trên mới chỉ ở mức phòng tránh chứ chưa thực sự bảo
mật được thông tin trên website.

3. Hạn chế chức năng Crawler
Mục đích: Hạn chế khả năng Crawler, thu thập PageSource của các CWS
3.1. Hạn chế cơ chế Http Web Request:
a. Mục đích:
b. Mô tả:
• Khi Http Web Request thực thi sẽ gửi kèm theo các thông số về trình duyệt,
lợi dụng điểm này để ta có thể kiểm tra, và điều khiển kết quả nội dung
mong muốn.
• Hạn chế khả năng Request liên tục tới Server: Khi thu thập được các đường
dẫn Link, CWS sẽ phải chạy từng liên kết đó, mỗi lần thực hiện hàm
get_content() sẽ phải gửi Request 1 lần tới server, như vậy những tool CWS
sẽ tác động Request liên tục lên Server, ta có thể block những IP có nhiều
Request liên tục trong 1 khoảng thời gian nào đó bằng cách thiết lập
Firewall phần cứng, ISA Server, Dynamic IP Restrictions IIS 7. Lúc này,
chương trình sẽ báo lỗi hoặc báo kết thúc.
c. Code ví dụ: Nếu Tool CWS chưa gửi thông tin trình duyệt thì sẽ được chuyển
đến trang gucafe.com còn ngược lại, thì nội dung CWS thu được sẽ là "<meta
http-equiv=\"refresh\" content=\"5;url \">
if (!headers_sent()){
Response.Redirect(" ");
}
Else{
Response.Write( "<meta http-equiv=\"refresh\" content=\"0;url
\">");}
d. Ưu điểm: Phòng chống được ddos, spam, hạn chế được khả năng Crawler của
các Tool CWS
e. Nhược điểm: Tạo phiền phức với người sử dụng.
3.2. Sử dụng mã bảo vệ Captcha:
a. Mục đích
b. Mô tả: Captcha (Completely Automated Public Turing test to

tell Computers andHumans Apart) là 1 chuỗi ký tự được phát sinh ngẫu
Page 22
K09406
nhiên. Được dùng để xác định xem người dùng có phải là con người hay
không.
Một loại CAPTCHA phổ biến yêu cầu người dùng phải nhập các chữ cái
trong một tấm hình méo mó, đôi khi cùng với một dãy số hoặc chữ lờ mờ
xuất hiện trên màn hình.
c. Code demo:
string[] fonts = { "Arial Black", "Lucida Sans Unicode",
"Comic Sans MS" };
const byte LENGTH = 5;
// chuỗi để lấy các kí tự sẽ sử dụng cho captcha
const string chars = "0123456789";
using (Bitmap bmp = new Bitmap(120, 30)) {
using (Graphics g = Graphics.FromImage(bmp)) {
// Tạo nền cho ảnh dạng sóng
HatchBrush brush = new
HatchBrush(HatchStyle.BackwardDiagonal, Color.White,
Color.White);
g.FillRegion(brush, g.Clip);
// Lưu chuỗi captcha trong quá trình tạo
StringBuilder strCaptcha = new StringBuilder();
Random rand = new Random();
for (int i = 0; i < LENGTH; i++) {
// Lấy kí tự ngẫu nhiên từ mảng chars
Page 23
K09406
string str =
chars[rand.Next(chars.Length)].ToString();

strCaptcha.Append(str);
// Tạo font với tên font ngẫu nhiên chọn từ mảng
fonts
Font font = new Font(fonts[rand.Next(fonts.Length)], 12,
FontStyle.Regular | FontStyle.Italic);
// Lấy kích thước của kí tự
SizeF size = g.MeasureString(str, font);
// Vẽ kí tự đó ra ảnh tại vị trí tăng dần theo i, vị trí
top ngẫu nhiên
g.DrawString(str, font,
Brushes.OrangeRed, i * size.Width + 3,
rand.Next(2, 10));
font.Dispose();
}
// Lưu captcha vào session
Session["captcha"] = strCaptcha.ToString();
// Ghi ảnh trực tiếp ra luồng xuất theo định dạng gif
Response.ContentType = "image/GIF";
bmp.Save(Response.OutputStream,
ImageFormat.Gif);
}
}
3.3. Thiết lập Session:
a. Mô tả:
• Session là khoảng thời gian người sử dụng giao tiếp với 1 ứng dụng, quản
lý các phiên làm việc giữa người sử dụng và hệ thống. Việc quản lý phiên
làm việc này sẽ giúp bạn tạo ra sự chứng thực hiệu quả bởi việc xác nhận
thông tin trước khi truy cập vào một phân vùng cố định.
• Thiết lập Session trên website, muốn truy cập được vào 1 trang bất kì phải
thông quan trang Gateway mới đến được trang muốn đến.

b. Demo: Ở dây nhóm thao tác trên PHP và sử dụng 1 ứng dụng có sẵn tích hợp
cho diễn đàn VBB.
Ứng dụng DnP Firewall cho VBB:
Page 24
K09406
Trang bảo vệ trước khi bạn truy cập được vào trang webDnP Firewall
B1: Upload tất cả tập tin lên thư mục chính của diễn đàn bạn
B2: Mở global.php bằng Notepadd
Tìmcode:
define('VB_AREA','FORUM');
Thêm vào trước đó:
if(file_exists('dnp_fw.php')){require_once('dnp_fw.php');}
B3: Lưu vào tải lại global.php lên server.
3.4. Mã hóa các tham số Parameter trên đường dẫn link:
a. Mô tả:
• Parameter là các tham số truyền vào giá trị trong thủ tục thao tác với
CSDL.
• Những tham số thông thường, đơn giản p=1,2,3,…việc mã hóa các tham số
sẽ làm mất đi tính quy luật của website như quy luật phân trang, quy luật
đặt tên danh mục,…, làm Crawler khó xác định đường đi hơn.
b. Code demo:
/>Ls-
SiQf7n4CwBw&sqi=2&start=20&sa=N&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp
=e5c4e0564335cb22&bpcl=37189454&biw=1366&bih=643.
//mã hóa
Page 25

×