【问题标题】:Security implications of running eval() on user-generated input in an iFrame (angularJS)在 iFrame (angularJS) 中对用户生成的输入运行 eval() 的安全隐患
【发布时间】:2015-05-13 16:41:55
【问题描述】:

我知道在用户输入上使用eval() 通常是不安全的,但是在这个特定的用例中,我想知道我是否可以避免负面的安全影响。我有一个iframe,它看起来像这样(注意这是一个template,所以它被另一个文件嵌入到页面上):

HTML:

<iframe>
<html ng-app="iframe">
<script type="text/javascript" src="/static/angular.js"></script>
<script type="text/javascript" src="/static/iframe.js"></script>
<body id="body" ng-controller="iFrameCtrl">
<script id="myscript" type="text/javascript">
    var color = 'orange';
    console.log(color);
    stage.update();
</script>
</html>
</iframe>

还有iframe.js

angular.module('iframe', [])
.controller('iFrameCtrl', ($scope){
    //external user input that modifies 'color' variable in #myscript
    //$scope.$watching brings external variable changes into this function
    var scriptElem = angular.element(document.querySelector('#myscript'));
    scriptText = scriptElem[0].innerText;
    $scope.$apply();
    eval(scriptText);
});

基本要点是有一个用户输入(来自 iframe 外部,它正在修改颜色变量,将 var color = 'orange' 更改为 var color = 'blue',或类似的东西 - 其中 eval() 导致脚本重新执行并应用新的color)。

这可以安全地完成吗?在XSS攻击等方面。

我最初的印象是肯定的——所有脚本都在 iFrame 中执行。此外,Angular 能够使用指令仅接受与编程建立的规则一致的输入字段中的字符串。 (即,如果输入字段遵循既定格式,我可以让输入字段仅评估为 true)。

感谢任何帮助。谢谢!

【问题讨论】:

    标签: javascript angularjs iframe angularjs-scope


    【解决方案1】:

    不受欢迎的答案:你没问题,只要你检查没有恶意行为。根据我的经验,任何人都可以通过打开控制台来执行任何操作。 真正的危险是恶意脚本被写入数据库并在下次页面加载时调用(对于另一个用户)。允许 eval 只会影响执行脚本的人。当有人将自己的代码注入您的页面时,就会发生 XSS 脚本,通常是通过在某处创建指向恶意脚本的链接,该恶意脚本将为 其他用户(不仅仅是做坏事的人)加载。

    【讨论】:

    • 这是正确的。很多时候,“对用户输入的评估是错误的”不符合“......如果用户输入保存在数据库中并评估其他用户会话”。
    • +1 不仅仅是说“eval 不好”。恶意代码其实也很好,重要的只是它是否到达了其他用户。我认为“其他用户”这个词值得强调。 :)
    • 你们都提出了有效的观点,但是,如果你发现自己使用 eval,10 次中有 9 次,通常有更好的方法来实现你想要实现的任何目标。更不用说,如果您的代码必须检查 PCI 合规性。
    • 我不确定我是否同意,可以肯定的是,我不记得我最后一次真正使用 eval 是什么时候,但它在评估数学运算时确实非常棒。你会使用 eval 还是为 javascript 计算器构建自己的编译器?
    • 我必须编写一个计算器来应对代码挑战,面试前。没有使用 eval :) 在较低级别上,当编译器遇到 eval 时,它会阻止您的代码针对解释器进行优化。
    【解决方案2】:

    这里真的不需要eval。

    我建议走语义路线,并使用跨文档消息传递,特别是如果您只更改一个属性。它也应该不那么密集。

    https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

    就安全性而言,这确实取决于,但约定的存在是有原因的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 2017-12-11
      • 2021-05-21
      • 2020-01-27
      • 1970-01-01
      • 2010-09-07
      • 2012-05-29
      • 2012-03-28
      相关资源
      最近更新 更多