go语言

golang 代码安全审计

耗尽温柔 提交于 2020-01-16 14:43:06
前言 Go语言主要用作服务器端开发语言,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。Go语言是强类型语言,它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。 由于Go语言代码审计资料较少,这里就把最近学习的对Vulnerability-goapp项目的审计过程分享一下。整个审计过程结合代码安全扫描工具和人工审计,期间也发现代码安全审计工具的漏报误报问题,以下将会细述。 审计对象 经过在github上查找,发现 https://github.com/Snow-HardWolf/Vulnerability-goapp 这个项目适合入门,涵盖了常见的go web安全漏洞。Gitclone之后在goland IDE里打开看到如下项目结构: Asserts目录是静态资源文件,跳过。 Pkg目录是使用go实现的业务逻辑代码,重点关注。 Runenv是数据库配置文件和生成数据库的脚本,简单看下就好。 Trap目录是一个CSRF漏洞的演示,重点关注。 Views目录是前端视图页面,简单看下就好。 代码安全扫描 首先我们使用代码安全扫描工具扫描,发现4类高危,2类中危漏洞,我们分别进行验证。 命令注入-数据流分析 在pkg/admin/admin

GO语言学习-接口interface

梦想的初衷 提交于 2020-01-16 01:35:13
GO语言学习-接口interface 接口定义 接口执行机制 接口:多个方法声明的集合,只关心做什么 go中可以先实现类型,再抽象出所需接口 接口可以减少用户可视方法,屏蔽内部结构和实现细节。 但是会有运行期开销。 通常用在 对外包提供访问 或预留 扩展空间 接口定义 1.不能有字段 2.不能定义自己的方法 3.不能实现方法,只能 声明方法 4.可以嵌入别的接口类型——不能有同名方法(不支持重载);也不能自身或循环嵌入 5.通常用er作为名称后缀 6.空接口(interface{})可被赋值为任何类型对象(类似面向对象中的根类型Object) 7.接口变量默认值是nil 8 接口执行机制 1.将对象赋值给接口变量时,会复制该对象;且接口存储的复制品无法修改 2.解决方法:将对象指针赋值给接口,使接口存储的为指针复制品,可以修改指针所指的值。 来源: CSDN 作者: Mrong1013967 链接: https://blog.csdn.net/Mrong1013967/article/details/103985977

go语言http服务处理image/css/js等静态文件

戏子无情 提交于 2020-01-15 05:04:46
go语言实现http服务器时如果处理静态文件,需要用到http.ServeFile: func ServeFile(w ResponseWriter, r *Request, name string) { dir, file := filepath.Split(name) serveFile(w, r, Dir(dir), file, false)} 首先根据请求路径r.URL.Path判断是否包含静态文件目录,如果存在则直接返回: img_dir := "/home/qinpeng" if strings.HasPrefix(r.URL.Path,"/img"){ file := img_dir + r.URL.Path[len("/img"):] f,err := os.Open(file) defer f.Close() if err != nil && os.IsNotExist(err){ file = img_dir + "/default.jpg" } http.ServeFile(w,r,file) return } 来源: CSDN 作者: az44yao 链接: https://blog.csdn.net/az44yao/article/details/103799896

聊一聊堆、栈与Go语言的指针

非 Y 不嫁゛ 提交于 2020-01-14 18:57:09
堆、栈与指针 前言 堆、栈在计算机领域是亘古不变的热门话题,归根结底它们和编程语言无关,都是操作系统层面的内存划分,后面尝试简单地拆开这几个概念,谈谈我对它们的理解。 栈 每个函数中每个值在栈中都是独占的,不能在其他栈中被访问。每个方法片(function frame)都有一个自己的独享栈,这个栈的生命周期随着方法开始结束诞生与消逝,在方法结束时候会被释放掉,较之于堆,栈的优势是比较轻量级,随用随弃,存活期跟随着函数。 堆 通俗的讲,假如说栈是各个函数的一栋私人住宅,堆就是一个大型的人民广场,它可以被共享。堆作为一个全局访问块,它的空间由GC(拆迁大队)管理。 The heap is not self cleaning like stacks, so there is a bigger cost to using this memory. Primarily, the costs are associated with the garbage collector (GC), which must get involved to keep this area clean. 翻译过来,区别于栈在函数调用结束时候就释放掉,堆不会自动释放,堆空间的释放主要来自于垃圾回收操作。 GC(Garbage collection) 垃圾回收, 垃圾回收具有多种策略,一般来说,每一个存在于堆中

goweb-文本处理

