之前发现了个漏洞 【原创】0day 搜狗输入法漏洞获取系统权限 ,提交给搜狗官方了。 之后给安全经理描述了下漏洞的过程,重现后,搜狐说有小礼品送。 哈哈… 第一次知道原来发现bug,是有奖励的。

今天收到寄来的小狐狸了,上图

 

jQuery1.4 .change() 事件在IE下的bug?

On 2010年01月19日, in Javascript, by Kane

今天在项目里面,尝试使用 jQuery1.4 。 换了之后,感觉整个页面的交互是轻了,但是随之而来的是bug。 跟踪了一下,原来是 .change() 在IE下有一个这样的问题。 不知道是否jQuery 的bug了。代码如下:

<select name="" id="test">
	<option value="1">1</option>
	<option value="2" selected="selected">2</option>
	<option value="3">3</option>
</select>

<select name="" id="test2">
	<option value="1">1</option>
	<option value="2">2</option>
	<option value="3">3</option>
</select>

<script type="text/javascript">
	$(function(){
			$("#test,#test2").change(function(){
				alert($(this).val());
			})
	})
</script>

#test 下拉菜单默认绑定了2,在FF中是fire change 是鼠标点击option后,而在IE下是鼠标点了select就直接fire了。 郁闷…

Tagged with:  

几多

前尘未舍得消散
能让我拣 我也甘心折返
心爱若要归还 早知那段时间
就赶快望你多几眼
遗憾有几多 放不低有几多
未讲的有几多 才后悔当初
这种结果 够令我质疑自己怎出错
怀疑我 痛快后会更坎坷
前事再观摩 推翻不了因果
唤醒不了烟火 其实早清楚
记忆遗祸 要是这煎熬躲都躲不过
泪流过 抹去后要更清楚 怎么去做我
就遗下一堆感叹
人物布景 永远不可再摊
想再会也艰难 分手最后晚餐
被逼放下你 我未惯
遗憾有几多 放不低有几多
未讲的有几多 才后悔当初
这种结果 够令我质疑自己怎出错
怀疑我 痛快后会更坎坷
前事再观摩 推翻不了因果
唤醒不了烟火 其实早清楚
记忆遗祸 要是这煎熬躲都躲不过
就回去 靠昨日那些苦果 成就今日我

 

终于从PJblog转到Wordpress了

On 2010年01月16日, in My Life, by Kane

谋了wordpress好耐了… 一直没时间搞!用咗3年PJblog 终于可以舍弃了,舜仔太耐没怎么去更新过PJblog。估计时间都花去Qzone了哈哈..

换wordpress 换了一个晚上…本地半个钟就搞好晒.. 上传到服务器来,不是mysql版本太低,就是换服务器,这样那样的。 搞完都成1点了。

google就快走了. 真的要开始研究买VPN 路由器放去HK了。如果唔系以后连code.google.com都上唔到。

 

无意发现了一个很严重的漏洞,和当年3389 输入法漏洞相似。 不过暂时不影响未系统未加载搜狗输入法(未登录系统)。如果远程服务器装了 搜狗,登录系统后加载了搜狗,而又未及时注销或kill掉搜狗输入法直接关闭了远程连接,那么这些server 就很危险咯。

 

测试环境:

OS: windows 7 ultimate

搜狗输入法 4.3 正式版

 

漏洞过程描述:

当windows加载了搜狗输入法后(登录系统后),锁定计算机(cltr+alt+del)。切换为搜狗输入法,输入拼音字母出现搜狗输入法工具条后,点击搜索,会调用 iexplorer.exe 。接下来就可以直接在IE地址栏调用system32目录并运行cmd,如果登录账号为administrators 组。则直接获取本机系统权限。

 

 

Tagged with:  

SSH Secure Shell 使用密钥的方法

On 2010年01月7日, in Security, by Kane

1. 先在global setting的认证 Key 里面创建自己的key

2. 登陆之后,上传key。 其中要将第二项要修改为 .ssh 。

3. 接着要做一些手工的操作,在命令行界面里,输入如下命令: (左脚注意前面的$符号不是命令,只是个提示符)

$ cd .ssh/
$ ls -l
会至少看到你刚才生成的 .pub 公钥文件和一个 authorization 认证配置文件。如果没有你刚才起的名子的文件,那就有问题,检查上面的过程。

接着做下面的命令,假设我生成的是 key.pub

$ ssh-keygen -i -f   key.pub >> authorized_keys

然后,删除刚才生成的文件:

$ rm -rf    key.pub
$ rm -rf   authorization

 

基本完成,剩下就是重新创建一个连接,使用pubkey 的方式。

Tagged with:  

Aptana + zen-coding 配置篇

On 2009年12月17日, in Article, by Kane

zen-coding for aptana 的插件下载地址 http://code.google.com/p/zen-coding/downloads/list   自己找最新的版本。

 

1. 下载完后解压,在 aptana 的项目根目录,新建一个文件夹 scripts  目录。如果与项目中的目录命名冲突了,可以改用 monkey 命名。可以参考 -> aptana的原文

 

2. 将解压出来的的文件放到里面(解压后里面有个.svn的目录没清除,可以自己清除一下)。

 

3. aptana的菜单栏的 script 里面就出现zen coding ,默认的快捷键 alt+e, alt+f

 

4. 配置自己需要的快捷键,在 scripts(monkey) 目录中的每个js文件头的注释里面修改相应的快捷键。aptana的默认快捷键用的是 M1 M2 M3 + key 来配置的,意思为

  • M1 (Command or Ctrl)
  • M2 (Shift)
  • M3 (Option or Alt)
  • M4 (Ctrl on Mac)

