xss
xss本质: 恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。
分类
1、存储型xss --服务端漏洞--出现在服务端渲染页面
2、反射型xss --服务端漏洞--出现在服务端渲染页面
3、DOM 型 XSS --前端漏洞--出现在纯前端渲染页面
1、存储型是攻击者提交恶意代码,服务器保存到数据库中,用户访问该目标网站时,服务器将恶意代码数据取出,并拼接到网页代码中,会攻击用户网站,获取用户私人信息。
2、反射型是攻击者利用网站有输入字段和拼接字段的漏洞,输入恶意代码,服务器返回拼接好的字段,浏览器执行恶意代码。
3、Dom型是浏览器读取并拼接数据,没有过滤数据,不经过服务器,属于前端漏洞
xss的预防
对于存储型和反射型xss,字段转义(过滤)应该在输出阶段,因为网页端和客户端的转义规则不同,所以只能在输出的时候分别转义。
对于dom型xss,避免拼接不可信代码,要进行前端转义。
CSRF
csrf是跨站伪造请求,就是伪造成你本人去发起恶意请求。举个例子。
比如你打开一个浏览器,登录了银行网站,此时你的浏览器相对于这个银行网站是已登录的状态,授予该浏览器登录态cookie。然后你打开了一个恶意网站,该恶意网站携带着你的页面cookie(记住,是无法获取该cookie的),伪造并向该银行网站发起了一个请求(估计该恶意网站很熟悉该银行网站的请求方式什么的吧 ),此时该而已网站就成功伪装成了你的身份。该银行网站只知道这是它的合法用户发起的请求,并不知道其实是恶意伪造的请求。所以,csrf攻击成功!!!
csrf防范手段
1、服务器同源策略
服务器根据请求头所带的(origin||referer),来判断请求域是否同域。
不过也有些攻击是在本网站进行的,比如可以评论的页面,就可以注入包装恶意代码,这样同源策略就失效了。
2、每个请求携带token
用户登录网站时,服务端给每个用户生成一个随机token,用户给每个请求都带上token,包括form表单、script标签等等,服务器收到请求后,验证token的真伪。
不过如果该网页被xss攻击,就会获取到该token,然后再csrf攻击,oh no!又糟糕了。
3、在请求前添加验证码
??既然有同源限制,为什么还有csrf攻击
同源限制是浏览器的限制,禁止不同源网站a获取到不同源网站b的数据,所以,发出的请求是成功的,只是获取到的数据被浏览器拦截了。
csrf只是伪造了请求,并不用拿到数据,所以是不受影响的。
by the way,浏览器对form表单提交是没有同源限制的。
顺便扩展一下同源限制
同源限制只是浏览器的限制规则,防止拿到非同源网站的数据,保护的是被请求的网站。
而script标签、img标签是不受同源限制的,它们的src属性可以获取到外域的内容,是jsonp可以跨域的原理。
CORS是服务器的response header设置了Access-Control-Allow-Origin,该属性值如果包含了请求域,浏览器就将数据返回给该浏览器,否则就拦截该请求数据。
学习链接:https://juejin.im/post/5bad9140e51d450e935c6d64、
https://juejin.im/post/5bc009996fb9a05d0a055192