怎甘沉沦 提交于 2020-01-14 16:23:06
文本处理 Web开发中对于文本处理是非常重要的一部分,我们往往需要对输出或者输入的内容进行处理,这里的文本包括字符串、数字、Json、XML等等。Go语言作为一门高性能的语言,对这些文本的处理都有官方的标准库来支持。而且在你使用中你会发现Go标准库的一些设计相当的巧妙,而且对于使用者来说也很方便就能处理这些文本。 XML处理 XML作为一种数据交换和信息传递的格式已经十分普及。而随着Web服务日益广泛的应用,现在XML在日常的开发工作中也扮演了愈发重要的角色 解析XML 如何解析如上这个XML文件呢? 我们可以通过xml包的Unmarshal函数来达到我们的目的 func Unmarshal(data []byte, v interface{}) error data接收的是XML数据流,v是需要输出的结构,定义为interface,也就是可以把XML转换为任意的格式。我们这里主要介绍struct的转换,因为struct和XML都有类似树结构的特征。 package main import ( "encoding/xml" "fmt" "io/ioutil" "os" ) type Recurlyservers struct { XMLName xml.Name `xml:"servers"` Version string `xml:"version,attr"` Svs [

Go语言的包(package)

孤人 提交于 2020-01-14 09:39:08
包名是从$GOPATH/src/后开始计算的,使用/进行路径分隔。 想要被别的包调用标识符都要的首字母大. 单行导入和多行导入. 导入包不想使用内部的标识符,需要使用匿名导入. 每个包导入的时候会自动执行一个名为init()的函数,它没有参数也没有返回值,也不能手动调用 多个包中都定义了init()函数,则它们的执行顺序见下图: 包引入是用不建议使用下图中点的方式: 来源: https://www.cnblogs.com/haima/p/12190194.html

Go语言(十五)Database/Sql操作

こ雲淡風輕ζ 提交于 2020-01-14 08:58:59
Go语言Database/Sql操作 Go语言标准库中有两个包和DB操作相关,database/sql和database/sql/driver。 sql包提供了保证SQL或类SQL数据库的泛用接口。 driver包定义了应被数据库驱动实现的接口,这些接口会被sql包使用。 一、SQL操作 1、下载驱动 Go语言标准库提供的两个包都是相关接口,要连接数据库还需要相关驱动程序。 以操作MYSQL为例,需要的驱动可以通过go get命令在github上下载。 go get github . com / go - sql - driver / mysql 下载下来的驱动包会存放在Gopath下。 2、sql操作 程序中需要导入两个包。 mysql驱动包只需要引入init()函数就行。 import ( "database/sql" //通过_引入init()函数 _ "github.com/go-sql-driver/mysql" //驱动初始化 ) //初始函数给mysql注册了驱动 func init ( ) { sql . Register ( "mysql" , & MySQLDriver { } ) } 1、连接驱动格式 在sql包下的Open函数中,需要连接数据库的驱动。格式如下 "mysql" , "username:password@tcp(127.0.0.1:3306)

Go语言基础知识学习笔记1

喜欢而已 提交于 2020-01-14 08:58:17
Go语言基础知识学习笔记1 安装教程我就不写了,推荐大家下载msc的安装包,因为他会自动帮你配置一些环境变量,但是GOPATH这个工作目录的环境变量需要自己配置 右键我的电脑->属性->高级系统设置->环境变量->新建系统变量 变量名称大写 GOPATH 路径就你的工作目录,如我的是D:/go 如果有多个工作目录就使用";"分号分割 根据约定,GOPATH下需要建立3个目录: bin (存放编译后生成的可执行文件) pkg (存放编译后生成的包文件) src (存放项目源码) 查看环境变量与工作目录 控制台输入:go env C:\>go env set GOARCH=amd64 //CPU架构信息 set GOBIN= //工作目录下的bin文件夹,存放编译文件 set GOCHAR=6 set GOEXE=.exe //生成可执行文件的后缀名 set GOHOSTARCH=amd64 //当用到交叉编译的时候,你需要交叉的架构 set GOHOSTOS=windows //当用到交叉编译的时候,你需要交叉的系统 set GOOS=windows //当前系统的系统名称,也可能是linux,unix set GOPATH= //你的工作目录 set GORACE= set GOROOT=C:\Go //Go语言的安装目录 set GOTOOLDIR=C:\Go\pkg\tool

go语言初记

断了今生、忘了曾经 提交于 2020-01-14 01:52:57
快速了解 http://go-tour-zh.appspot.com/welcome/1 (可以需要爬墙) 下面记录下了解go的过程,特别记录下与你脑子里原有“观念”不同的地方: 1. 声名 初始化,类型在后面,不一样 var a, b int var a,b =1,2var c, python, java = true, false, "no!" a,b:=func fname(string,string) //非声明,必须在func使用 短声明变量 在 函数中 , `:=` 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。 函数外的每个语法块都必须以关键字开始(`var`、`func`、等等),`:=` 结构不能使用在函数外。 2. 函数返回多个值 func swap(x, y string) (string, string) { //x, y string 等价 x sring ,y string   return y, x } 命名返回值 func swap(string, string) (x, y string) { #返回值分别命名为x,y   x= x+12  y= y+1   return } // 空return实际返回的是x,y 3.对于声明了但没使用的变量,引入但没有使用的包,会引发错误, go可以自动格式化源码 func 函数体的第一个' {

goweb-go语言基础

一笑奈何 提交于 2020-01-13 23:09:13
go语言基础 虽然这本书是讲goweb,但还是吧go语言基础过了一遍,由于我之前已经对go语言基础做了一遍系统的学习,这里就当简单回顾一下,不再写过多笔记了,之前的写的博客都有基础知识,O(∩_∩)O哈哈~ Go是天生支持UTF-8的,任何字符都可以直接输出,你甚至可以用UTF-8中的任何字符作为标识符。 Go使用package(和Python的模块类似)来组织代码。main.main()函数(这个函数位于主包)是每一个独立的可运行程序的入口点。Go使用UTF-8字符串和标识符(因为UTF-8的发明者也就是Go的发明者之一),所以它天生支持多语言 var和const参考2.2Go语言基础里面的变量和常量申明 package和import已经有过短暂的接触 func 用于定义函数和方法 return 用于从函数返回 defer 用于类似析构函数 go 用于并发 select 用于选择不同类型的通讯 interface 用于定义接口,参考2.6小节 struct 用于定义抽象数据类型,参考2.5小节 break、case、continue、for、fallthrough、else、if、switch、goto、default这些参考2.3流程介绍里面 chan用于channel通讯 type用于声明自定义类型 map用于声明map类型数据 range用于读取slice、map