解决跨站脚本注入,跨站伪造用户请求,sql注入等http安全漏洞

本篇文章总结于各大博客

版权声明:本文为博主原创文章,欢迎大家转载。如有错误请多多指教。 https://blog.csdn.net/u011794238/article/details/46419911
跨站脚本就是在url上带上恶意的js关键字然后脚本注入了,跨站伪造用户请求就是没有经过登陆,用超链接或者直接url上敲地址进入系统,类似于sql注入这些都是安全漏洞。

sql注入
1、参数化查询预处理,如java使用PreparedStatement()处理变量。
2、转义敏感字符及字符串(SQL的敏感字符包括“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”><=!-*/()|”,和”空格”)。
3、屏蔽出错信息:阻止攻击者知道攻击的结果。
4、在服务端正式处理之前对提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)进行检查等,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作。

跨站脚本
一般性建议:转义或过滤客户端提交的危险字符,客户端提交方式包含GET、POST、COOKIE、User-Agent、Referer、Accept-Language等,其中危险字符如下:
建议转义或过滤以下字符:
[1] |(竖线符号)
[2] & (& 符号)
[3];(分号)
[4] $(美元符号)
[5] %(百分比符号)
[6] @(at 符号)
[7] '(单引号)
[8] ""(引号)
[9] \'(反斜杠转义单引号)
[10] \""(反斜杠转义引号)
[11] <>(尖括号)
[12] ()(括号)
[13] +(加号)
[14] CR(回车符,ASCII 0x0d)
[15] LF(换行,ASCII 0x0a)
[16] ,(逗号)
[17] \(反斜杠)
[18]  (空格)
[19] . (点号)
过滤以下关键字、标签:alert、img、script、document、document.title、document.write、eval、prompt、onclick、onerror、onmouseenter、onreadystatechange、confirm、javascript、String.fromCharCode、onload、DYNSRC、LOWSRC、behavior、vbscript、msgbox、mocha、livescript、expression。


开发语言的建议:
[1]严格控制输入:
    Asp:request
    Aspx:Request.QueryString、Form、Cookies、SeverVaiables等
    Php:$_GET、$_POST、$_COOKIE、$_SERVER、$_GlOBAL、$_REQUEST等
    Jsp:request.getParameter、request.getCookies 等
    客户端提交的变量一般从以上函数获得,严格限制提交的数据长度、类型、字符集。

[2]严格控制输出:
    HtmlEncode:对一段指定的字符串应用HTML编码。
    UrlEncode:对一段指定的字符串URL编码。
    XmlEncode:将在XML中使用的输入字符串编码。
    XmlAttributeEncode:将在XML属性中使用的输入字符串编码 
    escape:函数可对字符串进行编码
    decodeURIComponent:返回统一资源标识符的一个已编码组件的非编码形式。
    encodeURI:将文本字符串编码为一个有效的统一资源标识符 (URI)。" "get型xss:


跨站请求伪造
方案一、存在漏洞的页面加验证码或手机短信验证 
方案二、检测HTTP请求中的访问来源是否可信,对http头中的referer进行过滤,只允许本域站点 
方案三、一次性令牌Token 
添加一个参数Token,其值是随机的。这样攻击者因为不知道Token而无法构造出合法的请求进行攻击。实现方法:首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,否则拒绝请求或者要求用户重新登陆验证身份。 
Token 使用原则: 
Token要足够随机————只有这样才算不可预测 
Token是一次性的,即每次请求成功后要更新Token————这样可以增加攻击难度,增加预测难度 
Token要注意保密性————敏感操作使用post,防止Token出现在URL中 
方案四、临时cookie:对会话进行时效限制,将持久化的授权方法(例如cookie或者HTTP授权)切换为短时或瞬时的授权方法 
方案五、session标记随机生成;确认已有的session标记无法被二次使用 
方案六、过滤用户输入,例如论坛、博客等,不允许发布含有站内操作URL的链接(作用有限,因为可以通过qq、第三方网站进行发布,图片形式会自动加载等) 
方案七、根据不可预测性原则,我们可以对参数进行加密从而防止CSRF攻击。"
已解密的登录请求 对诸如用户名、密码和信用卡号之类的敏感输入字段进行加密传递
会话定置 "COOKIE中的登陆前JSESSIONID与登陆后JESSIONID不能相同
例如在登录页面上加上一段代码:

request.getSession().invalidate() ; //清空session
if (request.getCookies()!=null) {
Cookie cookie = request.getCookies()[0]; // 获取cookie
cookie.setMaxAge(0); // 让cookie过期
}"

扫描二维码关注公众号,回复: 5473550 查看本文章

文件上传
[1]严格判断上传文件的类型,设置上传文件白名单,只允许上传指定类型的文件。
[2]禁止在上传目录下执行脚本。
[3]上传文件的目录必须是http请求无法直接访问到的。如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置该目录为不解析jsp等脚本语言的目录。
[4]上传文件要保存的文件名和目录名由系统根据时间生成,不允许用户自定义。
[5]图片上传,要通过处理(缩略图、水印等),无异常后才能保存到服务器。"

jQuery跨站脚本
"升级Jquery到1.7版本以上,或在js中修改如下行,quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/
修改为:quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/"

启用了不安全的HTTP方法
---------------------
作者:LinkinPark8林肯
来源:CSDN
原文:https://blog.csdn.net/u011794238/article/details/46419911
版权声明:本文为博主原创文章,转载请附上博文链接!

目前我知道的,存储型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对比,正确才向下执行,否则拦截请求。
---------------------
作者:aliveClass
来源:CSDN
原文:https://blog.csdn.net/aya19880214/article/details/45893641
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/chenliuxiao/p/10500434.html