谈谈前端如何防止数据泄露

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。

最近突然发现了一个好玩的事情,部分网站进去的时候几乎都是死的,那种死是区别于我们常见的网站的死:

  • 不能选中文字
  • 不能复制粘贴文字
  • 不能鼠标右键显示选项
  • 不能打开控制台
  • ……

各种奇葩的操作应接不暇,像极了我最初接触的某库。shigen的好奇心直接拉满,好家伙,这是咋做的呀。一顿操作之后,发现这种是为了防止网站的数据泄露(高大上)。在我看来,不是为了装X就是为了割韭菜。

咱废话也不多说,就手动来一个,部分代码参考文章:如何防止网站信息泄露(复制/水印/控制台)。

shigen实现的效果是这样的:

将进酒页面

用魔法生成了一个页面,展示的是李白的《将进酒》。我需要的功能有尽可能的全面,禁止复制、选择、调试……

找了很多的方式,最后能自豪的展示出来的功能有:

  • 禁止选择
  • 禁止鼠标右键
  • 禁止复制粘贴
  • 禁止调试资源(刷新页面的方式)
  • 常见的页面水印

那其实也没有特别的技术含量,我就在这里展示了,希望能作为工具类供大家使用。

页面部分

html5+css,没啥好讲的。

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        body {
            font-family: "Microsoft YaHei", sans-serif;
            line-height: 1.6;
            padding: 20px;
            text-align: center;
            background-color: #f8f8f8;
        }

        .poem-container {
            max-width: 600px;
            margin: 0 auto;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }

        h1 {
            font-size: 1.5em;
            margin-bottom: 20px;
        }

        p {
            text-indent: 2em;
            font-size: 1.2em;
        }
    </style>
    <title>李白《将进酒》</title>
</head>

<body>
    <div class="poem-container">
        <h1>将进酒</h1>
        <p>君不见,黄河之水天上来,奔流到海不复回。</p>
        <p>君不见,高堂明镜悲白发,朝如青丝暮成雪。</p>
        <p>人生得意须尽欢,莫使金樽空对月。</p>
        <p>天生我材必有用,千金散尽还复来。</p>
        <p>烹羊宰牛且为乐,会须一饮三百杯。</p>
        <p>岑夫子,丹丘生,将进酒,杯莫停。</p>
        <p>与君歌一曲,请君为我倾耳听。</p>
        <p>钟鼓馔玉不足贵,但愿长醉不复醒。</p>
        <p>古来圣贤皆寂寞,惟有饮者留其名。</p>
        <p>陈王昔时宴平乐,斗酒十千恣欢谑。</p>
        <p>主人何为言少钱,径须沽取对君酌。</p>
        <p>五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。</p>
    </div>
 </body>

js部分

禁止选中
// 防止用户选中
function disableSelect() {
    // 方式:给body设置样式
    document.body.style.userSelect = 'none';

    // 禁用input的ctrl + a
    document.keyDown = function(event) {
        const { ctrlKey, metaKey, keyCode } = event;
        if ((ctrlKey || metaKey) && keyCode === 65) {
            return false;
        }
    }
};
禁止复制、粘贴、剪切
document.addEventListener('copy', function(e) {
    e.preventDefault();
});
document.addEventListener('cut', function(e) {
    e.preventDefault();
});
document.addEventListener('paste', function(e) {
    e.preventDefault();
});
禁止鼠标右键
// 防止右键
window.oncontextmenu = function() {
    event.preventDefault()
    return false
}
禁止调试资源

这个我会重点分析。

let threshold = 160 // 打开控制台的宽或高阈值  
window.setInterval(function() {
    if (window.outerWidth - window.innerWidth > threshold ||
        window.outerHeight - window.innerHeight > threshold) {
        // 如果打开控制台,则刷新页面  
        window.location.reload()
    }
}, 1000)

这个代码的意思很好理解,当我们F12的时候,页面的宽度肯定会变小的,我们这个时候和屏幕的宽度比较,大于我们设置的阈值,我们就算用户在调试页面了。这也是我目前找到的比较好的方式了。但是,但是,认真思考一下以下问题需要你考虑吗?

  • 页面频繁加载,流量的损失大吗
  • 页面刷新,后端接口频繁调用,接口压力、接口幂等性

