JavaScript奇技淫巧:防删水印

2023-4-12 19:27| 发布者: wanhu| 查看: 104| 评论: 1

摘要: JavaScript奇技淫巧:防删水印JShaman原创资料,作者:w3sft,如转载请保留此信息。为了保护版权、防截图、防拍照等,有些我们会给网页中的视频、图片或文字加水印。实现的方式,可能有多种,比如:对图片、视频而言 ...

JavaScript奇技淫巧:防删水印

JShaman原创资料,作者:w3sft,如转载请保留此信息。

为了保护版权、防截图、防拍照等,有些我们会给网页中的视频、图片或文字加水印。

实现的方式,可能有多种,比如:对图片、视频而言,可以在服务端完成水印,但对于文字信息类,一般只能在前端页面中进行水印添加。

本文分享一种图层式防删水印技术。其效果是:在页面渲染完成后,由JavaScript进行图层水印添加,并会实时检测水印状态,如果水印被删除、隐藏、或设置为透明,都会重置水印。

源码

<html>
<body>
<div id="content" style="padding:10px;">
<h2>防删文字水印</h2>
水印内容不可删除,如检测到被删除,会重新添加水印
</div>
<script>
function add_water_canvas(){
//水印canvas
var water_canvas = document.createElement("canvas");
water_canvas.id = "water_canvas";
water_canvas.height = 100;
water_canvas.width = 300;
water_canvas.style.top = 100 + "px";
water_canvas.style.left = 100 + "px";
water_canvas.style.position = "absolute";
water_canvas.style.transform = "rotate(-45deg)";
//水印内容
var water_text = water_canvas.getContext("2d");
water_text.font = "26px 黑体";
water_text.fillText("水印内容", 30, 50);
//canvas容器:水印目标
var canvas_container = document.getElementById("content");
canvas_container.style.height = 280 + "px";
canvas_container.style.width = 500 + "px";
canvas_container.style.backgroundImage = "url(bg.png)";
//添加水印canvas给目标div
canvas_container.appendChild(water_canvas);
}
add_water_canvas();
var observer = new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
if(mutation.removedNodes.length > 0 && mutation.removedNodes[0].id == "water_canvas") {
console.log("检测到水印被删除,已重新添加水印");
//重新添加水印
add_water_canvas();
}
if (mutation.type == "attributes" && mutation.target.id == "water_canvas") {
console.log("检测到水印属性被修改,已重置属性");
water_canvas.style.display = "block";
water_canvas.style.opacity = 1;
}
});
});
observer.observe(document.body, {
childList: true,
attributes: true,
subtree: true,
attributesOldValue: true,
characterData: true,
characterDataOldValue: true,
});
</script>
</body>
</html>

技术原理

添加水印的方式平平无奇,只是新建了一个canvas图层,在图层中叠加水印内容。

取巧的是用MutationObserver对水印进行监控和重置。MutationObserver是一个很有创意的接口,它可以监听页面元素变化,任何元素的修改,如节点的增减、属性值更新、文本内容的改动都会触发MutationObserve事件,在本例中,会监测两种事件:节点删除、节点属性发生变化。

如,删除水印节点:



删除时触发事件,时此会还原节点、重置水印:



如,结点属性被修改(修改display为none使元素不可见,或修改opacity为0使元素完全透明),都会触监听事件,并重置节点属性:



其实应用于产品或项目时,可将JS代码用JShaman进行混淆加密,以防止代码被分析识破从而被针对性的反制。

注:本文演示中是给div添加水印,实际应用此技术时,水印可添加给任意种类的元素内容。

更多文章:

w3sft:JavaScript奇技淫巧:网页内容防复制

w3sft:Eval加密的终极用法

w3sft:html网页源码加密

w3sft:JavaScript奇技淫巧:Eval的未公开用法

w3sft:JavaScript奇技淫巧:加密JS代码反调试

w3sft:72篇Node.JS教程:Node.JS编程从入门到精通

w3sft:JavaScript奇技淫巧:操控URL

w3sft:JavaScript奇技淫巧:代码复制陷阱

w3sft:JavaScript奇技淫巧:隐形字符

w3sft:JavaScript奇淫技巧:反调试

w3sft:VS code扩展开发详解

w3sft:AutoJS代码能加密吗?YES,AutoJS加密技巧展示

w3sft:JavaScript-Obfuscator4.0.0字符串阵列化Bug及修复方法

w3sft:特别适于小程序、小游戏过审的JS加密方法

w3sft:JavaScript黑魔法:不可阻止的“自动下载”


路过

雷人

握手

鲜花

鸡蛋
版权声明:免责声明:文章信息来源于网络以及网友投稿,本网站只负责对文章进行整理、排版、编辑,是出于传递 更多信息之目的, 并不意味着赞同其观点或证实其内容的真实性,如本站文章和转稿涉及版权等问题,请作者在及时联系本站,我们会尽快处理。
已有 1 人参与

会员评论

相关分类

 万奢网手机版

官网微博:万奢网服务平台

今日头条二维码 1 微信公众号二维码 1 抖音小程序二维码 1
上海万湖珠宝贸易有限公司 地址:上海市宝山区共和新路4727号新陆国际大厦1003-1007室 网站经营许可证 备案号:沪ICP备11005343号-12012-2019
万奢网主要专注于手表回收,二手名表回收/销售业务,可免费鉴定(手表真假),评估手表回收价格,正规手表回收公司,宝山实体店,支持全国范围上门回收手表
返回顶部