go语言web开发07 - beego XSRF防护

xsrf(跨站请求伪造)防护:

  • 定义:每个用户一个cookie,所有的请求都需要验证这个cookie,如果没有这个cookie,则被认为跨站请求伪造。
  • 防止类型:挟制用户在当前已登陆的web应用程序上执行非本意的操作的攻击方法。
  • XSRF:利用的是网站对用户网页浏览器的信任。

 

一、开启XSRF防护的两种方法

1.1、方法一:在配置文件里开启

// 在配置文件里添加如下三条配置
enablexsrf = true        // 开启xsrf防护
xsrfkey = 61oEzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o          // beego默认的xsrfkey是:“beegoxsrf”,这里将key改为基于当前的key进行加密
xsrfexpire = 3600      //过期时间,默认1小时,单位秒

 

1.2、方法二:在main.go里beego.Run()上方开启

// 在beego.Run()上方添加如下三行配置
beego.BConfig.WebConfig.EnableXSRF = true      // 开启xsrf防护
beego.BConfig.WebConfig.XSRFKey = "61oEzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o"      // beego默认的xsrfkey是:“beegoxsrf”,这里将key改为基于当前的key进行加密
beego.BConfig.WebConfig.XSRFExpire = 3600       //过期时间,默认1小时,单位秒

 

二、开启XSRF防护后使用post请求提交数据示例

xsrf只对post请求生效,对get请求无效,本示例是基于form表单的xsrf防护示例:

2.1、路由规则定义

beego.Router("/test_xsrf", &controllers.XsrfController{})

 

2.2、controller定义

package controllers

import (
    "html/template"

    "github.com/astaxie/beego"
)

type XsrfController struct {
    beego.Controller
}

// get请求处理方法
func (c *XsrfController) Get() {
    // get请求时生成xsrf防护数据传递模板文件,生成xsrf数据的函数为:template.HTML()
    c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML())
    c.TplName = "test_xsrf.html"
}

// post请求处理方法
func (c *XsrfController) Post() {
    c.TplName = "success.html"
}

 

2.3、模板文件中form表单使用xsrf防护

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>test xsrf 页面</h1>
    <!-- form表单使用xsrf防护, 提交时不需要做特殊处理,只需要在form标签里获取后端传过来的xsrf key即可 -->
    <form action="/test_xsrf" method="POST">
        {{.xsrfdata}}     <!-- 获取get请求时后端传过来的xsrf防护的key -->
        <input type="submit" value="提交">
    </form>
</body>
</html>

 

2.4、查看网页代码

 

 发现提交页面里自动生成了一个 name=“_xsrf” 的input标签。

 

三、如何取消某一个controller的xsrf防护

开启xsrf防护后全局的controller就都开启了xsrf防护了,但是有个特殊的需求需要对某一个controller关闭xsrd防护该如何做那?

我们只需要对需要关闭xsrf防护的controller实现一个 ”Prepare“ 方法即可,方法的内容如下:

package controllers

import (
    "html/template"

    "github.com/astaxie/beego"
)

type XsrfController struct {
    beego.Controller
}

// Prepare 方法
func (c *XsrfController) Prepare() {
    c.EnableXSRF = false       // 关闭xsrf防护
}

// get请求的处理方法
func (c *XsrfController) Get() {
    // get请求时传递xsrf防护的key
    c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML())
    c.TplName = "test_xsrf.html"
}

// post请求的处理方法
func (c *XsrfController) Post() {
    c.TplName = "success.html"
}

 

posted @ 2020-09-02 17:30  欧-阳  阅读(456)  评论(0)    收藏  举报