关于点击劫持和防御

点击劫持

原理

  • 所谓点击劫持就是本来有一个点击按钮,你点的不是这个按钮而是其他按钮
  • 但是这个按钮被触发点击了,也就是被劫持点击到其他的地方去了,而用户并不知情

特征

  • 用户亲手操作
  • 用户并不知情

危害

  • 盗取用户资金(转账,消费)
  • 获取用户敏感信息(邮件等)

案例

  • 游戏点击诱骗用户(flash打开摄像头)
  • 邮件内容点击劫持诱发转发

点击劫持的实现

  • 常用的方法是在一个网页上通过一个iframe加载你有权限的一些网站页面,但是这个iframe透明度被设置为0
  • 在iframe下面还有一个其他按钮的背景,可能并非真实的按钮,而是一张背景图而已
  • 这时候如果用户点击了背景上的按钮, 其实际上是点击了背景上的透明iframe里的按钮
  • 这样就诱骗用户进行点击操作了,而用户自己并不知情

点击劫持的防御

  • 让目标网站不被其他网站内嵌
  • 使用js禁止内嵌
    • 内嵌和直接访问的最大区别是top对象
    • 直接访问top对象===window对象
    • 而内嵌的话
      • top!==window
      • top.location!=window.location
    • 通过top.location!=window.location判断, 如果符合该判断,则跳出iframe是可以的
    • 但是并不能完全阻碍,因为在iframe中的h5新属性sandbox可以禁用js
      • 默认的sanbox会禁用掉很多功能,如js脚本和form提交
      • 但是劫持的时候可以通过设置sanbox="allow-forms"来处理
      • 这样脚本不能运行,表单可以提交,这样就可以顺利进行点击劫持了
    • 这样看来,js不能百分百保证阻止点击劫持的问题
  • 不过我们可以使用新的防御方式,浏览器和Web标准提供了X-FRAME-OPTIONS禁止内嵌的头
    • 也就是在页面加载的时候, 就指定iframe的加载策略,是否允许内嵌
    • 当我们指定不允许内嵌的时候, 浏览器就会拒绝内嵌,这就直接防御了点击劫持
    • 兼容性支持到IE8及其以上,是最完美的解决方案
    • 具体用法示例
      // 其值有几种:DENY、SAMEORIGIN、ALLOW-FROM 允许的地址
      ctx.set('X-Frame-Options', 'DENY') // 此处不允许我们网站被内嵌
      
  • 其他手段
    • 增加验证码,用户输入验证码并点击才可以
    • 增加用户操作成本,减少点击劫持风险,但并不能从根本解决问题

PHP防御点击劫持

header('X-Frame-Options: DENY') // 添加这一行禁止内嵌

<script>
    // 此处前端防御
    if(top.location != window.location) {
        top.location = window.location;
    }
</script>

<form method='post'>
    <textarea name='content'>hello</textarea>
    <button type='submit'>提交</button>
</form>

你可能感兴趣的:(Web,javascript,前端,开发语言)