由cookies安全了解的
参考资料:
csrf
原理
csrf发生在浏览器中,原理容易理解,不多赘述。可看这里
防范
数据传输格式使用JSON
form
表单提交不支持JSON
(MDN),可防止form
形式的csrf
。
XMLHttpRequest
遵循同源策略。虽然可以发送JSON
,但规范中规定,发送JSON
会进行cors
检查,由浏览器完成。如果服务器未设置跨域相关字段或站点不被允许,则浏览器不会发送请求到服务器。故可以通过服务器设置跨域相关字段防止此类csrf
。
fetch
的三种mode
见此处。same-origin
不允许跨域;cors
遵循同源策略;no-cors
是指只允许简单请求(基本与同源策略中的简单请求相同),不进行预请求。若违反(比如发送json
)则服务器能收到请求和正确的数据,但是数据格式丢失,并且前端js报错。
注:浏览器进行cors
检查的预请求可看MDN
再注:若要支持跨域,则真实请求(如POST)的响应头需要写入Access-Control-Allow-Origin
字段,否则浏览器不会将响应信息传给js。(服务器可以接收信息)
CSRF Tokens
此方法出现的时间约为04年甚至更早,前提条件是html
通过后端渲染,所以在当下流行前端渲染时难以实现。(可以参考这个node例子理解)
具体实现是在后端进行,后端生成一个与user无关的token,并将token渲染进form表单中。在form提交时也会传输token,后端只需检查token与对应的user是否匹配即可。并且这种token最好是一次性的,所以只需保证足够的随机性就能防止csrf(通常用加盐hash。当前有许多优秀插件解决此问题,此处只是了解,并不推荐自行实现)。(这个回答下的评论说需要将token与request绑定才足够安全,由于没有其他资料,暂不考虑)其他内容如校验时机,token生成时机等细节不详细说明,可看cnode的例子。
注:token必须由后端渲染进dom。储存在cookie中,或者通过api获取token都是不安全的。虽然储存在localStorage是安全的,但这意味着需要通过api获取,依然不安全。
xss
原理
在用户输入的数据中注入特定的代码,利用浏览器解析和解码顺序,使得该代码得以用户使用过程中执行。
防范
在所有需要使用用户输入的地方,获取数据时要进行过滤,使用现有的库即可。例如node
的xss
。xss
的做法过多,不应由自己处理。