前几天有人问我为什么点击链接后页面变成了一个只有“false”的页面,我猜想大概是滥用了javascript:伪协议吧。最终因为没让我看出事的代码,真正原因也就不得而知。不过我借此契机理清了此处疑惑,倒也算有所得了。
一般说来,伪协议经常被用到<a>的href属性上,例如<a href="javascript:alert('hello');">。这样,点击此链接的默认行为就是弹出一个框,而不是跳转至某页面了。此处需要注意的地方有两点:
1,返回值对浏览器行为的影响。返回undefined,停留在原页面,其它跳转至返回值。这就是为什么出现“false”页面的原因了。旧代码中能看到javascript:void(...);的写法,其实也是为了生成一个undefined的返回值,等同于在最后直接加return;。
2,this指向global变量。这不是说例子中alert里的this是global变量,而是连href属性里的this是global变量。因为此处是默认行为,不是事件,所以里面的代码的执行上下文不是触发元素。
伪协议还可以使用在form元素的action里,行为和使用在anchor上一样。至于其它地方可不可以使用,或者有没有什么其它细节之类的,我就觉得没有了解的必要了,毕竟这是一种已经不推荐使用的技术了,即混淆了结构又没有适当的fallback。
附上测试的代码,我觉得能运行的代码往往说明的能力更强。
<!DOCTYPE html>
<html>
<head>
<title>My Test Page</title>
</head>
<body>
<div>
<form id="f" action="javascript:alertThis(this, 'action');" onsubmit="alertThis(this, 'submit');">
<div><input type="submit" value="Empty form" /></div>
</form>
<a href="javascript:alertThis(this, 'anchor');" onclick="alertThis(this, 'click');">empty anchor</a>
</div>
</body>
<script type="text/javascript">
var logger = typeof(console) === 'object' ? console : {};
if (!logger.log) logger.log = alert;
function alertThis() {
logger.log("this is " + this + "\nargs[0] is " + arguments[0] + "\nargs[1] is " + arguments[1]);
}
</script>
</html>
分享到:
相关推荐
第八节 Javascript伪协议的XSS-01
[removed]这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行
1.javascript:void(0)这种伪协议,少写的好,如果你看过一些web标准的书就知道为什么了。(不懂,原话摘的,暂做记录) 2.链接(href)直接使用javascript:void(0)在IE中可能会引起一些问题,比如:造成gif动画...
主要为大家详细介绍了JavaScript动态绑定,关于JavaScript中为元素绑定的事件失效的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。...
课时9:文件包含介绍 - 伪协议zip和phar利用17'56 课时10:文件包含介绍-伪协议phpfilter利用04'54 课时11:日志文件利用07'58 课时12:日志文件利用session会话利用17'43 第4章 SSRF 课时1:SSRF介绍与简单...
” rel=”external nofollow” rel=”external nofollow” rel=”external nofollow” ,其中[removed]是伪协议,它可以让我们通过一个链接来调用javascript函数.而采用这个方式 [removed];可以实现A标签的点击事件...
脚本藏身之处不过有四:1、[removed]标签、<link>标签、<style>标签、iframe标签2、on开头的标签属性3、javascript(vbscript)伪协议4、css的epression
切页面时有时用链接A来替代按钮,这样做有几个好处 鼠标放上时默认有手状效果(不用添加cursor:pointer) 可以添加低版本IE都支持的伪类 如果点击时页面要整体刷新,即跳转,这时IE6则不尽人意,如下 代码如下: <p>...
包括一个适应性强但易于使用的协议,用于在画布上定位,显示和设置人工制品和效果动画。 添加功能以使元素具有响应性,并根据其周围环境调整其大小。 使画布既可访问又可交互-包括轻松跟踪用户与画布不同部分的交互...
第二类,注重基础,讲解了前端工程师必须掌握的数据处理、网络协议、文件操作、测试等基础性的开发技,目的是帮助前端工程师们修炼内功,打下扎实的基础。希望通过本书,不仅能帮助前端工程师们夯实基础,而且还能写...
2.5.3 javascript/vbscript伪协议 41 2.5.4 伪协议逻辑出错:某浏览器跨任意域脚本注入一例 42 2.6 本章小结 43 3 探索浏览器的导航过程 45 3.1 导航开始 45 3.1.1 浏览器的导航过程 46 3.1.2 DNS请求 46 ...
WebAssembly(通过AssemblyScript)一组加密原语,用于构建身份验证和密钥交换协议。 目前提供: / libsodium兼容的分离式 Ed25519确定性签名和非确定性签名,并带有联合验证。 Ristretto组上的确定性和非确定性...
cql-protocol是一个库,它完全在纯 JavaScript 中实现了 Apache Cassandra 的原生 CQL 协议规范 v1 和 v2(几乎)。 Apache Cassandra 驱动程序的构建块 该库旨在供驱动程序作者(包括我自己)使用,而不是供用户...
从iframe中打开文件,并检测iframe存在否如果说只是检测页面存在否,直接设置target用伪协议就可以解决了...
通常的用法为: 代码如下: 单击此处看看效果</a> 实际上...形式是一个javascript的伪协议,是表示此链接不跳转到任何的地方。 用到[removed]void(0)的情况主要形式有以下几种: 代码如下: //点击链接后不做任何事情
考虑php伪协议读取源码, 然后利用这一点,可以读取到你想获取的页面的源码例如: index.php,flag.php,login.php的源码,然后base64解密 url里?后面改成这个?file=...
这是一个玩具问题的资料库,可以使用递归和JavaScript解决。 尽管递归的概念可能并不难理解,但提高递归思维的唯一方法是实践。 如果您需要练习,那么此存储库可能适合您。 一些准则: 请不要共享解决方案。 听...