Add 0.6.4.md syntax highlighting

This commit is contained in:
vCaesar
2016-12-18 15:53:35 +08:00
parent 049f20a1e1
commit b8577f7aff

View File

@@ -4,6 +4,7 @@ session劫持是一种广泛存在的比较严重的安全威胁在session技
本节将通过一个实例来演示会话劫持希望通过这个实例能让读者更好地理解session的本质。 本节将通过一个实例来演示会话劫持希望通过这个实例能让读者更好地理解session的本质。
## session劫持过程 ## session劫持过程
我们写了如下的代码来展示一个count计数器 我们写了如下的代码来展示一个count计数器
```Go
func count(w http.ResponseWriter, r *http.Request) { func count(w http.ResponseWriter, r *http.Request) {
sess := globalSessions.SessionStart(w, r) sess := globalSessions.SessionStart(w, r)
@@ -18,11 +19,12 @@ session劫持是一种广泛存在的比较严重的安全威胁在session技
t.Execute(w, sess.Get("countnum")) t.Execute(w, sess.Get("countnum"))
} }
```
count.gtpl的代码如下所示 count.gtpl的代码如下所示
```Go
Hi. Now count:{{.}} Hi. Now count:{{.}}
```
然后我们在浏览器里面刷新可以看到如下内容: 然后我们在浏览器里面刷新可以看到如下内容:
![](images/6.4.hijack.png?raw=true) ![](images/6.4.hijack.png?raw=true)
@@ -56,6 +58,7 @@ count.gtpl的代码如下所示
其中一个解决方案就是sessionID的值只允许cookie设置而不是通过URL重置方式设置同时设置cookie的httponly为true,这个属性是设置是否可通过客户端脚本访问这个设置的cookie第一这个可以防止这个cookie被XSS读取从而引起session劫持第二cookie设置不会像URL重置方式那么容易获取sessionID。 其中一个解决方案就是sessionID的值只允许cookie设置而不是通过URL重置方式设置同时设置cookie的httponly为true,这个属性是设置是否可通过客户端脚本访问这个设置的cookie第一这个可以防止这个cookie被XSS读取从而引起session劫持第二cookie设置不会像URL重置方式那么容易获取sessionID。
第二步就是在每个请求里面加上token实现类似前面章节里面讲的防止form重复递交类似的功能我们在每个请求里面加上一个隐藏的token然后每次验证这个token从而保证用户的请求都是唯一性。 第二步就是在每个请求里面加上token实现类似前面章节里面讲的防止form重复递交类似的功能我们在每个请求里面加上一个隐藏的token然后每次验证这个token从而保证用户的请求都是唯一性。
```Go
h := md5.New() h := md5.New()
salt:="astaxie%^7&8888" salt:="astaxie%^7&8888"
@@ -66,9 +69,10 @@ count.gtpl的代码如下所示
} }
sess.Set("token",token) sess.Set("token",token)
```
### 间隔生成新的SID ### 间隔生成新的SID
还有一个解决方案就是我们给session额外设置一个创建时间的值一旦过了一定的时间我们销毁这个sessionID重新生成新的session这样可以一定程度上防止session劫持的问题。 还有一个解决方案就是我们给session额外设置一个创建时间的值一旦过了一定的时间我们销毁这个sessionID重新生成新的session这样可以一定程度上防止session劫持的问题。
```Go
createtime := sess.Get("createtime") createtime := sess.Get("createtime")
if createtime == nil { if createtime == nil {
@@ -77,7 +81,7 @@ count.gtpl的代码如下所示
globalSessions.SessionDestroy(w, r) globalSessions.SessionDestroy(w, r)
sess = globalSessions.SessionStart(w, r) sess = globalSessions.SessionStart(w, r)
} }
```
session启动后我们设置了一个值用于记录生成sessionID的时间。通过判断每次请求是否过期(这里设置了60秒)定期生成新的ID这样使得攻击者获取有效sessionID的机会大大降低。 session启动后我们设置了一个值用于记录生成sessionID的时间。通过判断每次请求是否过期(这里设置了60秒)定期生成新的ID这样使得攻击者获取有效sessionID的机会大大降低。
上面两个手段的组合可以在实践中消除session劫持的风险一方面 由于sessionID频繁改变使攻击者难有机会获取有效的sessionID另一方面因为sessionID只能在cookie中传递然后设置了httponly所以基于URL攻击的可能性为零同时被XSS获取sessionID也不可能。最后由于我们还设置了MaxAge=0这样就相当于session cookie不会留在浏览器的历史记录里面。 上面两个手段的组合可以在实践中消除session劫持的风险一方面 由于sessionID频繁改变使攻击者难有机会获取有效的sessionID另一方面因为sessionID只能在cookie中传递然后设置了httponly所以基于URL攻击的可能性为零同时被XSS获取sessionID也不可能。最后由于我们还设置了MaxAge=0这样就相当于session cookie不会留在浏览器的历史记录里面。