這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識(shí),希望對(duì)大家有所幫助
一、前言
中午休息的時(shí)候,閑逛公司內(nèi)網(wǎng),看到一個(gè)url,就想復(fù)制一下url,看看url對(duì)應(yīng)的內(nèi)容是啥,習(xí)慣性使用ctrl+c,然后ctrl+v,最后得到是 禁止復(fù)制,哦,原來是禁用了復(fù)制。這能難倒一個(gè)前端開發(fā)嗎?當(dāng)然不能。于是打開了控制臺(tái),這時(shí),發(fā)現(xiàn)頁面自動(dòng)執(zhí)行了一段立即執(zhí)行函數(shù),函數(shù)體里面是debugger代碼,然后手動(dòng)跳過debugger后,頁面已經(jīng)變成一個(gè)空白頁面了。
本文將簡單講解禁止復(fù)制、水印和禁止打開控制臺(tái)三個(gè)功能點(diǎn)的實(shí)現(xiàn)。
前面幾節(jié)是分功能講解,最后一節(jié)將會(huì)寫出完整的代碼,如何防止網(wǎng)站信息泄露。
二、禁止復(fù)制
現(xiàn)在有的復(fù)制網(wǎng)頁(常規(guī)網(wǎng)頁用戶,不開控制臺(tái)的情況)的內(nèi)容方式有:
- 選擇 -> ctrl+c(command + c)
- 選擇 -> 鼠標(biāo)右鍵 -> 復(fù)制
js攔截
相比user-select無法做到某一些內(nèi)容可以被選中
document.addEventListener('contextmenu', function(e) { e.preventDefault(); }, false); document.addEventListener('selectstart', function(e) { e.preventDefault(); }, false);
user-select
不難發(fā)現(xiàn),當(dāng)我們復(fù)制內(nèi)容的時(shí)候,首選是選擇目標(biāo)內(nèi)容,那我們可以禁用用戶的選擇目標(biāo)內(nèi)容。
css屬性u(píng)ser-select用于控制用戶是否能夠選擇(即復(fù)制)文本和其他頁面元素。它的作用是指定用戶在瀏覽網(wǎng)頁時(shí)是否能夠選擇和復(fù)制頁面上的文本和其他元素。
<h3>user-select: none;</h3> <div style="user-select: none;">我是捌玖,歡迎關(guān)注我喲,這兒是利用css樣式,測試能否禁用復(fù)制</div> <div style="user-select: none;">哈哈哈,當(dāng)然,這種方式是無效的,我只是玩下</div>
那user-select和pointer-event的區(qū)別是啥? pointer-events
? 指定在什么情況下 (如果有) 某個(gè)特定的圖形元素可以成為鼠標(biāo)事件的?target?(en-US)。通俗一點(diǎn)講,例如我們給某個(gè)元素設(shè)置了pointer-events: none
,當(dāng)我們點(diǎn)擊這個(gè)元素的時(shí)候,是不會(huì)觸發(fā)click事件,包括我們即使通過鼠標(biāo)也無法選中該元素。user-select
?用于控制用戶是否可以選擇文本。這不會(huì)對(duì)作為瀏覽器用戶界面(即?chrome)的一部分的內(nèi)容加載產(chǎn)生任何影響,除非是在文本框中。
注意:user-select是無法攔截input中的選中(鼠標(biāo)/ctrl+a)
攔截ctrl + a
每個(gè)人(系統(tǒng))使用使用組合鍵進(jìn)行復(fù)制,可能鍵是存在差異的,就拿我電腦是mac,默認(rèn)是command + a為復(fù)制,當(dāng)然是可以修改的,看個(gè)人使用習(xí)慣,所以我們要同時(shí)攔截掉ctrl + a 和 command + a。
document.keyDown = function(event) { const {ctrlKey, metaKey, keyCode} = event; if((ctrlKey || metaKey) && keyCode === 65) { return false; } }
攔截ctrl+c(command + c)
每個(gè)人(系統(tǒng))使用使用組合鍵進(jìn)行復(fù)制,可能鍵是存在差異的,就拿我電腦是mac,默認(rèn)是command + c為復(fù)制,當(dāng)然是可以修改的,看個(gè)人使用習(xí)慣,所以我們要同時(shí)攔截掉ctrl + c 和 command + c的。不可以直接攔截c鍵的輸入,會(huì)影響到input框的輸入
document.keyDown = function(event) { const {ctrlKey, metaKey, keyCode} = event; if((ctrlKey || metaKey) && keyCode === 67) { return false; } }
直接攔截鼠標(biāo)右鍵
該方法直接攔截了右鍵菜單的打開,主要用于攔截圖片的復(fù)制,菜單中的復(fù)制圖片的方法有多種(復(fù)制圖片、復(fù)制圖片地址等),暫時(shí)沒找到合適的方法攔截菜單中具體的某一項(xiàng)。
document.oncontextmenu = function(event){ if(event.srcElement.tagName=="IMG"){ alert('圖片直接右鍵'); return false; } };
三、水印
網(wǎng)站水印的主要作用是版權(quán)保護(hù)和網(wǎng)站標(biāo)識(shí)展示。具體來說,它可以在圖片上加上作者的信息或標(biāo)識(shí),防止他人未經(jīng)授權(quán)使用,有助于保護(hù)圖片的版權(quán)安全。同時(shí),它也可以在網(wǎng)頁中展示特定的標(biāo)識(shí)或信息,如網(wǎng)站的名稱、網(wǎng)址、版權(quán)信息等,有助于提高網(wǎng)站的知名度和品牌形象。
此外,網(wǎng)站水印還可以用于追蹤網(wǎng)站的非法使用和侵權(quán)行為。當(dāng)發(fā)現(xiàn)某個(gè)網(wǎng)站上出現(xiàn)了未經(jīng)授權(quán)的水印,就可以通過水印的信息追蹤到該網(wǎng)站的使用者,從而采取相應(yīng)的法律措施。
// 創(chuàng)建Canvas元素 const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); // 設(shè)置Canvas尺寸和字體樣式 canvas.width = 100; canvas.height = 100; context.font = '30px Arial'; context.fillStyle = 'rgba(0,0,0,0.1)'; // 繪制文字到Canvas上 context.fillText('捌玖', 10, 50); // 生成水印圖像的URL const watermarkUrl = canvas.toDataURL(); // 在頁面上顯示水印圖像(或進(jìn)行其他操作) const divDom = document.createElement('div'); divDom.style.position = 'fixed'; divDom.style.zIndex = '99999'; divDom.style.top = '-10000px'; divDom.style.bottom = '-10000px'; divDom.style.left = '-10000px'; divDom.style.right = '-10000px'; divDom.style.transform = 'rotate(-45deg)'; // 避免對(duì)用戶的交互產(chǎn)生影響 divDom.style.pointerEvents = 'none'; divDom.style.backgroundImage = `url(${watermarkUrl})`; document.body.appendChild(divDom);
四、禁止打開控制臺(tái)
禁止用戶打開控制臺(tái)文章來源:http://www.zghlxwxcb.cn/news/detail-776844.html
- 防止代碼被竊?。涸诳刂婆_(tái)中,用戶可以查看和修改網(wǎng)頁的源代碼,這可能會(huì)導(dǎo)致惡意用戶竊取您的代碼或敏感信息。通過禁止打開控制臺(tái),可以保護(hù)您的代碼和數(shù)據(jù)不被未經(jīng)授權(quán)的用戶訪問或篡改。
- 提高安全性:控制臺(tái)是網(wǎng)頁與用戶之間進(jìn)行交互的主要渠道之一,但也是潛在的安全風(fēng)險(xiǎn)之一。惡意用戶可以利用控制臺(tái)執(zhí)行惡意代碼、進(jìn)行釣魚攻擊等。禁止用戶打開控制臺(tái)可以減少這些潛在的安全風(fēng)險(xiǎn)。
- 保護(hù)系統(tǒng)資源:在控制臺(tái)中,用戶可以執(zhí)行各種操作,例如創(chuàng)建新文件、刪除文件等,這可能會(huì)對(duì)系統(tǒng)資源造成不必要的占用和破壞。禁止打開控制臺(tái)可以限制用戶的操作范圍,保護(hù)系統(tǒng)資源不被濫用。
- 防止誤操作:控制臺(tái)允許用戶進(jìn)行各種操作,但這也增加了誤操作的風(fēng)險(xiǎn)。禁止打開控制臺(tái)可以減少用戶誤操作的可能性,避免不必要的損失和風(fēng)險(xiǎn)。
let firstTime; let lastTime; setInterval(() => { firstTime = Date.now() debugger lastTime = Date.now() if (lastTime - firstTime > 10) { window.location.href = "about:blank"; } }, 100)
五、總結(jié)
// 防止用戶選中 function disableSelect() { // 方式一,js攔截 // 缺點(diǎn): 無法做到某一些內(nèi)容可以選中 document.onselectstart = function(event){ e.preventDefault(); }; // 方式:給body設(shè)置樣式 document.body.style.userSelect = 'none'; // 禁用input的ctrl + a document.keyDown = function(event) { const {ctrlKey, metaKey, keyCode} = event; if((ctrlKey || metaKey) && keyCode === 65) { return false; } } }; // 禁用鍵盤的復(fù)制 function disableCopy() { const {ctrlKey, metaKey, keyCode} = event; if((ctrlKey || metaKey) && keyCode === 67) { return false; } } // 禁止復(fù)制圖片 function disableCopyImg() { document.oncontextmenu = function(event){ if(event.srcElement.tagName=="IMG"){ alert('圖片直接右鍵'); return false; } }; }; // 生成水印 function generateWatermark(keyword = '捌玖') { // 創(chuàng)建Canvas元素 const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); // 設(shè)置Canvas尺寸和字體樣式 canvas.width = 100; canvas.height = 100; context.font = '30px Arial'; context.fillStyle = 'rgba(0,0,0,0.1)'; // 繪制文字到Canvas上 context.fillText(keyword, 10, 50); // 生成水印圖像的URL const watermarkUrl = canvas.toDataURL(); // 在頁面上顯示水印圖像(或進(jìn)行其他操作) const divDom = document.createElement('div'); divDom.style.position = 'fixed'; divDom.style.zIndex = '99999'; // 因?yàn)閐iv旋轉(zhuǎn)了45度,所以div需要足夠的大 divDom.style.top = '-10000px'; divDom.style.bottom = '-10000px'; divDom.style.left = '-10000px'; divDom.style.right = '-10000px'; divDom.style.transform = 'rotate(-45deg)'; // 防止對(duì)用戶的交互產(chǎn)生影響 divDom.style.pointerEvents = 'none'; divDom.style.backgroundImage = `url(${watermarkUrl})`; document.body.appendChild(divDom); } // 禁止打開控制臺(tái) function disbaleConsole() { let firstTime let lastTime setInterval(() => { firstTime = Date.now() debugger lastTime = Date.now() if (lastTime - firstTime > 10) { window.location.href = "about:blank"; } }, 100); } disableSelect(); disableCopy(); disableCopyImg(); generateWatermark(); disbaleConsole();
本文轉(zhuǎn)載于:
https://juejin.cn/post/7292416512333332534
如果對(duì)您有所幫助,歡迎您點(diǎn)個(gè)關(guān)注,我會(huì)定時(shí)更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-776844.html
到了這里,關(guān)于記錄--如何防止網(wǎng)站信息泄露(復(fù)制/水印/控制臺(tái))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!