Javascript eval 限制

5

javascript的eval函数是否有类似length的限制?

我正在尝试构建一个应用程序,在其中可以将JS代码存储在数据库中,稍后可以加载并评估以执行它,但我已经达到了某种限制。 首先,代码必须全部在一行中。任何多行语句都不会被执行。 接下来,我到达了长度限制(我猜测)。如果我手动执行代码,它就会工作,但将相同的代码放入数据库中,通过ajax加载并尝试执行它,它会失败。

有什么想法吗?


2
请不要这样做,将其存储在数据库中是可以的,但为什么必须使用eval - Nick Craver
1
这听起来像是数据库要么截断了你的代码,要么存在字符编码问题。你尝试过将一个有效的手动值与一个不同的“相同”的数据库值进行比较吗? - Robusto
1
@Nick:我正在控制代码的输入,所以它是完全安全的。否则,我考虑让db js代码由一个单独的文件输出,然后只需将该文件作为js脚本包含即可。这比eval更有效率,对吧? - R0b0tn1k
3
“eval()”存在安全和性能方面的问题。将其作为另一个脚本包含,例如“src="myScript.php?ID=50"”,是更好的解决方案。使用jQuery,可以调用$.getScript()来执行任何类似此格式的URL,或者只需包含一个脚本标签即可。 - Nick Craver
1
我有一个类似的问题:我在客户端运行时将用户输入的公式插入应用程序值中。然后对这些公式进行eval计算。这些公式非常庞大,因此我想知道是否存在长度限制。这是一个合理的问题。 - Pieter Breed
显示剩余3条评论
3个回答

2
我也遇到过这个问题。正如其他人在这里所说的那样,当您动态生成Javascript并希望它在浏览器上执行时,eval非常有用。我使用这种技术来做一些小事情,例如一个简单的函数,当按下按钮时,只会回调服务器。根据情况可能会有两个函数或仅一个函数。我还将其用于显示从数据库更改的信息。该信息始终只是纯文本。因此,不会发生任何注入攻击。
无论如何,我也遇到了Javascript EVAL语句的这个限制,似乎有1024个字符的限制。当我超过这个限制时,评估开始出现一些奇怪的东西,比如评估只是吐出原始文本。这真的很明显,因为我在发送到浏览器之前对所有内容进行十六进制编码,这样我就可以在文本中拥有单引号和双引号而不会导致eval出现任何问题。 (对所有内容进行十六进制编码还有助于防止注入攻击。)
我还赞同那个说要在jQuery中使用getscript的人。它的效果与eval一样好,但没有大小限制。您需要采取的唯一额外步骤是首先创建Javascript文件。
我希望这有助于回答原帖的问题。我相信大小限制为1024字节。

2
您不需要使用eval,而且使用它并不是一个好习惯。您可以将其打印到页面上,它也会运行。 这里是有关为什么不应该使用eval的被接受答案的链接:
  1. 不正确地使用eval会使您的代码容易受到注入攻击
  2. 调试可能更具挑战性(没有行号等)
  3. eval的代码执行速度较慢(无法编译/缓存eval的代码的机会)

2
你说的是对的,但并不是针对问题所述的答案。 - Pieter Breed

1
你可以创建一个JavaScript函数,动态地创建一个脚本标签(createElement('script')),并将其附加到head或body标记上,并将源指向你的应用程序。src可以包含参数,就像get请求一样使用,例如:src="jsapp.aspx?script=myscript&includefunction=loadfn" 不需要eval。你甚至可以为新的脚本标签定义一个onload处理程序。网络上有很多关于这方面的文档。
你甚至不必使用XHR(也称为Ajax)来完成这个任务。

2
你说的是对的,但并不是针对问题所述的答案。 - Pieter Breed
1
那么呢?假设我按照问题的精神回答了。 - KooiInc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接