关于web安全的一些随记 XSS 、 Cookies
xss 相关问题解决过程中的一些随记
最近网站在安全检测中一直出现xss问题,查看反馈报告发现两类问题
1.jQuery版本过低导致
这个可以通过升级jQuery版本来解决:本次我的是从3.x.x 升级到3.5.0以上
但是在jQuery版本过老的情况下,不建议跨度太大的升级,否则会导致一系列的不兼容以及方法失效等问题
这样可以采用模糊jQuery版本的方法,比如更改jQuery文件名称,并修改jQuery源文件中的版本号信息
比如:1.2.0 可以改为 01.02.00 这样可以避免被检查到真实的jQuery版本
注意:在修改jQuery链接时,要把之前的地址从页面中删除,因为注释掉仍然会被检测到(在此问题上我头大了好久,大概是憨憨行为)
2.感觉像是a标签中href属性中容易被篡改插入js代码导致的问题
搜索了很多解决方案,但感觉不是很靠谱。原因是项目是一个老项目,经过很多交接过程,到我这里已经有很多问题不可预知,因此不适合改动大的处理办法。
于是在查找了一些方法后,最终还是准备尝试通过过滤href中的链接是否符合开头为 http 或 https 来尝试解决这个问题
主要方法如下:
//页面加载初始化 过滤a标签 href属性中的xss function filterXSS_tag_a_Init() { console.log('init'); let a = document.getElementsByTagName('a'); console.log(a.length); for (var i = 0; i < a.length; i++) { filterXSS_tag_a_click(a[i]); a[i].setAttribute('onclick', 'filterXSS_tag_a_click(this)'); } } //在a标签点击时 过滤a标签 href属性中的xss function filterXSS_tag_a_click(obj) { if (obj.href.indexOf('http') != 0 && obj.href.indexOf('https') != 0) { console.log('无效的链接'); obj.href = '#'; obj.innerText = '#'; } }
js中给a标签添加onclick事件:setAttribute('onclick', 'filterXSS_tag_a_click(this)');
不选择使用jQuery的原因也是因为代码过于老,引入新的东西会有可能对之前的功能造成影响
以上两个方法 一个在页面初加载时,先对页面内所有a标签先进行一次过滤,并为所有a标签添加onclick事件
另一个在标签的onclick事件中被调用,防止中间被篡改。
其实好像可以在加载时只为a标签添加onclick,并在点击时进行过滤就ok了。
说明:
emmm.... 第2个问题好像是由于无输入限制,也就是页面可以响应直接输入的js代码等导致,最后并不是通过上面的js代码解决的
而是通过修改webconfig文件的 validateRequest 属性解决的
具体可参考下面微软官方链接
3.cookie的安全问题
解决这个问题的时候尝试了很多方法 最后感觉都像在碰运气了
最后的解决办法是修改了web.config文件,涉及到的内容如下:
第一部分:(原本就有,但仍然报安全问题)
<system.web> <httpCookies httpOnlyCookies="true" requireSSL="true" /> </system.web>
第二部分:(追加了这部分之后才ok)
<system.webServer> <rewrite> <outboundRules> <rule name="Use only secure cookies" preCondition="Unsecured cookie"> <match serverVariable="RESPONSE_SET_COOKIE" pattern=".*" negate="false" /> <action type="Rewrite" value="{R:0}; secure" /> </rule> <rule name="Add HttpOnly" preCondition="No HttpOnly"> <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" /> <action type="Rewrite" value="{R:0}; HttpOnly" /> <conditions> </conditions> </rule> <preConditions> <preCondition name="Unsecured cookie"> <add input="{RESPONSE_SET_COOKIE}" pattern="." /> <add input="{RESPONSE_SET_COOKIE}" pattern="; secure" negate="true" /> </preCondition> <preCondition name="No HttpOnly"> <add input="{RESPONSE_Set_Cookie}" pattern="." /> <add input="{RESPONSE_Set_Cookie}" pattern="; HttpOnly" negate="true" /> </preCondition> </preConditions> </outboundRules> </rewrite> </system.webServer>
----------------------------------------------------------------------------分割线------------------------------------------------------------------------------------
微软官方文档关于防止ASP.NET中的跨站点脚本攻击:
https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649310(v=pandp.10)?redirectedfrom=MSDN
关于xss(留存):
https://www.cnblogs.com/digdeep/p/4679832.html
关于Cookies(留存):
https://wiki.owasp.org/index.php/Testing_for_cookies_attributes_(OTG-SESS-002)
https://www.itnota.com/enable-secure-httponly-cookies-iis/