4

情况是这样的:我有一些 JavaScript 可以创建一个交互式对话(并通过动态元素创建以漫画的形式显示它......这很有趣)。该页面允许用户调整设置,改变脚本产生的对话。作为一个理论示例,其中一个复选框可以是“使用 cussing”,如果选中此框,脚本只会将 cuss 词添加到返回的字符串中。好的,很简单。乐趣。

它目前只使用一个模板(“漫画”有一个非常具体和明确的目的)来生成对话;这个模板被硬编码到 JavaScript 中。我希望用户能够创建自己的模板,然后将其转换为像硬编码版本一样执行的脚本,并且还可以通过复选框选项进行控制。编辑:为了澄清,用户不直接编写脚本。他们编写了一个表示(我现在正在考虑使用 JSON),当其他人使用模板打开页面时,该页面将把它变成一个脚本并执行它。

这带来了一些问题。最明显的是恶意用户的攻击。编辑:虽然用户不会自己编写脚本,但由于一切都是客户端,他们可以很容易地看到我的解析脚本,并且可能能够弄清楚如何插入一些东西。不过,并不是真的太担心这一点。结束编辑。我确信有一些标准的方法可以解决这个问题,并且由于目前没有交互服务器端 - 一切都是客户端 - 我主要担心的是这样的用户不能通过分享他的坏版本来伤害另一个用户的体验。现在,我只是在一开始就通过全局替换不在集合中的所有字符来剥离字符串:

str.replace(/[^a-zA-Z...]/g,'').

另一个问题是如何将他们的模板提供给页面以供其他人欣赏。正如我所说,没有服务器端交互,我想保持这种状态。我不想创建 MySQL 表等来存储它们的模板。不幸的是,这意味着我能想到的唯一可行的方法是将他们的模板放在 URL 的查询字符串中。讨厌,那个。这确实对字符长度施加了限制——如果我没看错的话,只要 2,000 就可以与旧版 IE 兼容。(我还想过生成一个 HTML 文件的文本,他们可以复制粘贴,保存为这样,托管在某个地方,并将地址发送到我的页面中的 URL,然后将其加载到 iFrame 中......哈. 是的。不是用户友好的 - 涉及保存为他们的文件类型

第三个问题是一旦页面从他们那里收到模板,使其安全,并将其转换为脚本,我应该如何执行该脚本?自从我第一次开始使用 Javascript 以来,我就听说 eval 是邪恶的,所以我避免使用它。显然做new Function(txt)同样邪恶(尽管我以前做过很多次)。我愿意接受这些邪恶的说法......但是还有什么选择?我搜索了谷歌,我能找到的最接近我的情况是这个 StackOverflow 问题,涉及远程代码。接受的答案建议动态创建一个脚本标签,其中 textContent 设置为脚本字符串。这对我来说也是最好的解决方案吗?

概括

我需要访问用户生成的文本(最好不要将其存储在服务器端),在避免攻击的同时将其解析为 Javascript,然后使用eval().

  1. 将他们的模板作为查询字符串存储在 URL 中,然后可以共享,这是将模板获取到页面的唯一方法吗?
  2. 我应该注意哪些安全漏洞,以及防范恶意用户的标准方法是什么?
  3. eval 有哪些替代方法可以执行未硬编码到脚本中、远程检索的代码?
4

1 回答 1

3

正如@pst 所说,使用模板功能(和参数)的 JSON 表示,并且只运行受信任的代码。

也许像

{
  border: { color: '#BADA55' },
  layout: { columns: 2, rows: 4 }
}

然后只需使用循环、处理程序数组、switch...case级联或类似方法对其进行解析。

稍微压缩一下,这可以容纳一个非常详细的模板,少于 2000 个字符。


jsfiddle 通过在不同域名的 iframe 中提供不受信任的代码来安全地运行不受信任的代码,因此,如果这是一个选项并且您真的想评估一些不受信任的代码,那就这样做吧。如果您坚持防止“伤害体验”,您最终仍会做出声明性表示(或尝试完美净化它,直到您意识到自己做不到)。

于 2012-06-01T21:09:37.040 回答