如何将包含JavaScript的字符串转换为可用的Javascript?

时间:2014-07-24 15:11:50

标签: javascript

我想将Javascript字符串转换为实际的函数,我可以将其附加到属性并重用。

var fn = 'function say(something) { alert(something); }';
fn.say('hello');
fn.say('world');

我实际上并不想实现这个......这是纯粹的Javascript好奇心。

1 个答案:

答案 0 :(得分:0)

您想使用eval()功能。但是您在上面显示的内容不会在fn变量上创建属性。它只是创建一个您分配给fn的函数。如果要创建具有属性say的对象,请尝试改为:

var fn = eval('({ say: function (something) { alert(something); }})');

这将计算解析为包含名为say的属性的对象的表达式。此属性值是一个可以像上面描述的那样调用的函数:

fn.say('hello');

此外,尽管eval()获得了所有瑕疵,但实际上有一些用途。

  • JSON转换
  • 在命名空间之间移动定义
  • JavaScript代码的最小化和混淆
  • 动态代码重写和注入
  • 创建元语言

就安全问题而言,eval()本身不会为您的代码添加任何明显的漏洞。除非你做了一些非常不负责任的事情(比如在用户输入上调用eval()),否则没有任何东西可以通过它的存在来引入,无论如何都不会引起关注。通常给出的论点是评估从服务器返回的内容时的安全威胁。这种威胁假设我们甚至不能信任服务器,在这种情况下我们可能会遇到更大的问题。另一个经常使用的论点是中间人攻击,有人将恶意内容注入我们的资源请求。再一次,如果发生这种情况,我们可能会有更大的担忧。如果攻击者能够将恶意内容注入服务器响应中,则无法阻止他们:

  • 返回通过< script加载的JavaScript的攻击者控制代码 SRC ="">
  • 返回攻击者控制的JSON-P请求代码。
  • 在不改变任何内容的情况下窃取cookie和用户数据
  • 返回用于网络钓鱼的攻击者控制的HTML和CSS

最重要的是,不使用eval()的安全威胁论据通常是威胁,无论您的代码是否使用eval(),这些威胁都会出现问题。尽管其他人可能会说,eval()只是工具箱中的另一个工具。不要随意使用它,或者另一段代码可能做得更好。但即使Douglas Crockford告诉你,也不要完全忽视它。

希望这有帮助!

参考文献:
Secrets of the JavaScript Ninja
eval() isn't evil, just misunderstood