如何在Asp.net MVC Web应用中防止截图(含第三方工具如Snipping Tool)
前端浏览器层面防护(降低网页端截图风险)
禁用右键与文本选择:阻止用户通过右键菜单截图或选中文本后截图,可在全局布局页(
_Layout.cshtml)添加以下代码:// 禁用右键菜单 document.addEventListener('contextmenu', e => e.preventDefault()); // 禁用文本选择 document.addEventListener('selectstart', e => e.preventDefault());添加全屏水印覆盖层:在页面顶层叠加半透明水印,即使被截图也会附带标识,增加滥用成本。用CSS实现全局水印:
.global-watermark { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; /* 不干扰页面交互 */ background: repeating-linear-gradient( 45deg, rgba(0,0,0,0.08), rgba(0,0,0,0.08) 12px, rgba(0,0,0,0.03) 12px, rgba(0,0,0,0.03) 24px ); }在布局页
body末尾插入:<div class="global-watermark"></div>,也可通过Canvas动态生成含用户ID的文字水印,提升溯源性。窗口切换时隐藏敏感内容:监听页面可见性变化,当用户切换窗口/最小化时自动隐藏敏感区域:
document.addEventListener('visibilitychange', () => { const sensitiveEle = document.querySelector('.sensitive-section'); if (!sensitiveEle) return; sensitiveEle.style.display = document.hidden ? 'none' : 'block'; });给敏感内容容器添加
sensitive-section类即可生效。
系统级辅助防护(针对第三方截图工具)
Web应用无法直接控制客户端系统工具,需配合客户端配置或辅助程序:
启用Windows DWM保护:开启桌面窗口管理器保护后,部分工具(如Snipping Tool)无法捕获受保护窗口。通过注册表配置:
注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
添加DWORD值DisableDWM并设为0(启用保护),此操作需客户端系统权限。客户端辅助程序拦截:开发轻量级Windows客户端程序(C# WinForms/WPF),通过Windows API钩子(
SetWindowsHookEx)捕获截图相关系统调用,或定期检测Snipping Tool等进程并提示用户关闭。限制访问场景:通过ASP.NET MVC的身份验证+设备指纹识别,仅允许合规设备访问敏感内容,同时记录访问日志,便于事后追溯。
注意:没有100%完美的防护方案(如用户可通过物理相机拍照),以上方案仅能降低截图滥用风险,需结合业务场景选择组合策略。
内容的提问来源于stack exchange,提问作者Raju Gaddam

