【问题标题】:Can I prevent node_modules bundled with webpack from using window.postMessage?我可以阻止与 webpack 捆绑的 node_modules 使用 window.postMessage 吗?
【发布时间】:2020-09-09 21:30:40
【问题描述】:

出于安全原因,我需要禁止 webpack 包含在我的包中的第 3 方模块使用 window.postMessage 与我的 Electron 应用程序中的其他进程进行通信。

这可能吗?

【问题讨论】:

    标签: security webpack electron node-modules


    【解决方案1】:

    一个标准的技巧可以在这里提供帮助:只需将方法移动到窗口上的另一个变量,就像这样:

    window._postMessage = window.postMessage;
    window.postMessage = () => {};
    

    首先在您的渲染脚本上运行它,或者在您的 html 和插件上使用 <script> 标记,这些插件将无法再发送事件(事实上,它们不会崩溃但永远不会得到响应)。

    编辑

    如果你想确保只有授权用户可以使用它,这样的事情可能会起作用:

    function createSecurePostMessage() {
      const _postMessage = window.postMessage;
    
      return {
        get() {return function(...args) {
          if (isAuthorized(...args) {
             _postMessage(...args);
          }
        }
      }
    }
    window.postMessage = createSecurePostMessage().get();
    

    现在原始的 postMessage 在函数内部并且无法访问,您可以实现一个方法,例如,检查是否可以发送某个消息。如果有人再次调用 create,那么受保护的 postMethod 将再次被“保护”。

    【讨论】:

    • 感谢您的回答,但这并不像我希望的那样安全。我的代码是开源的。一个坚定的黑客可以看到新名称和使用新名称的运输代码。或者他们可以枚举“window”上的所有方法,以及一些如何测试它们是否是 postMessage
    • 如果不需要 postMessage 方法,可以直接去掉:delete window.postMessage。
    • 但我确实需要它?
    • @M.K.Safi - 检查我的编辑是否对您有更多帮助:)
    • 我真的不明白防御性地试图避免库访问代码的意义。如果你非常关心这样的事情,你应该在捆绑它们之前检查这些库。只需将功能移至其他位置即可消除意外使用它的选项。你说它是开源的,恶意的人可以改变它,但为什么要在库上改变它呢?如果是我,我会下载代码并更改它,重新编译并提供它。如果您想要安全性,那么您需要身份验证,但这在很大程度上取决于您的项目如何实现。
    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多