所以,我觉得这种方式不优雅,极度的不优雅,但是有没有别的好的解决办法。

加水印
// 生成水印
function generateWatermark(keyword = 'shigen-demo') {
    // 创建Canvas元素  
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');

    // 设置Canvas尺寸和字体样式  
    canvas.width = 100;
    canvas.height = 100;
    context.font = '10px Arial';
    context.fillStyle = 'rgba(0,0,0,0.1)';

    // 绘制文字到Canvas上  
    context.fillText(keyword, 10, 50);

    // 生成水印图像的URL  
    const watermarkUrl = canvas.toDataURL();

    // 在页面上显示水印图像(或进行其他操作)  
    const divDom = document.createElement('div');
    divDom.style.cssText = `
        position: fixed;
        z-index: 99999;
        top: -10000px;
        bottom: -10000px;
        left: -10000px;
        right: -10000px;
        transform: rotate(-45deg);
        pointer-events: none;
        background-image: url(${watermarkUrl});
    `;
    document.body.appendChild(divDom);
}

代码不需要理解,部分的参数去调整一下,就可以拿来就用了。

我一想,我最初接触到这种页面水印的时候,是在很老的OA办公系统,到后来用到了某书,它的app页面充满了水印,包括浏览器端的页面。

所以,我也实现了这个。but,but,有一种技术叫做OCR,大白话讲就是文字识别。我把图片截个图,让某信、某书识别以下,速度和效果那叫一个nice,当然也可能把水印也识别出来了。聪敏的开发者会把水印的颜色和文字的颜色设置成一种,这个时候需要准确的文字那可得下一番功夫了。换句话说,不是定制化的OCR,准确的识别出信息,真的够呛。

还有的很多页面实现了js的数据加密、接口数据加密。但是道高一尺,魔高一丈,各种都是在一种相互进步的。就看实际的业务场景和系统的设计了。


以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注支持一下哈,您的鼓励和支持将是shigen坚持日更的动力。同时,shigen在多个平台都有文章的同步,也可以同步的浏览和订阅:

平台账号链接
CSDNshigen01shigen的CSDN主页
知乎gen-2019shigen的知乎主页
掘金shigen01shigen的掘金主页
腾讯云开发者社区shigenshigen的腾讯云开发者社区主页
微信公众平台shigen公众号名:shigen

shigen一起,每天不一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/137899.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Hadoop】MapReduce详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f…

数据结构 | 栈的实现

数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 需要实现的函数初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈Stack.c 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素…

AI的尽头是解决屎山代码

众所周知&#xff0c;Copilot 被认为是比 ChatGPT 更深谙程序员心思的工具。在今天凌晨的 GitHub Universe 2023 大会上&#xff0c;GitHub 公布了 Copilot 的最新消息&#xff0c;这一神器旨在解放程序员的双手&#xff0c;AI 将彻底改变开发者的编程方式。 在本次盛会上&…

数据结构:并查集(概念,代码实现,并查操作优化)

目录 1.表示集合关系2.并查集的代码实现1.基本操作&#xff1a;查2.基本操作&#xff1a;并 3.并查集的优化1.并&#xff08;Union&#xff09;操作的优化2.Find操作的优化&#xff08;压缩路径) 1.表示集合关系 用互不相交的树&#xff0c;表示多个集合。 ①查&#xff1a;查找…

AI应用新时代的起点,亚马逊云科技加速大模型应用

大语言模型 何为大语言模型&#xff0c;可以一句话概括&#xff1a;深度学习是机器学习的分支&#xff0c;大语言模型是深度学习的分支。 机器学习是人工智能&#xff08;AI&#xff09;的一个分支领域&#xff0c;核心是让计算机系统从数据中学习以提高性能。与直接编程不同…

【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程程序替换 1. 前言2. exec…

【仿真动画】双机器人协作完成一个任务(切割)

场景 动画 两个机器人协同工作完成一个任务需要解决以下几个关键问题&#xff1a; 通信&#xff1a;两个机器人需要能够相互通信&#xff0c;以共享信息&#xff0c;例如位置、姿态、状态等。规划&#xff1a;需要对两个机器人的运动轨迹进行规划&#xff0c;确保两个机器人不会…

