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不会保存在浏览器历史记录中。


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

查看所有标签

猜你喜欢:

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

精通EJB

精通EJB

罗曼 / 第1版 (2005年9月1日) / 2005-9 / 69.0

本书是EJB组件技术教程,专注于EJB的概念、方法、开发过程的介绍。全书共分为4个部分,首先对EJB编程基础进行介绍,其次重点关注EJB编程的具体内容和过程,然后对高级EJB进行了阐述,最后的附录收集了EJB组件技术相关的其他内容。作为一本交互性好、读起来有趣、涉及到EJB中各方面知识的书籍,本书确信这正是你所寻找的。  本书是关于EJB 2.1的经典书籍,是EJB开发者必备的参考书。全书共分为3......一起来看看 《精通EJB》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具