最近寫 asp 發現一個問題,古老的 asp 缺少對 json 資料的安全支持,物件 轉字符的方法沒有,字符轉物件 雖然可以通過 eval("(" + json + ")") 的方式實作 json 決議,但是容易被不良人當作木馬入口,你期待的可能是一個正常的 json 字串,但人家傳過來的有可能是 (function() { Response.Write("Hacked"); })() 之類的 js 執行陳述句。所以,用 js 實作了 parse 和 stringify 方法:
var JSON = { stringify: tojson, parse: fromjson };
WSH.Echo(JSON.stringify(JSON.parse(JSON.stringify({ a: "1\\2\r3\n4\"5\t6}" }))));
function fromjson(str) {
var regTag = /[\{\[\"ntf\d\.]/, i = 0, len = str.length;
function newParse() {
var s = waitStr(regTag);
if(!s) return;
switch(s) {
case "{": return findObj();
case "[": return findArr();
case "t": return findTrue();
case "f": return findFalse();
case "n": return findNull();
case '"': return findStr();
}
return findNum(s);
}
function findObj() {
var obj = new Object;
var s = waitStr(/\S/);
if(s == "}") return obj;
while(i < len) {
var key = findStr();
waitStr(/\:/);
obj[key] = newParse();
s = waitStr(/[\,\}]/);
if(s == "}") break;
waitStr(/\"/);
}
return obj;
}
function findArr() {
var arr = new Array;
var s = waitStr(/\S/);
if(s == "]") return arr;
i--;
while(i < len) {
arr.push(newParse());
s = waitStr(/[\,\]]/);
if(s == "]") break;
}
return arr;
}
function findTrue() { i += 3; return true; }
function findFalse() { i += 4; return false; }
function findNull() { i += 3; return null; }
function findStr() {
var s = "";
while(i < len) {
var _s = str.charAt(i++);
if(_s == '"' && (s.match(/\\*$/) || [""])[0].length % 2 < 1) break;
s += _s;
}
return s.replace(/(\\+)([rn\"])/g, function(rs, $1, $2) {
if($1.length % 2 < 1) return $1 + $2;
return $1.slice(0, -1) + ({ n: "\n", r: "\r", '"': '"' })[$2];
}).replace(/\\\\/g, "\\");
}
function findNum(s) {
while(i < len) {
var _s = str.charAt(i++);
if(!/[\d\.]/.test(_s)) break;
s += _s;
}
i--;
return s - 0;
}
function waitStr(reg) {
while(i < len) {
var s = str.charAt(i++);
if(reg.test(s)) return s;
}
return "";
}
return newParse();
}
function tojson(obj) {
switch(typeof obj) {
case "string": return toStr();
case "number": return toNum();
case "object": return toObj(obj);
case "boolean": return toBool();
case "date": return toTime();
case "function": return obj;
case "undefined": return '"undefined"';
default: return "unknown";
}
function toStr() { return '"' + obj.replace(/[\"\\]/g, function(str) { return "\\" + str; }).replace(/\r/g, "\\r").replace(/\n/g, "\\n") + '"'; }
function toNum() { return obj; }
function toBool() { return obj ? "true" : "false"; }
function toObj() {
if(!obj) return "null";
if(obj instanceof Array) return toArr();
var arr = new Array;
for(var x in obj) arr.push(tojson(x + "") + ":" + tojson(obj[x]));
return "{" + arr.join(",") + "}";
}
function toArr() {
var arr = new Array;
for(var i = 0; i < obj.length; i++) arr.push(tojson(obj[i]));
return "[" + arr.join(",") + "]";
}
function toTime() {
var t = new Date(obj - 0);
var str = t.getFullYear() + "-";
str += z(t.getMonth() + 1) + "-";
str += z(t.getDate()) + " ";
str += z(t.getHours()) + ":";
str += z(t.getMinutes()) + ":";
str += z(t.getSeconds());
return '"' + str + '"';
}
function z(num) { return num < 10 ? "0" + num : num; }
}由于從字符轉物件的決議有些復雜,所以沒有做格式校驗,只實作了安全決議。因此,錯誤的格式不會導致決議例外,也不會影響正常決議,正常的日常使用是沒問題的。性能方面,因為是根據 json 字串長度逐字決議,每個字符基本上只處理一次,因此,字串長度對性能的影響已經被降到了最低。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
function findStr() {
var s = "";
while(i < len) {
var _s = str.charAt(i++);
if(_s == '"' && (s.match(/\\*$/) || [""])[0].length % 2 < 1) break;
s += _s;
}
return s.replace(/(\\+)([r\/n\"])/g, function(rs, $1, $2) {
if($1.length % 2 < 1) return rs;
return $1.slice(0, -1) + ({ n: "\n", r: "\r", '"': '"', "/": "/" })[$2];
}).replace(/\\\\/g, "\\");
} 修改了 findStr 部分,解決 \/ 決議錯誤的 bug。
uj5u.com熱心網友回復:
var s = new Array, dic = { n: "\n", r: "\r", b: "\b", f: "\f", v: "\x0b" };
var dec = function(c) {
switch(c) {
case "x": i += 2; return unescape("%" + str.substr(i - 2, 2));
case "u": i += 4; return unescape("%u" + str.substr(i - 4, 4));
}
return c in dic ? dic[c] : c;
};
while(i < len) {
var _s = str.charAt(i++);
if(_s == '"') break;
if(_s == "\\") _s = dec(str.charAt(i++));
s.push(_s);
}
return s.join("");終極版 findStr,處理所有轉義符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/10671.html
標籤:ASP
上一篇:請求頁面非常非常慢
下一篇:淺析Vue中的鉤子函式及作用?
