Cursorjacking攻击揭秘与前端安全防范实战经验分享

一凌昊 安全 阅读 1,385
赞 46 收藏
二维码
手机扫码查看
反馈

项目初期的技术选型

最近有个项目,需要在网页上实现一些比较酷炫的交互效果。其中有个需求是让用户在某个特定区域移动鼠标时,鼠标指针会发生变化,显示一个自定义的图标。这个需求听起来挺简单,但实际操作起来还是遇到了不少问题。

Cursorjacking攻击揭秘与前端安全防范实战经验分享

开始没想到会这么复杂

一开始,我天真地以为这只是一个简单的CSS问题,用 cursor 属性就能搞定。结果发现,如果只是单纯地改变鼠标的样式,确实很简单:

.custom-cursor {
  cursor: url('path/to/custom-cursor.png'), auto;
}

但是,客户要求的是更复杂的交互效果,比如在鼠标移动时,动态改变鼠标指针的位置和大小。这就涉及到JavaScript了。

最大的坑:性能问题

最开始,我尝试用纯JavaScript来实现这个效果。思路是监听 mousemove 事件,然后动态改变鼠标指针的位置和大小。代码如下:

document.addEventListener('mousemove', (event) => {
  const x = event.clientX;
  const y = event.clientY;
  const customCursor = document.getElementById('custom-cursor');
  customCursor.style.left = ${x}px;
  customCursor.style.top = ${y}px;
  // 这里还可以根据需要调整指针的大小
});

HTML部分也非常简单:

<div id="custom-cursor" style="position: absolute; width: 50px; height: 50px; background: url('path/to/custom-cursor.png') no-repeat center center; pointer-events: none;"></div>

刚开始测试的时候,效果还不错,但很快我就发现了一个严重的问题:当页面上有大量元素时,mousemove 事件的触发频率非常高,导致性能问题非常严重。浏览器卡顿得厉害,用户体验极差。

折腾了半天发现

后来调整了方案,决定使用 requestAnimationFrame 来优化性能。requestAnimationFrame 可以将动画帧与屏幕刷新同步,从而提高性能。代码如下:

let lastX, lastY;
const customCursor = document.getElementById('custom-cursor');

function updateCursor(x, y) {
  customCursor.style.left = ${x}px;
  customCursor.style.top = ${y}px;
}

function animate(timestamp) {
  if (lastX !== undefined && lastY !== undefined) {
    updateCursor(lastX, lastY);
  }
  requestAnimationFrame(animate);
}

document.addEventListener('mousemove', (event) => {
  lastX = event.clientX;
  lastY = event.clientY;
});

requestAnimationFrame(animate);

这样做的好处是,mousemove 事件不再频繁触发 updateCursor 函数,而是通过 requestAnimationFrame 来控制更新频率。性能问题得到了很大的改善。

还有一些小问题

虽然性能问题解决了,但还有一些小问题没有完全解决。比如在某些情况下,鼠标指针的位置会稍微有些偏移,特别是在快速移动鼠标时。这个问题虽然不影响整体效果,但还是有点烦人。

我也尝试了一些其他的方法,比如使用 getBoundingClientRect 来精确计算位置,但效果并不理想。最终决定先暂时放一放,后续再慢慢优化。

回顾与反思

这次项目让我深刻体会到了前端开发中的一些细节问题。看似简单的鼠标指针变化,实际上涉及到很多性能和用户体验的考虑。通过这次实践,我学到了如何使用 requestAnimationFrame 来优化动画性能,也意识到了在实现复杂交互效果时,需要综合考虑各种因素。

以上是我的项目经验,希望对你有帮助,欢迎交流。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论