Golang 最佳实践

概述

这是Golang编程语言的一组安全原则。
该指南旨在作为应用程序安全团队的安全软件开发生命周期(SSDLC)的一部分,为开发团队和质量保证提供实时的安全参考。
这样,随着应用程序安全团队意识到当前准则中的新安全性注意事项或差距,它将不断地添加和更新。

Golang是一种强型别语言,内建方法来防止其他语言中发现的安全问题。
例如:没有指标方法,自动垃圾收集,用於AES的标准加密套件不提供密码块连结(CBC)作为选项。。

推荐套件
资源
  • Checkmarx Web应用程序安全编码做法:

    • https://checkmarx.gitbooks.io/go-scp/
  • 使用本机模板进行输出编码
    net/http套件不提供任何类型的输出编码。
    html/template套件实现了资料驱动的模板,以生成可防止程序码注入的HTML输出。
    它提供与套件文本/模板相同的界面,并且只要输出为HTML,就应使用该介面代替本文/模板。
    该程序套件了程序套件文本/模板,因此您可以共享其模板API来安全地解析和执行HTML模板。
    该软件套件可理解HTML,CSS,JavaScript和URI。
    它为每个简单的操作管道添加了清理功能。

    由於缺乏输出程序码,使用net/http套件会使Web应用程序用户遭受跨站点脚本攻击。

  • 修正

    使用html/template套件可自动转换HTML,CSS,JavaScript和URI。
    如果使用net/http套件,可使用手动转换并设置Content-Type,它会根据内容自动设置。

  • 风险等级

  • 参考

  • 注意输出编码绕过

    html/template套件提供了一种使用模板规避转换管道的方法。
    [HTML | JS | URL]()方法将字符串设置为其类型。

    将用户置於此声明函数中将绕过预设值输出编码,将跨站点脚本和HTML注入漏洞引入您的Web应用程序。

  • 问题范例:

    以下将把 World </ b>字符串声明为HTML,并将其原样打印到HTML中:

      golang
      tmpl.Execute(out,template.HTML(`<b> World </ b>`))
    
  • 修正

    本地html套件中的EscapeString()函数接受一个字符串,并返回带有转换特殊字符的相同字符串。
    (即<<变成<`)。
    html/template套件具有stripTags()函数。

    html/template套件提供了一些用於转换字符串的功能:

      golang
     HTMLEscape()
     HTMLEscapeString()
     HTMLEscaper()
     JSEscape()
     JSEscapeString()
     JSEscaper()
     URLQueryEscaper
    

    避免在用户输入上使用模板类型的字符串。

  • 风险等级

  • 参考

  • 使用crypto/rand代替math/rand

    math/rand程序套件是确定性伪随机数生成器。
    它获取一个种子,并随之生成伪随机数。
    因为它是确定性的,所以每次运行应用程序时这些值都是相同的,从而使攻击者可以预测这些值。

    知道数学/ rand种子的任何人都可以确定应用程序使用的伪随机值。

  • 修正

    应该使用crypto/rand软件套件而不是math/rand软件套件。
    该软件套件使用操作系统随机性来生成伪随机数。因此,生成的值不是确定的,不需要种子。

  • 问题范例:

      //此范例从rand.Reader读取10个加密安全的伪随机数,并将其写入位元组:
      golang
      	package main
    
      	import
      	(
      	"bytes"
      	"crypto/rand"
      	"fmt"
      	)
    
      	func main()
      	{
      		c:= 10
      		b:= make([] byte,c)
      		_,err:= rand.Read(b)
      		if err!= nil {
      		fmt.Println("err:",err)
      		return
      	}
    
      	//现在应该套件含随机字节,而不是零。
      	fmt.Println(bytes.Equal(b,make([] byte,c)))
    
  • 风险等级

  • 参考


<<:  Day[-2] 今天我想来点Kibana的Data Table

>>:  [Day 28] API前後端串接

Day13 天气API小实作3

继续昨天~ 写完之後一定要task.resume!!!不然不会动作这个func 这段程序码是在写当我...

[Day25] 测试一定要写好写满?时间有限怎麽办?

既然要写测试,就先来了解前端常见的几种测试类型,从最大家最常听到的单元测试(Unit Testing...

[Day17] Webpack - 跨浏览器支援

讲到浏览器,脑中浮现的通常是 Google Chrome、IE(Edge)、FireFox、Safa...

如何执行一支程序?

我接触电脑从8086和DOS开始。 在那个时代,我们已可以输入档案名称来载入并执行感兴趣的程序。如...

[Day26] NLP会用到的模型(九)-实作transformer-上

一. 资料准备 这次任务是实作机器翻译,资料: http://www.manythings.org/...