XSS篇——javascript:伪协议
⼀、前⾔
今天,遇到⼀个别⼈挖的坑,问题是这样的。
做了⼀个列表页,可以筛选数据,有很多筛条件。主要是有input复选框和<a>标签两种。如图:
其中房价的筛选条件使⽤<a>标签,代码如下
1 <a href="javascript:;" name="price">150元-300元</a>
⽤javascript:; 来阻⽌了a标签跳转链接。
但是,却发现在IE下⾯点击a标签,居然清除了其他input复选框的筛选项,what?
第⼀次碰到这种情况,然后我仔细研究了⼀番,发现是伪协议搞的⿁。那么我们⼀起看看这到底是怎么回事。
⼆、什么是伪协议
⽽是为关联应⽤程序⽽使⽤的.如:tencent://(关联QQ),data:(⽤base64编码来在浏览器端输出⼆进制⽂件),还有就是javascript:
我们可以在浏览地址栏⾥输⼊"javascript:alert('JS!');",点转到后会发现,实际上是把javascript:后⾯的代码当JavaScript来执⾏,并将结果值返回给当前页⾯。
href标签怎么用三、深⼊代码问题
想了半天实在想不出所以然,然后我返回页⾯看这个<a>标签, 难道是javascript:;这个写法有问题?
于是我改成了我常⽤javascript:vioid(0);写法,但是问题依然没有解决。真是奇怪。。。
⼼烦意乱,然后打算先跳出这个问题,看了⼀看javascript:void(0);和javascript:;的区别:
其实两种都是javascript:URL 的形式,在浏览器打开javascript:URL的时候,它会先运⾏URL中的代码,当返回值不为undefined的时候,前页链接会替换为这段代码的返回值。
javascript:void(0), 我们知道void运算符会对给定的表达式进⾏求值,然后直接返回 ,javascript:; 也是返回 undefined,所以两种⽅法是等价的。
回到问题本⾝,想想好奇怪,为什么点击<a>标签会取消其他input复选框的选中呢?
因为是维护别⼈的代码,所以突然想到,会不会是有代码执⾏了这个操作,于是我搜索了⼀下代码,看哪⾥执⾏了取消input复选框的选中操作。
很快,我就定位到了页⾯中onbeforeunload函数中执⾏了取消input复选框选中的操作,估计写这段代码的同学,是想要在页⾯销毁之前取消input的选中,
避免浏览器前进后退复选框仍选中,造成数据不符的问题。
到了这⼀步,问题清晰了⼀点,那么只需要测试,是否在IE下,点击这种写有javascript:;的a标签会触发onbeforeunload。
于是我打开浏览器做了测试,果真在ie9及其以下的浏览器触发了这个事件。
虽然之前就知道IE中a标签事件调⽤顺序:onclick-&beforeunload->href ,但是通常页⾯中很少会使⽤onbeforeunload⽅法,很多时候是忽略的。
最后说⼀下我的解决办法,
在<a>标签绑定的click事件中,使⽤event.preventDefault();取消它的默认⾏为,页⾯可以正常运⾏了。
不知道⼤家有没有其他更好的⽅法,有的话,还希望⼤家在留⾔中告诉我,多多交流。
四、聊聊a标签使⽤伪协议
问题终于解决了,让我们放松⼼情,聊聊<a> 标签使⽤javascript:伪协议吧。通常我们为<a>标签增加href属性,⼀般有两个⽬的:
1. 跳转到指定的页⾯,也就是:link选择器可以选择到它。
2. 有href属性的<a>标签才有cursor:pointer的效果,特别实在低版本浏览器⾥⾯。
下⾯我们主要是聊聊不想要<a>标签跳转到实际页⾯的⼏种⽅法。
1. <a href="#"></a>
2. <a href="#none"></a>
3. <a href="###"></a>
4. <a href="javascript:"></a>
5. <a href="javascript:;"></a>
6. <a href="javascript:void(0)"></a>
7. <a href="javascript :void(0);"></a>
第1种,点击这个链接后,会让页⾯跳到页⾯顶部,在location.href后⾯增加#号。
第2种,点击这个链接后, 如果页⾯⾥⾯有id为none的元素,会执⾏锚点机制跳转到这个元素上缘。
第3种,不跳转,可以阻⽌默认的跳转⾏为,但是这个在后端代码中容易识别成注释,后⾯的代码不显⽰,之前遇到过这种坑,之后再没⽤过。
为什么我要列出4和6呢,有时候有些同学会忘记写分号,这样在IE6下⾯点击a标签,会造成页⾯中的gif暂停。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论