Trong tình hình nội dung trên Internet hiện nay người sáng tạo nội dung thì ít mà copier, reup thì đông hơn quân Nguyên. Các nội dung dễ bị copy và reup nhất dĩ nhiên là các đoạn văn bản xuất hiện trên các trang web. Nhiều khi bài viết trên blog chính chủ còn ít view hơn cùng bài viết đó nhưng được copy tới nơi có cộng đồng lớn hơn.
Việc này càng nghiêm trọng hơn với các nội dung như sách, truyện đều là cả bầu trời chất xám của tác giả. Vừa upload lên một Network nào đó như Wattpad, Truyenyy đã bị crawl mất :((
Nhưng khi chấp nhận gửi dữ liệu tới người dùng mà lại qua dạng các trang web, gần như chưa có cách nào để có thể bảo vệ hoàn toàn nội dung đó của bạn không bị đánh cắp! Nhưng chúng ta có thể cản trở việc làm đó, khiến nó không còn đơn giản như copy/paste. Cũng giống như javascript obfuscator không thể che giấu hoàn toàn những đoạn script mà ta sử dụng trên web của mình nhưng nó làm nản lòng hầu hết những tay hay vooc vạch tìm lỗ hổng :)). Đối với các cao thủ có thể đọc hiểu và có thể vượt qua những rào cản thì yên tâm rằng họ biết tính toán và nhận ra cái giá phải trả là quá cao so với những gì nhận được.
Vậy với vấn đề đặt ra ở trên! Bạn là một nhà sáng tạo nội dung. Ví dụ như viết blog, làm sao để nội dung của mình được an toàn?
Chống Crawler by rice
Crawler loại này thường chỉ biết dùng thao tác copy + paste. Để làm khó loại này chúng ta cần một đoạn js hoặc css đơn giản:
//disable mouse drag select start
document.onselectstart = new Function('return false');
function dMDown(e) { return false; }
function dOClick() { return true; }
document.onmousedown = dMDown;
document.onclick = dOClick;
$("#document").attr("unselectable", "on");
//disable mouse drag select end
//disable right click - context menu
document.oncontextmenu = new Function("return false");
//disable CTRL+A/CTRL+C through key board start
//use this function
function disableSelectCopy(e) {
// current pressed key
var pressedKey = String.fromCharCode(e.keyCode).toLowerCase();
if (e.ctrlKey && (pressedKey == "c" || pressedKey == "x" || pressedKey == "v" || pressedKey == "a")) {
return false;
}
}
document.onkeydown = disableSelectCopy;
CSS:
//disable selection through CSS for different browsers
#document, #ctl00_MasterPageBodyTag{
user-select: none;
-ms-user-select: none;
-o-user-select:none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-webkit-touch-callout: none;
}
Sources: https://stackoverflow.com/questions/9958478/how-to-disable-copy-paste-browser
Chống Crawler HTML
Crawler HTML là một loại crawler do mình tự định nghĩa ra! Đó là những thanh niên chỉ cào HTML về rồi parse DOM đọc dữ liệu. Với loại Crawler này việc bảo vệ content là rất đơn giản. Chỉ cần load dữ liệu không muốn bị lấy được bằng Js (Ajax, Socket) là đối tượng không thể có được những gì hắn muốn.
Chống Crawler nâng cao
Crawler ở một đẳng cấp cao hơn khi xây dựng trên giả lập trình duyệt (puppeteer, selenium). Khi được lên kịch bản đủ tốt chúng có thể thu thập được mọi thứ chúng muốn :(( . Do vậy chúng ta cần những biện pháp mạnh tay hơn để xử lý thanh niên này. Về cơ bản và là điều hiển nhiên khi đã gửi dữ liệu đi để phục vụ người dùng thì họ đã có được nó rồi. Nhưng ở đây chúng ta lại muốn họ nhìn thấy nhưng không được mang đi! Giải pháp ở đây là làm khó những thanh niên tham lam này.
- Gây lú khi đọc source code!
Cũng như js hay css chúng ta thường minify lại để giảm dung lượng truyền tải và một công đôi việc, file Js được minify thường không ai muốn bơi trong đó hết. Nay áp dụng vào toàn hệ thống source code gửi về trình duyệt với CSS modules. Phương pháp này hiện mình cũng chỉ biết đến nó trên những hệ thống dùng client render (vuejs, react …). Cụ thể khi sử dụng CSS modules các class name sau khi compile sẽ trông như thế này:

Và mỗi lần compile chúng lại thay đổi :)).
- Không cho phép dùng Devtool
Cách này em đã áp dụng vào Eblog (maiamnho, khoelahanhphuc, nhatkylamdep). Khi không dùng chuột phải hay chọn vùng văn bản để copy. Các thanh niên có nghề thường dùng đến F12 thần thánh.

Nhưng Cracker Trap nói “Ở đây chúng tôi không làm như thế”.
Cracker Trap : https://www.npmjs.com/package/cracker-trap. Module cho phép stop devtool ngay khi chúng được bật nên! Khi lắng nghe sự kiện bật devtool chúng ta có thể xóa trắng nội dung trang nếu muốn. Mình đã áp dụng vào đồ án tốt nghiệp và thu hoạch khá tốt.
- Thay đổi thứ tự (nth) của các DOM
Khi không dựa dẫm được vào class name hay id của DOM để lấy dữ liệu thường crawler sẽ đùng đến Xpath, thứ tự vị trí tương đối của các thẻ. Chúng ta dễ dàng xử lý bằng cách thêm ngẫu nhiên một vài thẻ trong suốt hoặc thẻ ẩn vào cây DOM nhằm làm xáo trộn vị trí tương đối các thẻ với nhau.
- Limit Rate

Cái này mình vừa tìm hiểu được do một hôm đang crawl truyenfu**.vn nếu thong thả đọc chậm rãi thì mọi thứ rất ok, Nhưng khi đẩy thêm nhiều request cùng một lúc server sau đó báo lỗi 500, tưởng rằng server của họ sập nhưng ngay lập tức thấy vô lý với một site hơn 30tr view một tháng hệ thống sẽ rất kinh khủng (tất nhiên server vẫn sống rất tốt). Mình sẽ thử triển khai và viết vào bài nào đó trong tương lại.
- Đo tốc độ lướt bằng Cookie và dùng Capcha để chặn
Nếu trình duyệt không cho phép dùng cookie chúng ta cho hiện capcha liên tục với mỗi request! Nếu trình duyệt cho dùng cookie chúng ta lưu lại thời gian lướt giữa các page trong một khoảng nào đó. Nếu quá nhanh => hiện capcha.
Với tất cả các cánh nêu trên mình sẽ triển khai và trình bày quá trình vào một bài nào đó. Nhìn tổng quan hơn những phương pháp đó ngoài việc chống copy crawl chúng đều tối ưu hiệu suất cũng như tốc độ website. Ví dụ Css module làm giảm đáng kể kích thước file css khi classname được thu về rất gọn gàng, Rate limit để hạn chế DDOS, Capcha cũng hạn chế DDOS. Giúp server yếu vẫn có thể hoạt động tốt phục vụ tới giới hạn người dùng! Phần còn lại sẽ từ chối phục vụ luôn. Sẽ không xảy ra tình trạng tất cả mọi người đều không được phục vụ.
Câu hỏi khi được hỏi khi bảo vệ đồ án: “Em đã có cách nào chống lại khi web đã được load xong và họ lưu trang lại?” – đến bây giờ mình vẫn chưa tìm giải pháp cho trường hợp này, có anh em nào có ý kiến có thể góp ý bên dưới với ạ?
Bonus









(5 lượt thả tim)



