这是对Javascript的eval()的错误使用吗?

Way*_*ner 2 javascript security eval

我读过一些 东西关于JavaScript的eval,所以我觉得我的使用是有道理的.

我在信息安全课上,我们正在对彩票卡进行一些统计分析.然而,我们的宾果游戏卡(并且可能完全不可能成为这种特殊情况的牺牲品).但是,我们当前的过程非常严重,因此我想到将卡数据存储在我的服务器上,并允许同学在textarea中编写javascript函数,然后按下一个按钮eval(textarea.value).这样我们就可以对数据进行一些相当有用的计算而不会出现太多问题.我也有"存储过程"的想法作为文本,他们可以加载到textarea然后评估.

这是一个不好的地方eval()吗?还是有点灰色的地方?另外,我可能遇到的一些潜在问题是什么?显然,他们可能会对页面的看法发生妄想,但只要我没有做任何愚蠢的事情,一个简单的页面重新加载就应该解决这个问题,对吗?

谢谢!

ale*_*lex 6

如果用户输入eval()'d总是来自用户,那应该没问题,那么他们可以运行的唯一恶意JavaScript就是他们自己(他们无论如何都可以做).

如果它与服务器端代码对话,请确保它与任何其他外部输入一样有效.

你还需要确保它不能像GET param等预先填充.

更新

如果您只使用变量运行基本数学运算,则可以使用正则表达式来确保非算术的值是干净的,然后是eval()它.

例如,您的方程可以有占位符CARD1CARD2.

var textarea = document.getElementsByTagName('textarea')[0],
    placeholders = ['CARD1', 'CARD2'];

document.getElementsByTagName('button')[0].onclick = function() {

    var value = textarea.value;

    // Strip placeholders
    var placeholderStripped = value.replace(new RegExp(placeholders.join('|'), 'g'), '');

    var safe = placeholderStripped.match(/^[\d\+\-\/\*\(\)]+$/);

    if (safe == null) {

        alert('Not a valid equation');
        return;

    }

    for (var i = 0, placeholdersLength = placeholders.length; i < placeholdersLength; i++) {
        value = value.replace(new RegExp(placeholders[i], 'g'), document.getElementById(placeholders[i].toLowerCase()).value);
    }

    document.getElementById('result').innerHTML = eval(value);

}
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

  • 使用简单的占位符名称和全部大写以方便使用.如果使用更复杂的名称,则可能需要先使用正则表达式转义函数join().
  • 我们允许数字0-9,+,-,/,*,().我们目前不允许使用小数.如果需要,可以添加.
  • 当我们最终eval()输入时,它应该只包含占位符名称(将被替换)和上面的基本算术字符.
  • 上面发布的代码高度依赖于jsFiddle上下文.当然,您永远不会允许占位符名称任意 - 使它们成为应有的名称.