RESTful API概述以及如何使用它构建 web 应用程序

REST&#xff08;Representational State Transfer&#xff09;是一种设计风格和架构原则&#xff0c;它是一种为 Web 应用程序提供简化和标准化的 API 的方式。RESTful API&#xff08;RESTful Web Services&#xff09;是符合 REST 架构风格的网络应用程序 API&#xff0c;它…

未来之路:大模型技术在自动驾驶的应用与影响

本文深入分析了大模型技术在自动驾驶领域的应用和影响&#xff0c;万字长文&#xff0c;慢慢观看~ 文中首先概述了大模型技术的发展历程&#xff0c;自动驾驶模型的迭代路径&#xff0c;以及大模型在自动驾驶行业中的作用。接着&#xff0c;详细介绍了大模型的基本定义、基础功…

关系查询处理和查询优化

关系数据库系统的查询处理 4 个阶段 查询分析查询检查【此时的完整性检查是初步的、静态的检查】查询优化【分为代数优化、物理优化】查询执行 关系数据库系统的查询优化 查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较高地效率&#xff0c;而且在于系统可…

Springboot项目部署及多环境开发

一、项目部署 我们之前写的代码都是部署在本地的tomcat上&#xff0c;别人是无法访问我们写的程序的。在实际开发中&#xff0c;我们都要将开发完毕的项目部署到公司的服务器上。 我们的代码需要经过编译打包生成一个jar包&#xff0c;这个过程需要借助一个插件来实现。 创建sp…

2024最新基于物联网单片机毕业设计选题汇总(合集)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

初始MySQL(四)(查询加强练习,多表查询)

目录 查询加强 where加强 order by加强 group by 分页查询 总结 多表查询(重点) 笛卡尔集及其过滤 自连接 子查询 子查询当作临时表 all/any 多列子查询 #先创建三张表 #第一张表 CREATE TABLE dept(deptno MEDIUMINT NOT NULL DEFAULT 0,dname VARCHAR(20) NOT …

2023-11-13 LeetCode每日一题(区域和检索 - 数组可修改)

2023-11-13每日一题 一、题目编号 307. 区域和检索 - 数组可修改二、题目链接 点击跳转到题目位置 三、题目描述 给你一个数组 nums &#xff0c;请你完成两类查询。 其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right…

Oracle主备切换,ogg恢复方法(经典模式)

前言: 文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover)&#xff0c;在主库、备库运行的ogg进程(经典模式)如何进行恢复。 测试恢复场景: 1 主备发生switchover切换&#xff0c;主库为ogg源端 2 主备发生switchover切换&#xff0c;备库为ogg源端 3 主备…

【Linux】Linux动态库和静态库

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

AIOT数字孪生智慧工地一体化管理平台源码

智慧工地app基于物联网和移动互联网技术&#xff0c;利用各类传感器及终端设备通过与云端服务器的实时数据交互&#xff0c;为施工现场的管理人员提供环境监测、劳务实名制管理、物料管理、巡检记录、设备管理等一系列优质高效的行业解决方案。 一、智能工地应用价值 智慧工地…

Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码

智慧工地围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效. 智慧工地综合管理云平台源码&#xff0c;PC监管端、项目端&#xff1b;APP监管端、项目端、数据可视化大屏端源码&#xf…

springboot rocketmq 延时消息、延迟消息

rocketmq也有延迟消息&#xff0c;经典的应用场景&#xff1a;订单30分钟未支付&#xff0c;则取消的场景 其他博客提到从rocketmq5.0开始&#xff0c;支持自定义延迟时间&#xff0c;4.x只支持预定义延迟时间&#xff0c;安装rocketmq可参考RocketMq简介及安装、docker安装ro…

iOS OpenGL ES3.0入门实践

一、效果图 入门实践&#xff0c;做的东西比较简单&#xff0c;效果如下&#xff1a; 二、关于顶点坐标和纹理坐标 绘制图片需要设置顶点坐标和纹理坐标并加载像素数据&#xff0c;之所以要指定两组坐标是因为纹理和顶点使用不同的坐标系&#xff0c;就是告诉OpenGL&#xf…