【问题标题】:Is JS object within a script tag secure?脚本标签中的 JS 对象是否安全?
【发布时间】:2017-03-16 09:40:48
【问题描述】:

我有一个这样的 html,我从我的网络服务器传送给客户端

<html>
<head>
    <script type="text/javascript">
        var myapp = myapp || {};
        myapp.settings = {"abc", "xyz", "123"};
    </script>
</head>
</html>

在我的客户端应用程序的其余部分,我检查了 myapp.settings 对象。

myapp.settings 安全吗?黑客可以从 myapp.settings 添加字符串或删除字符串吗?如果是这样,有哪些示例方法可以做到这一点?

【问题讨论】:

  • 这不是有效的 JavaScript 代码。如果它是一个数组,它应该使用方括号代替([]),如果它是一个对象,if 应该有一些值。
  • 您认为操纵设置的最坏结果是什么?因为对于客户端的东西,我希望所谓的“应用程序设置”通常是完全无害的,即使“被黑客入侵”也是如此。最多,我会想象“攻击者”可能能够以您不想要的方式控制视图,例如以不同的顺序布置东西或增加分页大小或类似的东西。如果有应该保密,它不应该在那里。如果这控制了可能使服务器过载的东西(最大请求大小等),那么服务器也应该限制它。

标签: javascript html security ecmascript-6


【解决方案1】:

不,它不安全。事实上,网页中的任何内容都不是绝对安全的。

在您的特定示例中,以下是一些有关如何操作您的 myapp 对象的示例:

  1. 最终用户可以打开浏览器控制台并输入一行代码来更改该对象。

  2. 最终用户可以打开浏览器调试器,设置断点,并在遇到该断点时编辑该对象。

  3. 最终用户可以下载或创建一个书签,单击该书签会修改myapp 对象。

  4. 最终用户可以设置代理来拦截传入页面,对其进行修改,然后将其发送到浏览器。

  5. 攻击者可以在页面到达您的途中拦截并修改它(例如,当它通过您的 ISP 时)。注意:如果您使用的是 https,这种可能性会大大降低。

由于浏览器中没有什么是完全安全的,因此必须考虑到特定需求来解决安全问题,然后探索解决这些特定问题的选项。

【讨论】:

    【解决方案2】:

    不,它不安全。

    是的,用户可以相当轻松地操纵 myapp.settings 对象的状态。

    【讨论】:

    • 谢谢,你能告诉我一些关于如何操纵它的例子吗?
    • 这里有一种警告,只有实际用户才能操作这些对象。例如,我很难操纵另一个用户的 myapp.settings 对象。操作就像从浏览器控制台访问对象一样简单。更高级的封闭变量访问版本需要设置断点,但仍然是改变状态的可行方法。
    • 我想我可以像其他用户指出的那样使用 Object.freeze() 并使其安全或不可修改?
    • 它永远不会是安全的。只要指望它受到攻击,并在服务器端验证任何敏感的东西,即客户端交互发生的事情是经过授权和验证的。
    【解决方案3】:

    只要有人可以在该应用程序中执行脚本,他们就可以修改myapp.settings。但是,您可以通过在其上使用Object.freeze() 函数来防止这种情况:

    Object.freeze(myapp.settings);
    myapp.settings.test = 42;
    console.log(myapp.settings.test); // undefined
    

    【讨论】:

    • 在冻结的代码行上设置断点将允许在这种情况下与 myapp.settings 对象进行交互。
    • 谢谢,Object.freeze() 是否也会阻止它被浏览器控制台操作?
    • @TravisJ 我假设这个“黑客”不能修改这个应用程序中已经存在的脚本。如果可以,您将无法阻止他们。
    • 一旦加载了一个脚本,那么确定它就在适当的位置,向后退会有点疯狂。但是,通常在加载时向后退就像F5 一样简单。任何加载脚本都可以在执行之前使用断点进行修改。脚本不安全,这就是为什么需要在服务器端而不是客户端强制执行安全性。
    • @govin 是的,但是还有其他方法可以从浏览器控制台操作 JavaScript 代码(例如设置断点,就像 Travis J 指出的那样),因此客户端 JavaScript 代码实际上并不安全。
    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2019-09-12
    相关资源
    最近更新 更多