标签归档:javascript

javascript立即调用的函数表达式

jquery中最外围的一个方法即立即调用的函数表达式,代码如下:

(function(e,t){
//jquery code
})(window)

代码一
这个方法开始接触时是一头雾水,这段代码其实等价于:

var fn = function(e,t){
//jquery code
}
fn(window);

代码二
看到第二段代码便恍然大悟,其实代码一是因为第一对圆括的优先级最高关系,导致function(e,t){}先运行,即先声明了一个匿名函数,之后又碰到后面的一对圆括号:(window),使得之前声明的匿名函数得到立即执行。
除此之外,还有很多其他的匿名行数写法,通过使用一元或二元运算符来引导解析器,指明运算符附近是一个表达式。
如:

( function() {}() );
[ function() {}() ];
~ function() {}();
! function() {}();
+ function() {}();
- function() {}();

delete function() {}();
typeof function() {}();
void function() {}();
new function() {}();
new function() {};

var f = function() {}();

1, function() {}();
1 ^ function() {}();
1 > function() {}();
// ...

Web Worker笔记

由于javascript是单线程,为了模拟多线程,通常是利用setTimeOut,setInterval,ajax的XMLHttpRequest。HTML5出现后,我们可以通过Worker实现js的多线程。

代码:
main.html:

<html>
 <head>
  <script type="text/javascript" src='test.js'></script>
  <script type="text/javascript">
	var worker = new Worker('test.js');
	worker.addEventListener('message',function(e){
		console.log('worker return :',e.data);
	},false);
	worker.postMessage('1');
	worker.postMessage('2');
	testFn();
	worker.postMessage('1');
  </script>
 </head>
</html>

test.js:

self.addEventListener('message',function(e){
	switch (e.data)
	{
	case "1":
		self.postMessage(e.data+": var a="+self.a);
		self.a = "worker var a: 1";
	break;
	case "2":
		self.postMessage(e.data+": var a="+self.a);
		self.a = "worker var a: 2";
		break;
	}

},false);
function testFn(){
	console.log("this is worker.js function");
	self.a="worker var a : function";
}

ps:页面不能直接打开运行,需要放在web服务器上,否则报安全错误:Uncaught Error: SECURITY_ERR: DOM Exception 18
运行结果:

this is worker.js function test.js:16
worker return : 1: var a=undefined main.html:8
worker return : 2: var a=worker var a: 1 main.html:8
worker return : 1: var a=worker var a: 2

可以看到:
1,testFn后调用反而先运行了。
2,testFn将a赋值为”worker var a : function”,虽然先运行了,但是后面打印的结果均无此结果,

总结:postMessage是异步调用,worker对象的window与js的window并非共享的

ps:Worker传递的对象是通过复制传递的,并非共享的

参考:
Web Workers 的基本信息

Reflected XSS All Clients漏洞

XSS的全称是Cross Site Scripting,跨站脚本

这第一个单词是Cross,为什么缩写成X呢?因为CSS是层叠样式表的缩写(Cascading Style Sheets)的缩写,同时Cross发音和X相似,为了避免混淆用X来代替,缩写成XSS。

XSS的原理就是往HTML中注入脚本.

三种方式:

1,直接注入

<script>

//code

</script>

2,通过img,a等支持的src属性的标签注入:

 

<img src="javascript://code"/>

3,通过dom的事件注入:

 

<img src="errorsrc" onerror="//code"/>

转码注入:

 

1,HTML编码可以用&#ASCII方式来写,这种XSS转码支持10进制和16进制,SQL注入转码是将16进制字符串赋给一个变量,而XSS转码则是针对属性所赋的值

<img src="javascript:alert('xss')"/>

转义后:

 

<img src="&amp;#106&amp;#97&amp;#118&amp;#97&amp;#115&amp;#99&amp;#114&amp;#105&amp;#112&amp;#116&amp;#58&amp;#97&amp;#108&amp;#101&amp;#114&amp;#116&amp;#40&amp;#39&amp;#104&amp;#101&amp;#108&amp;#108&amp;#111&amp;#32&amp;#119&amp;#111&amp;#114&amp;#100&amp;#39&amp;#41"/>

这个&#分隔符还可以继续加0变成“&#0106” ,“&#00106” ,“&#000106” ,“&#0000106”等形式。

 

2,我们的JavaScript中的”\”字符是转义字符,所以可以使用”\”连接16进制字符串运行代码,样式表也支持分析和解释”\”连接的16进制字符串形式,浏览器能正常解释:


<style>
BODY { background: url("javascript:alert('xss'))") }
</style>

转移后:

 


<style>
BODY { background: \75\72\6c\28\68\74\74\70\3a\2f\2f\31\32\37\2e\30\2e\30\2e\31\2f\78\73\73\2e\67\69\66\29 }
</style>

参考:浅析XSS(Cross Site Script)漏洞原理