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

Javascript: Best way to handle user-generated script

本文关键字:脚本 最佳 方式 处理 用户 Javascript      更新时间:2023-09-26

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

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

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

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

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

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

总结

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

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

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

也许像

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

然后只需使用循环、处理程序数组、switch...case级联或类似内容来解析它。

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


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