【发布时间】:2011-12-14 02:50:13
【问题描述】:
我正在尝试在服务器端使用 javascript 代码将 JSON 输入解析为对象。因为在经典 asp 中没有原生支持 JSON 反序列化,所以我尝试使用 Douglas Crockford 的 javascript 库 https://github.com/douglascrockford/JSON-js/blob/master/json2.js 作为服务器端代码。
我在 IIS Express 上使用了这个解决方案没有问题,但是当我在常规 IIS 上移动我的代码时,我遇到了这个错误:
Microsoft JScript compilation error '800a03ea'
Syntax error
而这条线是罪魁祸首j = eval('(' + text + ')');。
所以我开始用类似的东西来愚弄它:
text = '(' + text + ')';
j = eval(text);
但与 eval 一致总是会导致错误。在没有成功后,我尝试简化代码以消除任何可能的干扰,并得出这个仍然会导致错误的简单代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>test</title>
<script type="text/jscript" language="jscript" runat="server">
function Test(text) {
eval('(' + text + ')');
}
</script>
</head>
<body>
<p><% Test("Test") %></p>
</body>
</html>
我的问题是,有没有人知道是什么导致常规 IIS 不喜欢这种使用 eval?
【问题讨论】:
-
eval 是邪恶的。尽量少用。
-
@bitsMix,一般来说是的,但这里是 Dough 为清理 eval 表达式所做的源代码:首先我们将 JSON 反斜杠对替换为“@”(非 JSON特点)。其次,我们用 ']' 字符替换所有简单的值标记。第三,我们删除冒号或逗号后面或文本开头的所有开括号。最后,我们看看剩下的字符只是空格或']'或','或':'或'{'或'}'。如果是这样,那么文本对于 eval 是安全的。
-
@stivlo - 当您查看最后一个代码时,您会发现使用特定输入很简单(但有问题)。完整的代码已收到有效的 JSON,正如我所说,它可以在 IIS Express 上运行。
-
text的内容是什么?为什么要加括号?结果根本不是有效的格式。 -
@ShadowWizard:括号来自
json2.js中的原始代码。源评论说:'{'(这是一个花括号)操作符在 JavaScript 中存在语法歧义:它可以开始一个块或一个对象字面量。我们将文本用括号括起来以消除歧义。
标签: asp-classic eval serverside-javascript