【问题标题】:Which keywords should I filter in eval()? [closed]我应该在 eval() 中过滤哪些关键字? [关闭]
【发布时间】:2012-09-23 20:12:19
【问题描述】:

我需要将 eval() 用于我正在构建的基于 JavaScript 的 Web 应用程序。

这样做的原因是我想让人们编写自己的函数,这些函数可以存储为文本,并且可以在需要下次使用时在网站上重复使用。按照 jsFiddle 的思路思考。

代码将被运行和评估,或者将作为脚本标签插入。无论哪种方式,它都会使网站对恶意用户的 JavaScript 注入开放。因此,我打算过滤提交的代码,或者当用户加载另一个用户的脚本时,会收到一条警告消息,提示用户在继续之前应该先阅读/检查脚本。

到目前为止,我希望过滤/警告以下关键字:

eval
execScript

script

window.*
setInterval
setTimeout
alert
confirm
prompt

document.*
write
innerHTML
insertAdjacentHTML
createElement
appendChild
setAttribute

form.*
submit

XMLHttpRequest

jQuery.*
ajax

base64encode
base64decode

我还没有开始测试,所以这些只是我的初步想法。

有人对此有经验或意见吗?

谢谢, 戴夫

【问题讨论】:

  • 我不认为 jsfiddle 使用eval
  • 过滤提交的代码是没有意义的。人们会在黑名单中找到自己的出路。如果有人在字符串文字中使用“eval”,你打算怎么做?您将如何确定哪些字符串用作输出,哪些用于绕过您的沙箱?
  • 这里要发生坏事了。
  • 让用户运行自定义 Javascript 是一个坏主意。过滤很容易克服。
  • @alcidesqueiroz 这如何解决任何问题?

标签: javascript security eval code-injection jsfiddle


【解决方案1】:

没有办法确保这个安全 - 字符 []()+!{} 可用于构造任意 Javascript 代码。

http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html

据我所知,jsFiddle 通过在另一个域的 iframe 中运行用户生成的代码来工作。它不使用输入过滤。

【讨论】:

  • 是的 - 我在发布后才意识到这一点。
【解决方案2】:

doing this 几乎可以解决任何过滤问题。您将不得不对 Javascript 进行沙箱处理。可能的方法包括:

【讨论】:

猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多