如何获取非用户设备侧的日期以规避篡改时间绕过访问限制
核心问题分析
你当前的实现存在两个可被轻易绕过的漏洞:
- 时间校验依赖用户设备本地时间,用户修改系统时间即可绕过
- 受限内容直接预置在HTML中仅通过
display: none隐藏,用户无需修改时间,直接打开浏览器开发者工具修改元素样式即可查看内容
最优解决方案:服务端侧校验(完全规避篡改风险)
所有校验逻辑和内容下发都放在服务端处理,是唯一可以完全避免被绕过的方案:
- 前端不预置任何受限内容,仅在需要时向服务端发起内容请求
- 服务端使用自身的系统时间(不会被用户篡改)校验是否达到开放日期
- 仅当时间符合要求时,服务端才返回受限内容;否则直接返回未到开放时间的提示
这种方案下用户无论修改本地时间还是调试前端代码,都拿不到未开放的内容,安全性最高。
折中方案:无服务端时使用公共授时接口获取可信时间
如果你没有可用的服务端资源,只能纯前端实现,可以通过调用公共网络授时接口获取标准时间,替代读取本地时间:
async function getValidCurrentTime() { // 调用公共授时接口获取标准时间戳,避免依赖本地时间 const response = await fetch("公共授时接口地址") const timestamp = await response.json() return new Date(timestamp) } async function checkAccessPermission() { const openTime = new Date('2021-12-10').getTime() const currentStandardTime = await getValidCurrentTime() if (currentStandardTime.getTime() >= openTime) { // 校验通过后再动态插入受限内容,不要提前写在HTML中 document.getElementById("result").textContent = "Open now!!!" } }
注意:该方案仅能降低被绕过的概率,极端情况下用户仍可通过抓包篡改授时接口返回结果绕过校验,不适合对安全性要求高的场景
内容的提问来源于stack exchange,提问作者Yusuf
相关产品推荐
相关产品推荐

