下面版本可用,但是在手机浏览器区分细化方面不完整(比如区分百度app,),但是亲测几个月完全可用。2024/1/1日更新
编写一个电脑端显示一个网页代码,手机显示不同的网页代码。并且禁止f12和电脑端调试模式,即便在f12仿真情况下也显示电脑端代码,禁止ctrl+u。手机端识别浏览器不是iphone浏览器/谷歌浏览器/edge浏览器/欧朋浏览器/x浏览器/2345浏览器等浏览器 也显示不同网页代码。
先说终结结果,然后再说其他的
<?php
// 检测是否为移动设备
$isMobile = preg_match('/(iPhone|iPad|iPod|Android|webOS|BlackBerry|IEMobile|Opera Mini)/i', $_SERVER['HTTP_USER_AGENT']);
// 检测是否为设备仿真模式
$isSimulator = preg_match('/Mobile/i', $_SERVER['HTTP_USER_AGENT']) && preg_match('/((?!Mobile).)*(Windows NT|Macintosh|((?!Mobile).)*Linux)/i', $_SERVER['HTTP_USER_AGENT']);
if ($isMobile && !$isSimulator) {
// 如果是移动设备,则在新窗口打开 mobile.html 页面
$isChrome = stripos($_SERVER['HTTP_USER_AGENT'], 'chrome') !== false;
$isiPhone = stripos($_SERVER['HTTP_USER_AGENT'], 'iphone') !== false;
$isEdg = stripos($_SERVER['HTTP_USER_AGENT'], 'Edg') !== false;
$isEdgA = stripos($_SERVER['HTTP_USER_AGENT'], 'EdgA') !== false;
$isEdgiOS = stripos($_SERVER['HTTP_USER_AGENT'], 'EdgiOS') !== false;
$isFirefox = stripos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== false;
$isOpera = stripos($_SERVER['HTTP_USER_AGENT'], 'OPR') !== false;
$isMaxthon = stripos($_SERVER['HTTP_USER_AGENT'], 'Maxthon') !== false
|| stripos($_SERVER['HTTP_USER_AGENT'], '傲游') !== false;
$is2345 = stripos($_SERVER['HTTP_USER_AGENT'], '2345Explorer') !== false;
$isVia = stripos($_SERVER['HTTP_USER_AGENT'], 'Via') !== false
|| stripos($_SERVER['HTTP_USER_AGENT'], 'rv:') !== false;
$isXiaomi = stripos($_SERVER['HTTP_USER_AGENT'], 'XiaoMi') !== false
|| stripos($_SERVER['HTTP_USER_AGENT'], 'MiuiBrowser') !== false;
$isAlook = stripos($_SERVER['HTTP_USER_AGENT'], 'Alook') !== false;
if (!$isiPhone && !$isChrome && !$isEdg && !$isEdgiOS && !$isEdgA && !$isFirefox && !$isOpera && !$isMaxthon && !$is2345 && !$isVia && !$isXiaomi && !$isAlook) {
header('Location: https://www.51yhyh.com/10091', true, 302);
exit();
} else {
header('Location: indexmobile2023zhu.php', true, 302);
exit();
}
} else {
// 如果是电脑设备,或者在设备仿真模式下,则显示 desktop.html 页面
include('indexdesktop2023zhu.php');
// 禁止 F12 和右键菜单,防止用户使用调试工具查看代码
echo "<script>
document.addEventListener(\"keydown\", function(event) {
if (event.keyCode == 123) {
event.preventDefault();
}
});
document.addEventListener(\"contextmenu\", function(event) {
event.preventDefault();
});
</script>";
}
// 禁止打开源代码
echo "<script>
document.addEventListener('keydown', function(event) {
if ((event.ctrlKey || event.metaKey) && event.keyCode === 85) {
event.preventDefault();
}
});
</script>";
?>
以下是一些研究经历和教训
①判断这些浏览器的条件可以根据它们的 HTTP_USER_AGENT
中的关键词来实现。以下是一些浏览器的常见 HTTP_USER_AGENT
及其判断条件:
- 傲游浏览器:包含 “Maxthon” 或 “傲游” 字符串
- 2345 浏览器:包含 “2345Explorer” 字符串
- Via 浏览器:包含 “Via” 或 “rv” 字符串
- X 浏览器:包含 “XiaoMi” 或 “MiuiBrowser” 字符串
- 神奇浏览器:包含 “QIHU” 或 “360EE” 或 “360SE” 字符串
请注意,这些条件不能保证能够100%确定浏览器的类型,因为用户可以在浏览器设置中修改其 HTTP_USER_AGENT
。因此,最好的办法是利用包含在 HTTP_USER_AGENT
中的关键词和其它特殊的浏览器标识符将其分组,以便能够更有信心地识别浏览器类型。
②浏览器的仿真模式是什么原理,怎么获取真实user-agent
浏览器的设备仿真模式是一种能够模拟不同设备类型和分辨率的开发工具。它可以让开发人员在开发网站或应用程序时,根据不同的设备特性来预览网站或应用程序的效果,以确保内容在不同的屏幕上都具有良好的可读性和用户体验。
在浏览器的设备仿真模式下,浏览器会伪造 HTTP 请求中的 User-Agent 字符串。User-Agent 是一个头文件,包含了浏览器、操作系统、设备类型等相关信息。当开发者开启设备仿真模式后,浏览器会修改请求头中的 User-Agent 字符串,以模拟不同设备类型和操作系统。
获取真实的 User-Agent 字符串可以使用 PHP 中的 $_SERVER['HTTP_USER_AGENT']
变量,在 PHP 中可以将其输出到页面或写入日志文件以便分析。
以下示例演示如何通过 PHP 代码获取浏览器的 User-Agent 字符串:
$userAgent = $_SERVER['HTTP_USER_AGENT'];
echo 'User-Agent: ' . $userAgent;
总之,设备仿真模式通过模拟 User-Agent 字符串和调整视口大小等方式来模拟不同设备类型和分辨率的效果,可以帮助开发者更好地预览和测试他们的网站或应用程序在不同设备上的效果。而获取真实的 User-Agent 字符串可以帮助开发人员分析浏览器的特性,以便更好地调试和优化代码。
总结不能破解用户在仿真模式下访问网站吗
③能禁止ctrl+u吗?
可以通过 JavaScript 禁止在浏览器中使用 Ctrl + U
或者 Cmd + U
快捷键来打开页面源代码,以下是一个简单的示例代码:
document.addEventListener('keydown', function(event) {
// 通过按下 Ctrl 或 Cmd 键并同时按下 U 键,来打开页面源代码
if ((event.ctrlKey || event.metaKey) && event.keyCode === 85) {
// 禁止浏览器默认行为
event.preventDefault();
}
});
上述代码会在页面加载完成后监听用户按下按键事件,当用户按下 Ctrl + U
或者 Cmd + U
快捷键时,会阻止浏览器默认的行为,从而禁止打开页面源代码。
需要注意的是,通过 JavaScript 禁止打开页面源代码并不能完全保证网页代码不会被窃取,因为用户仍然可以通过其他方式获得网页的代码,例如使用浏览器的开发工具等。而且,对于高级用户或者攻击者来说,禁止这些快捷键或者其他方式的限制并不会成为阻止他们窃取网页源代码的障碍。因此,建议在网页设计之初,就地采取规避措施来确保敏感代码的安全性。
④可以使用弹窗跳转吗?
浏览器可能已经默认阻止了弹窗,在有些情况下,弹窗可能会导致用户体验较差,所以现代浏览器的默认行为是禁止弹出窗口。你可以在浏览器设置中打开来弹出窗口。在这种情况下,为了提高用户体验,建议使用类似 window.location
或 HTML 的 <a>
标签等其它方案来打开新窗口来代替弹窗。这样可以更好地兼容各种浏览器,并提供更好的用户体验。
在某些情况下,浏览器会阻止通过 JavaScript 打开新窗口或标签页,并且在控制台中会输出错误信息。为了保证打开新窗口的可用性,你可以考虑使用以下 HTML code 来打开新窗口:
如果你使用 <a>
标签来实现在新标签页中打开移动设备页面,而且在 iPhone 自带浏览器 Safari 中仍然无法打开新标签页,这可能是由于浏览器的安全限制导致的。在 iOS 中打开新标签页或者新窗口,必须在响应用户事件的时候,例如用户点击屏幕或按钮,才能够打开新页面。
因此,你可以将打开新标签页的操作转移到用户交互事件(例如按钮点击)处理程序中,以此向用户发出请求,以打开新标签页或者新窗口。这种交互式操作模式可以使用 JavaScript 代码来实现。
以下是一个示例代码块,用于使用 JavaScript 实现在指定地址中打开一个新窗口:
<?php
// 检测是否为移动设备
$isMobile = preg_match('/(iPhone|iPad|iPod|Android|webOS|BlackBerry|IEMobile|Opera Mini)/i', $_SERVER['HTTP_USER_AGENT']);
// 检测是否为设备仿真模式
$isSimulator = preg_match('/Mobile/i', $_SERVER['HTTP_USER_AGENT']) && preg_match('/(Windows NT|Macintosh|Linux)/i', $_SERVER['HTTP_USER_AGENT']);
// 检测设备类型前端js代码(同前面的示例)
$deviceTypeScript = '<script>
function isMobileDevice() {
const ua = navigator.userAgent;
const isMobile = /Mobile/i.test(ua);
const isTablet = /Tablet/i.test(ua);
const isiPad = /iPad/i.test(ua);
const isiPhone = /iPhone/i.test(ua);
const isiPod = /iPod/i.test(ua);
const isAndroid = /Android/i.test(ua);
const isBlackBerry = /BlackBerry/i.test(ua) || /BB/i.test(ua);
const isOperaMini = /Opera Mini/i.test(ua);
const isWindowsPhone = /Windows Phone/i.test(ua);
const isTouch = \'ontouchstart\' in window;
return isMobile || isTablet || isiPad || isiPhone || isiPod || isAndroid || isBlackBerry || isOperaMini || isWindowsPhone || isTouch;
}
if (isMobileDevice()) {
document.getElementsByTagName(\'html\')[0].classList.add(\'isMobile\');
} else {
document.getElementsByTagName(\'html\')[0].classList.add(\'isDesktop\');
}
</script>';
if ($isMobile && !$isSimulator) {
// 如果是移动设备,则添加“打开移动设备页面”按钮,并在用户点击时打开新标签页
echo $deviceTypeScript;
echo '<button onclick="window.open(\'mobile2023zhu.html\', \'_blank\');">打开移动设备页面</button>';
exit();
} else {
// 如果是电脑设备,或者在设备仿真模式下,则直接显示桌面页面
echo $deviceTypeScript;
include('desktop2023zhu.html');
// 禁止 F12 和右键菜单,防止用户使用调试工具查看代码(同前面的示例)
echo "<script>
document.addEventListener(\"keydown\", function(event) {
if (event.keyCode == 123) {
event.preventDefault();
}
});
document.addEventListener(\"contextmenu\", function(event) {
event.preventDefault();
});
</script>";
}
// 禁止打开源代码(同前面的示例)
echo "<script>
document.addEventListener('keydown', function(event) {
if ((event.ctrlKey || event.metaKey) && event.keyCode === 85) {
event.preventDefault();
}
});
</script>";
?>
在上述示例代码中,我们使用了一个按钮,并在按钮点击时调用 window.open
函数,在新标签页中打开移动设备页面。这个交互方式可以避免 Safari 浏览器的限制。
示例代码中的其余代码与前面的代码示例类似,包括检测设备类型以及提高安全性。
但是这样就会出现手机页面跳转时候需要点击一下按钮
电脑端加载显示404html.安卓就加载显示1.html,iPhone手机就加载显示2.html。iPhone手机自带浏览器显示3.html。适合于自制下载页面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="format-detection" content="telephone=no">
<meta name="viewport" content="width=device-width,initial-scale=1, minimum-scale=1.0, maximum-scale=1, user-scalable=no">
<title>51福利网APP下载</title>
</head>
<body>
<script>
function loadPageBasedOnDevice() {
var userAgent = navigator.userAgent || navigator.vendor || window.opera;
// 检测是否为PC端访问
if (/Windows|Macintosh/.test(userAgent)) {
window.location.href = "/404.html"; // 如果是PC端访问,跳转到404页面
return;
}
// 检测是否为iPhone自带浏览器
if (/iPhone|iPad|iPod/.test(userAgent) && /Safari/.test(userAgent) && !/CriOS/.test(userAgent)) {
// 如果是自带浏览器,执行相应操作
window.location.href = "/app/iso.html";
} else if (/iPhone|iPad|iPod/.test(userAgent)) {
// 如果是iPhone手机其他浏览器,弹出提示框并添加复制按钮
var link = "https://www.51yhyh.com/app";
var message = "请在Safari浏览器中打开链接:" + link + "点击👇确定复制链接";
alert(message);
var copyButton = document.createElement("button");
copyButton.innerHTML = "👉一键复制链接";
copyButton.onclick = function() {
navigator.clipboard.writeText(link).then(function() {
alert("链接已复制到剪贴板,请前往Safari浏览器打开");
}).catch(function(error) {
alert("复制失败:" + error);
});
};
document.body.appendChild(copyButton);
} else {
// 如果是其他手机端访问,跳转到下载页面
window.location.href = "/8370";
}
}
window.onload = loadPageBasedOnDevice;
</script>
</body>
</html>