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

时间:2011-03-10 01:11:18

标签: javascript security eval

我已经阅读了关于Javascript eval的few things,所以我觉得我的使用很有意义。

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

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

谢谢!

3 个答案:

答案 0 :(得分: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);

}

jsFiddle

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

答案 1 :(得分:3)

我不想成为情节剧,但这可能是eval()最差用法之一,因为您将执行任意的,用户提供的JavaScript。这将允许用户在您的域上执行代码,这将使XSS攻击变得非常简单。

编辑:第二个想法也许我太戏剧化了。只要您不持久保存这些功能并且它们只是在客户端的计算机上eval,那么您实际上并不允许用户在浏览器中的本地JavaScript控制台中执行任何操作。请确保不要保存这些功能供其他用户以后使用。

答案 2 :(得分:1)

从安全角度来看,这没关系,因为用户只能破坏自己的浏览器......这不是什么新鲜事。

然而,从GUI设计的角度来看,它会被认为是凌乱的。如果用户可以提供打破界面的输入 - 当然还有完整的脚本访问权限 - 那么这就是接口的错误。

那就是说,你没有制作商品,听起来这会为你节省很多精力,所以我只是去做吧。

相关问题