HTTP安全问题
CSRF
CSRF(Cross-site request forgery)跨站请求伪造
什么是CSRF
顾名思义,是伪造请求,冒充用户在站内的正常操作.攻击者盗用了你的身份,以你的名义发送恶意请求
如何防止CSRF
- 关键操作只接受POST请求
- 验证码 CSRF攻击的过程,往往是在用户不知情的情况下构造网络请求。所以如果使用验证码,那么每次操作都需要用户进行互动,从而简单有效的防御了CSRF攻击
- 检测Referer 通过检查Referer的值,我们就可以判断这个请求是合法的还是非法的,但是问题出在服务器不是任何时候都能接受到Referer的值,所以 Referer Check 一般用于监控 CSRF 攻击的发生,而不用来抵御攻击。
- Token
目前主流的做法是使用Token抵御CSRF攻击.
CSRF攻击要成功的条件在于攻击者能够预测所有的参数从而构造出合法的请求。所以根据不可预测性原则,我们可以对参数进行加密从而防止CSRF攻击
另一个更通用的做法是保持原有参数不变,另外添加一个参数Token,其值是随机的。这样攻击者因为不知道Token而无法构造出合法的请求进行攻击
Token 使用原则:
Token 要足够随机————只有这样才算不可预测
Token 是一次性的,即每次请求成功后要更新Token————这样可以增加攻击难度,增加预测难度
Token 要注意保密性————敏感操作使用post,防止Token出现在URL中
XSS
什么是XSS
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击
其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等
如何防止XSS
检查过滤用户输入数据;
如果不需要用户输入HTML可以直接对用户的输入进行HTMLescape
当我们需要用户输入HTML的时候,需要对用户输入的内容做更加小心细致的处理。仅仅粗暴地去掉script标签是没有用的,任何一个合法 HTML 标签都可以添加 onclick 一类的事件属性来执行 JavaScript。更好的方法可能是,将用户的输入使用 HTML 解析库进行解析,获取其中的数据。然后根据用户原有的标签属性,重新构建 HTML 元素树。构建的过程中,所有的标签、属性都只从白名单中拿取。