Go基础学习记录之阻止Session劫持(Preventing session hijacking)

栏目: 编程工具 · 发布时间: 6年前

内容简介:Session劫持是一种常见且严重的安全威胁。在与服务器通信时,客户端使用Session ID进行验证和其他目的。不幸的是,恶意第三方有时可以跟踪这些通信并找出客户端Session ID。本次分享,将向您展示如何为教育目的劫持Session。以下代码是count变量的计数器:

阻止Session劫持(Preventing session hijacking)

Session劫持是一种常见且严重的安全威胁。在与服务器通信时,客户端使用Session ID进行验证和其他目的。不幸的是,恶意第三方有时可以跟踪这些通信并找出客户端Session ID。

本次分享,将向您展示如何为教育目的劫持Session。

Session劫持过程

以下代码是count变量的计数器:

// WelcomeLogin 欢迎登录页
func WelcomeLogin(w http.ResponseWriter, r *http.Request) {
    session, err := appSession.SessionStart(w, r)
    if err != nil {
        fmt.Fprintf(w, "session error")
        return
    }

    count := session.Get("count")
    if count == nil {
        session.Set("count", 1)
    } else {
        session.Set("count", count.(int)+1)
    }

    t, err := template.ParseFiles(config.TemplateDir + "/login.html")

    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    err = t.Execute(w, session.Get("count"))

    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

login.html的内容如下:

Hi. Now count:{{.}}

保持刷新直到数字变为10,然后打开浏览器的cookie管理器(我在这里使用firefox)。您应该能够看到以下信息:

Go基础学习记录之阻止Session劫持(Preventing session hijacking)

这一步非常重要:打开另一个浏览器(我在这里使用chrome),将URL复制到新浏览器,打开一个cookie模拟器来创建一个新的cookie并输入与我们在第一个浏览器中看到的cookie完全相同的值。

刷新页面,您将看到以下内容:

Go基础学习记录之阻止Session劫持(Preventing session hijacking)

在这里,我们看到我们可以在不同浏览器之间劫持Session,并且在一个浏览器中执行的操作可以影响另一个浏览器中页面的状态。

因为HTTP是无状态的,所以无法知道来自chrome的Session ID是否被模拟,并且firefox也无法知道它的Session ID已被劫持。

防止Session劫持

通过上面劫持Session的简单示例,可以看到它非常危险,因为它允许攻击者做任何他们想做的事情。那么我们如何防止会话劫持?第一步是仅在cookie中设置Session ID,而不是在URL重写中设置。另外,我们应该将httponly cookie属性设置为true。这限制了客户端脚本获得对Session ID的访问权限。使用这些技术,XSS无法访问cookie,也不会像我们演示的那样从cookie管理器获取会话ID。

第二步是为每个请求添加一个令牌。与我们在前面部分中处理重复表单提交的方式类似,我们添加一个包含令牌的隐藏字段。当请求发送到服务器时,我们可以验证此令牌以证明请求是唯一的。

h := md5.New()
salt:="xiaorongmao%^7&8888"
io.WriteString(h,salt+time.Now().String())
token:=fmt.Sprintf("%x",h.Sum(nil))
if r.Form["token"]!=token{
    // ask to log in
}
session.Set("token",token)

Session ID超时

另一种解决方案是为每个Session添加创建时间,并用新的Session ID替换过期的Session ID。这可以防止在某些情况下Session劫持,例如劫持时间太晚。

createtime := session.Get("createtime")
if createtime == nil {
    session.Set("createtime", time.Now().Unix())
} else if (createtime.(int64) + 60) < (time.Now().Unix()) {
    appSession.SessionDestroy(w, r)
    session = appSession.SessionStart(w, r)
}

我们设置一个值来保存创建时间并检查它是否已过期(我在这里设置了60秒)。此步骤通常可以阻止会话劫持尝试。通过组合上面提到的两个解决方案,将能够防止大多数Session劫持尝试成功。一方面,频繁重置的Session ID将导致攻击者总是过期且无用的Session ID;另一方面,通过在cookie上设置httponly属性并确保只能通过cookie传递Session ID,可以减轻所有基于URL的攻击。最后,我们在Cookie上设置MaxAge = 0,这意味着Session ID不会保存在浏览器历史记录中。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

互联网+秋叶课堂:我的网课创业

互联网+秋叶课堂:我的网课创业

秋叶 / 北京:机械工业出版社 / 2016-3-1 / 39.0

在线教育被很多人视为 “互联网+”创业热潮中的下一个风口,越来越多的老师和创业者选择在线教育创业。本书作者秋叶老师2013年双11正式带一帮小伙伴开始在线教育创业,在短短两年内“从0到1”,累计做到了超500万元的销售业绩,成为国内Office领域在线教育运营最成功的团队之一。在这本书中秋叶老师结合自己的实战经历,向各位完整剖析了两年创业的真实复盘思考,是一本值得在线教育创业同行入手的必读书。 ......一起来看看 《互联网+秋叶课堂:我的网课创业》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具