目前我知道的,存储型xss解决方法:过滤转义用户输入的脚本、标签,csrf漏洞解决方法:校验referer、加token、加验证码
而referer校验是针对存在referer的情况,因为某些请求的head里没有referer,这时不能判断请求是非法的;加token,保存在哪是个问题,如果保存在session中,当集群部署时,session不同步会导致客户端的token与处理请求的服务器的token不一致;加验证码同样的道理,而且对用户体验非常不好。
由于xss和csrf都是改变用户请求参数来达到恶意攻击的目的,所以,如果我们从参数改变这一点切入,就没有问题了,做法很简单:
将参数加密后传递,这样请求被拦截篡改的参数将不能被服务器解密,因而拒绝请求。
前台需要两个加密方法:
1、md5加密 参数列表
2、des加密 参数列表进行md5加密的顺序
后台需要一个加密和一个解密方法:
1、同样的md5加密方法
2、des解密方法
参数列表中参数均为请求传递参数,参数值为空的可过滤掉
需要为解决漏洞而添加的几个参数:
1、sign签名:参数列表参数md5加密后字符串,比如参数id=1&name=Tobey Black&sex=baby,那么假设通过md5加密(增加随机数等这里略):
md5(1,‘Tobey Black‘,‘baby‘)得到123G1JH123G(由于不能解密所以无法伪造)。
2、order参数顺序:参数列表中参数进行md5加密的顺序,根据1得到参数加密顺序为id,name,sex,对"id,name,sex"进行des加密。
3、filter被过滤特殊字符的参数:考虑到当参数值含有特殊字符如单引号、空格、换行、尖括号等进行md5加密的结果前后台不一致(js对这些字符进行转义),所以,这些参数要过滤特殊字符再md5处理,这里对name进行过滤(多个还是用逗号拼接),得到TobeyBlack,最后把它des加密。
现在就可以提交请求了,到后台处理方法:
将参数id=1&name=Tobey Black&sex=baby进行遍历,按照order中参数名的顺序取出参数值,并对filter中出现的参数名的参数值进行特殊字符过滤,拼接成"1TobeyBlackbaby",对其md5加密,得到值跟sign对比,正确才向下执行,否则拦截请求。