首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在提交/拒绝访问全局变量之前检查JavaScript

在提交/拒绝访问全局变量之前检查JavaScript
EN

Stack Overflow用户
提问于 2018-07-15 20:51:35
回答 1查看 89关注 0票数 0

我已经制作了一个数学公式编辑器,允许用户输入数学公式。然后,它将被转换为字符串中的JavaScript方程,并将使用eval()执行。用户还可以提交它,以便其他用户可以查看他的功能。这样做的最大问题是,可以在公式中输入JavaScript代码,然后由查看它的其他用户的浏览器执行。不幸的是,我不能简单地避开公式,因为我正在将Sinus之类的东西转换为Math.sin()函数。我对如何防止用户将JavaScript代码放入数学公式中的任何建议持开放态度,以下是我的想法:

  1. 以某种方式检查了代码。问题是,正如我所说的,我不能仅仅扫描任何JavaScript函数,因为我使用的是Math.sin()Math.log()之类的东西。所以我想允许Math对象的任何方法,也允许使用标准运算符的普通数学运算。这样做的另一个问题是JavaScript可能会被禁用和修改,这可能是一个安全问题。因此,如果我可以在“安全环境”中使用PHP.
  2. Execute公式进行扫描,那就太好了。现在我不知道这在JavaScript中是否可行,但我基本上是在寻找这样的东西:正在执行的函数不能访问或修改任何函数( Math对象的任何方法除外),并且不能更改任何全局变量,包括document变量。我不知道这是否可能,但也许有人知道些什么。

谢谢你的帮助,莫里茨

更新:我找到了一种方法。我做了一个函数,它用一个局部变量来遮蔽所有的全局变量和函数。这是函数:

function safeEval(string,banned) {
    for(var i=0;i<banned.length;i++) {
        eval('var '+banned[i]);
    }
    return eval(string);
}

其中banned是将被屏蔽的字符串数组。要阻止所有全局变量,您可以这样调用它:

safeEval('document.write("test")',Object.keys(window))

这将抛出一个错误,这正是我想要的。Object.keys(window)将返回一个包含所有全局变量(和函数)的数组,包括safeEval

另一个更新:正如Rainer Plumer指出的那样,这是不安全的,因为你可以按如下方式使用thissafeEval('this.document.write("test")',Object.keys(window))

希望我能帮上忙。莫里茨

EN

回答 1

Stack Overflow用户

发布于 2018-07-16 00:38:14

“安全环境”是一个好主意,它可以通过Iframe来实现。

根据你的描述,你需要一个“安全的环境”来运行JavaScript方程,我认为Iframe非常适合这样做。这个过程运行一个可以在Iframe中完成的JavaScript等式,而且它是安全的,因为页面和Iframe是独立的document

然后,您可以使用postMessage或其他工具从Iframe中获取结果,并将其显示给用户。你必须在Iframe中使用另一个域名,以确保没有人能让用户获得cookie或其他重要的东西,其中一个著名的网站就是codepen.io

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51348568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档