Javascript:处理用户生成脚本的最佳方式

时间:2012-06-01 20:56:52

标签: javascript security eval user-input

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

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

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

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

另一个问题是如何将他们的模板提供给页面以供他人欣赏。正如我所说,没有服务器端的交互,我想保持这种方式。我不想创建MySQL表等来存储他们的模板。不幸的是,这意味着我能想到的唯一可行的方法是将他们的模板放在URL的查询字符串中。令人讨厌,那。这确实对字符长度施加了限制 - 如果我读得正确的话,只需要2000与旧的IE兼容。 (我还想过生成一个HTML文件的文本,他们可以复制n粘贴,保存,托管在某处,然后将地址发送到我的页面,然后加载到iFrame中......哈是的。不是用户友好的 - 既包括保存为他们可能从未像以前那样保存的文件类型,也包括如何托管文件 - 并产生更大的安全问题。)

第三个问题是,一旦页面从它们接收到模板,使其安全并将其转换为脚本,我该如何执行该脚本?我听说自从我第一次启动Javascript以来eval是邪恶的,所以我避免使用它。显然做new Function(txt)同样是邪恶的(虽然我之前做了很多次)。我愿意接受这些邪恶的说法.....但有什么替代方案?我在谷歌搜索了那个,我能找到的最接近我的情况是this StackOverflow question, involving remote code。接受的答案建议动态创建脚本标记,并将textContent设置为脚本字符串。这对我来说也是最好的解决方案吗?

摘要

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

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

1 个答案:

答案 0 :(得分:3)

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

也许像

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

然后用循环,处理程序数组,switch...case级联或类似方法解析它。

压缩了一下,这可能适合一个非常详细的模板,不到2000个字符。


jsfiddle通过在不同域名的iframe中提供安全运行不受信任的代码,因此,如果这是一个选项并且真的想要评估一些不受信任的代码,那就这样做吧。如果你坚持防止“伤害经历”,你仍然会最终做出声明性陈述(或试图完全消毒它,直到你意识到你不能)。