可以参考 -> aptana原文

 

5. 如果项目使用了svn 和 ftp,而不想将次目录同步到svn 和ftp 可以将整个目录屏蔽。因为这些文件对与网站来说是无用的。

 

6. 自定义想要的缩写方式和代码片段。找到 zen_setting.js  里面是 json格式的一些 缩写对应表,和片段对应表。自己根据个人喜爱修改。

 

Tagged with:  

Aptana + zen-coding 无敌中…

On 2009年12月16日, in Article, by Kane

晚上逛了blueidea 看了  Zen Coding:快速编写HTML/CSS代码  http://www.blueidea.com/tech/web/2009/7272.asp  这篇文章。 发现 zen Coding 非常强大..

视频时Mac 的机器的,开始一想没戏了… 没往下看。点进了他的官网 http://code.google.com/p/zen-coding/

,发现完美支持 Aptana。 狂喜中…  哈哈

 

于是马上下了 zen Coding 配到 aptana 上用,真的太爽了。 编写代码的速度可以 30% 了。 哈哈..  后面又试了下 Ultraedit+ zen coding,也很强大了。。

这下有得折腾一回了。 哈哈…

 

 

Tagged with:  

2组 json diff 对比

On 2009年12月2日, in Javascript, by Kane


/**
*@jsonDataHandler.diff(json1,json2)
*/

Array.prototype.compareTo = function(compareAry) {
if (this.length === compareAry.length) {
var i;
for (i = 0; i < compareAry.length; i+=1) {
if (Object.isArray(this[i]) === true) {
if (this[i].compareTo(compareAry[i]) === false) {
return false;
}
continue;
}
else if (this[i] !== compareAry[i]) {
return false;
}
}
return true;
}
return false;
};

(function() {
var _toString = Object.prototype.toString;
function extend(destination, source) {
for (var property in source)
destination[property] = source[property];
return destination;
}
function keys(object) {
var results = [];
for (var property in object)
results.push(property);
return results;
}
function isArray(object) {
return _toString.call(object) == "[object Array]";
}
extend(Object, {
extend:        extend,
keys:          keys,
isArray:       isArray
});
})();
(function() {
var arrayProto = Array.prototype;

function indexOf(item, i) {
i || (i = 0);
var length = this.length;
if (i < 0) i = length + i;
for (; i < length; i++)
if (this[i] === item) return i;
return -1;
}

if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;

})();
var jsonDataHandler = {
merge: function(j1, j2) {
if (typeof this.merging === "undefined" || this.merging === 0) {
this.mergeCyclicCheck = [];
this.merging = 0;
}
this.merging += 1;
if (typeof j1 === "undefined") {
j1 = {};
}
if (typeof j2 === "undefined") {
j2 = {};
}
if (typeof this.mergeCyclicCheck === "undefined") {
this.mergeCyclicCheck = [];
}
var key;
for (key in j2) if (j2.hasOwnProperty(key)) {
if (typeof j1[key] === "undefined") {
j1[key] = j2[key];
}
else {
if (typeof j2[key] === "object") {
if (this.mergeCyclicCheck.indexOf(j1[key]) >= 0) {
break;
}
this.merge(j1[key], j2[key]);
this.mergeCyclicCheck.push(j1[key]);
}
else {
j1[key] = j2[key];
}
}
}
this.merging -= 1;
},
diff: function(j1, j2) {
if (typeof this.diffing === "undefined" || this.diffing === 0) {
this.diffCyclicCheck = [];
this.diffing = 0;
}
var diffRes = {};
this.diffing += 1;
if (typeof j1 === "undefined") {
j1 = {};
}
if (typeof j2 === "undefined") {
j2 = {};
}
if (typeof this.diffCyclicCheck === "undefined") {
this.diffCyclicCheck = [];
}
var key, bDiff;
for (key in j2) if (j2.hasOwnProperty(key)) {
bDiff = false;
if (typeof j1[key] === "undefined" || typeof j1[key] != typeof j2[key]) {
bDiff = true;
}
else if (j1[key] !== j2[key]) {
if (typeof j2[key] === "object") {
if (this.diffCyclicCheck.indexOf(j2[key]) >= 0) {
break;
}
else if (Object.isArray(j2[key])) {
if (j1[key].length !== j2[key].length || j1[key] !== j2[key]) {
if (j2[key].compareTo(j1[key]) === false) {
bDiff = true;
}
}
}
else if (typeof j1[key] === "object") {
var dR = this.diff(j1[key], j2[key]);
if (Object.keys(dR).length > 0) {
diffRes[key] = dR;
}
}
else {
bDiff = true;
}
this.diffCyclicCheck.push(j2[key]);
}
else if (j1[key] !== j2[key]) {
bDiff = true;
}
}
if (bDiff) {
diffRes[key] = j2[key];
}
}
for (key in j1) if (j1.hasOwnProperty(key)) {
bDiff = false;
if (typeof j2[key] === "undefined") {
diffRes[key] = j1[key];
}
}
this.diffing -= 1;
return diffRes;
}
};
Tagged with:  

2组Array diff 对比

On 2009年12月2日, in Javascript, by Kane

2组array 进行对比,取其差异部分。

 

/**
* @array_diff(new,old)
*/

function array_diff(){var arr1=arguments[0],retArr={};var k1='',i=1,k='',arr={};arr1keys:for(k1 in arr1){for(i=1;i&lt;arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]){continue arr1keys;}}

retArr[k1]=arr1[k1];}}

return retArr;}
Tagged with: