GO WEB 学习笔记(六)安全与加密

安全与加密

  • WEB 安全一直都是WEB开发者必须重点关注的对象,很多安全漏洞导致数据丢失的案例都是因为WEB 安全没有做好。
  • 很多WEB应用程序的安全问题都是轻信了第三方提供的数据,比如:
  • 当用户输入对应的数据信息时,如果不进行验证,直接输出到客户端,就有可能造成跨站脚本攻击的问题
  • 当用户输入对应的数据信息时,如果不进行验证,直接进行数据库查询,就有可能造成SQL注入的问题
  • 所以对于用户的输入进来的信息,需要进行验证,对于有些重要的信息还需要进行加密。

预防CSRF攻击

  1. 首先第一个问题什么是CSRF?
    • 简单来说,就是攻击者可以利用的登录信息,假装你的操作,发送给服务器,让服务器进行他想要的操作,举个例子,就是假设你用浏览器登陆了网上银行,但是呢你同时又打开了一个连接,这个链接可能就是钓鱼连接,因为你的网上银行的会话没有取消,并且你的登陆信息可能通过cookie存放到浏览器上,所以钓鱼连接可能通过这些信息模拟你的操作,将你的银行账户里的资金转走。
    • CSRF 的原理:
      在这里插入图片描述
      • 上图可以观察出,想要完成一次CSRF攻击,需要完成两个步骤:
        • 登录受信任站点A,并在本地⽣成Cookie
        • 在不登出A的情况下,訪问危急站点B
    • CSRF攻击主要是因为Web的隐式身份验证机制,Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。
  2. 认识了CSRF之后,我们再来思考一下如何预防CSRF的攻击呢?
  • 主要是从两个方面下手比较好:
    • 更新的资源的请求必须使用post
    • 在请求中加入随机数,生成随机数token,每次提交表单都必须要携带token,服务器获取token之后进行解析,如果token解析正常,则再进行操作,如果token解析不正常,就不予理会。

确保输入过滤

  • 过滤客户端传过来的数据是web应用安全的很重要的一个点,验证数据的合法性可以避免很多报错和污染的数据,然而过滤数据主要有三步组成:
  1. 识别数据:知道过滤的数据从哪里来的,其实就是获取header里面的所有数据。
  2. 过滤数据:知道数据源之后,我们就可以对这些数据进行过滤,把需要的和安全的数据过滤出来。
  3. 区别过滤数据:当我们把数据过滤出来之后,还需要把我们需要的安全的数据存到一个新的容器中,以免收到污染

避免XSS攻击(待更新)

避免SQL注入

  • 首先我们需要了解一下什么是SQL注入?
  • SQL注入顾名思义就是一种将攻击性代码放到SQL里面操作数据库的操作。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
  • 所以这个攻击是很危险的,知道他的危险之后,我们再来思考为啥会产生这个现象?我们来看一段sql的代码
  • sql := "select * from user where username like '%" + p + "%"
  • 这条sql乍一看没有特别大的问题,通过拼接的方式获取参数,但是如果p的参数是些别的数据呢?
  • 比如这样p := "%' exec master..xp_cmdshell'net user test testpass /ADD'--",就有可能MYSQL服务器会执行这条sql,然后像系统添加一个新用户的命令,这样就有新的身份来获取数据库权限了。
  • 虽然这样有局限性,就是攻击者必须知道数据库的结构信息等等,但是你不能保证他不能获取得到对应的信息,因为安全就是为了避免一切的可能性,所以我们需要做对应的处理,怎样的处理呢?这里有6个建议
  1. 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度减少注入攻击对数据库的危害。
  2. 检查输入的数据是否具有所期望的数据格式,严格限制变量的类型。
  3. 对进入数据库的特殊字符('"\尖括号&*;等)进行转义处理,或编码转换。
  4. 对于参数进行注入处理,不再是使用拼接,安全系数会提高很多
  5. 在应用发布之前建议使用专业的SQL注入检测工具进行检测,以及时修补被发现的SQL注入漏洞。
  6. 避免网站打印出SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。

存储密码

  • 不知道你们有没有想过一个问题,你们在各大网站的密码是不是都十分相似,或者说很多都是一样的,假设其中一个网站给攻破了,黑客利用你的密码导出尝试,你的信息和资金会不会十分危险?
  • 所以对于密码进行加密十分重要,对于开发者来说,用户的密码存储是一定要加密的,不然容易出现信息泄露问题。
  1. 我们最开始对于这一类的方案是,通过单向哈希加密算法对于密码进行加密。验证的时候,将客户端传过来的密码加密后跟数据库密码机密后进行对比,如果相同,则身份验证成功。
    • 特性:
      • 同一个密码进行单向哈希,得到的总是唯一确定的摘要
      • 计算速度快。随着技术进步,一秒钟能够完成数十亿次单向哈希计算。
    • 缺点:这种加密方式公开之后,加密跟不加密的区别不大
  2. 然后就有了第二种进阶方案,加强加密哈希算法,因为黑客能获取加密之后的数据主要是加密算法开源,要是自己设计加密方法,黑客就不知道,但是这种需要一定的基础,所以还有一种方法,就是第一次还是用单向哈希算法进行加密,然后将加密后的数据加上一定的字符串再进行加密,这样的话黑客解析出来也不知道是啥,这样的话保密性提升很高。

加密和解密数据

  1. base64加密:
package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
	//加密
	password := "123456"
	basePassword := []byte(base64.StdEncoding.EncodeToString([]byte(password)))
	fmt.Println(basePassword)

	//解密
	ans, err := base64.StdEncoding.DecodeString(string(basePassword))
	if err != nil {
		fmt.Println(err.Error())
	}
	if password != string(ans) {
		fmt.Println("err!")
	}

	fmt.Println(string(ans))

}

  1. 高级加解密:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值