限制用户可以输入的javascript

时间:2015-12-17 18:38:56

标签: javascript angularjs node.js mean-stack

我想允许用户将自己的数学公式输入到我可以通过javascript运行的字段中,但我只希望他们输入数学相关的代码,并让他们只能访问Math对象。

所以我只希望用户能够输入数学符号(+, - ,*,%等)并使用Math对象中的任何函数。

我最初考虑在客户端和服务器上使用正则表达式来验证它们只是输入我允许的内容,并且由于它们在进入服务器之前无法运行该代码,我想也许可以,但我仍然不知道正则表达式本身是否会为此工作。

如何安全地允许和信任这样的用户输入?

编辑:公式将始终在客户端上运行,但我会将它们作为字符串存储在数据库中,我可以在它们运行时发送给它们。

2 个答案:

答案 0 :(得分:1)

所以一些评论让我找到了MathJs,通过阅读该网站上的一些文档和评论,我发现允许用户输入是安全的,并且还允许使用Math对象。

将此与workerpool相结合以限制执行时间,我认为应该拥有我需要的一切。

感谢那些帮助我指明正确方向的人!

答案 1 :(得分:0)

如果您可以保证文本不会在服务器上执行,那么从概念上讲,您可以尝试下面的evalFormula

<html>
  <head>
    <script type="text/javascript">

    function evalFormula(str) {

      // shielding 
      var window = null;  
      var document = null;

      // shortcuts
      var abs = Math.abs;

      return eval(str); 
    }

    console.log( evalFormula("abs(-42)") );    
    console.log( evalFormula("document.write('')") ); // throws error

    </script>
  </head>
<body>
</body>
</html>

请注意,该函数包含// shielding部分,其中包含&#34; caps&#34;为了所有人&#34;危险&#34;公式背景下应禁止的物品。 注意:该集很难完全定义,但原则上可能。

该函数的本地范围可能包含数学函数的快捷方式,因此它们可以用作abs(-42)但不能用作Math.abs(-42)

上面代码的想法:在JS eval()中,在当前函数的上下文中执行。所以它的所有局部变量都可用于被评估的文本。