sql注入及JWT学习| 青训营笔记

339 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

Go语言防止SQL注入

db = db.Where("merchant_id = ?", merchantId)

SQL 预编译技术,其中预编译的 SQL 语句merchant_id = ?和 SQL 查询的数据merchantId将被分开传输至 DB 后端进行处理。

db.AutoMigrate(&Product{}) //建表。同时可以自由增删struct里的列,很灵活
result := db.Create(&user) // 通过数据的指针来创建
result := db.Find(&users) // SELECT * FROM users;
db.Model(&User{}).First(&result) // SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

JWT的定义

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景,因为JWT使用起来轻便,开销小,服务端不用记录用户状态信息(无状态)。

JWT的组成部分

  • 头部(header)
  • 载荷(payload)
  • 签证(signature)

JWT的原理

服务器认证以后,返回一个 JSON 对象,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

服务器就不保存任session 数据,是无状态,从而容易扩展。

  • session 存储在服务端占用服务器资源,而 JWT 存储在客户端
  • session 存储在 Cookie 中,存在伪造跨站请求伪造攻击的风险
  • session 只存在一台服务器上,那么下次请求就必须请求这台服务器,不利于分布式应用
  • 存储在客户端的 JWT 比存储在服务端的 session 更具有扩展性

JWT的用法

客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。 此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。

JWT的不足

服务器不保存会话状态,一旦JWT签发,在有效期内将会一直有效。一旦信息泄露,任何人都可以获得令牌的所有权限,所以JWT的有效期不宜设置太长。