电子是不是将来自 mainWindow 的 cookie 存储在内存中或硬盘驱动器的某个地方?如果硬盘那么在哪里?

Posted

技术标签:

【中文标题】电子是不是将来自 mainWindow 的 cookie 存储在内存中或硬盘驱动器的某个地方?如果硬盘那么在哪里?【英文标题】:Does electron store cookies from the mainWindow in memory or on the hard drive somewhere? If the hard drive then where?电子是否将来自 mainWindow 的 cookie 存储在内存中或硬盘驱动器的某个地方?如果硬盘那么在哪里? 【发布时间】:2020-06-25 14:39:49 【问题描述】:

在处理 Electron 应用程序时,我意识到我存储在 cookie 中的身份验证令牌并未存储在其缓存文件中的“Cookie”文件中,缓存文件位于本文How to clear the cache data in Electron(atom shell)? 中指定的路径中。

由于我不知道 Electron 或 Chromium 的工作原理,我希望有人能帮助我回答以下问题:

    Electron 是否将来自“mainWindow”* 的 cookie 存储在内存中或硬盘驱动器上的文件中?如果它确实将它存储在硬盘驱动器的哪个位置和哪个文件中? (我需要此信息来评估安全问题) 如果 electron 存储的使用 Chromium 的 cookie 是否以某种方式加密,也很高兴。

*我所说的 mainWindow 是指当我通过电子代码在窗口内打开我的 Web 应用程序,然后允许用户登录时。我需要知道登录后存储的 cookie 存储在哪里。

如果有人知道这方面的任何信息,请告诉我。

【问题讨论】:

路径会因平台或操作系统而异 @Asesh 您是否确切地知道存储 cookie 的文件是哪个文件,以及这些 cookie 是否已加密以使它们不易被读取?任何主要操作系统的路径都可以。 【参考方案1】:

Electron 是否将来自“mainWindow”* 的 cookie 存储在内存中或硬盘驱动器上的文件中?如果它确实将它存储在硬盘驱动器的哪个位置和哪个文件中? (我需要此信息来评估安全问题)

在 Electron 中,Cookies 存储在每个会话的基础上。

假设您正在使用BrowserWindowWebContents 会话来设置cookie,如下所示:

const  BrowserWindow  = require('electron')

let win = new BrowserWindow( width: 800, height: 600 )
win.loadURL('http://github.com')

const ses = win.webContents.session
const cookie =  url: 'http://www.github.com', name: 'dummy_name', value: 'dummy' 
await ses.cookies.set(cookie);

您的 cookie 应该在您的用户数据路径下可用,您可以通过 app.getPath('userData') API 访问该路径。

请注意,子目录取决于您使用的会话。例如,如果您使用的是 session.fromPartition('persist:your-part-name) API,则需要导航到 Partitions/your-part-name 文件夹。

如果知道使用 Chromium 的电子存储的 cookie 是否以某种方式加密也会很高兴。

Chromium 中的 Cookie 确实是加密的 (see changelist)。 Electron 使用 Chromium 的实现。

【讨论】:

嗨。嗯,我熟悉 Electron cookies api,并且我也知道 userData 文件夹中的“Cookies”文件。但是,当我使用 sqlite db 查看器打开文件时,我没有看到我当前登录的用户的 cookie 存储在该文件中。因此想知道 Electron 可以将它存储在哪里?或者它不存储应用程序关闭时过期的cookies?我基本上需要知道我的 cookie 存储在哪里,以及它是使用加密等技术安全存储的,还是以纯文本形式存储以供所有人查看。 Electron 在幕后使用 Chromium 的 cookie 实现,我相信 Chromium 已经有一段时间了 encrypted its cookies。我认为你在正确的文件上,SQLite 不能直接读取 Cookies 文件是有道理的,因为它是加密的。 感谢 Erik 的回复。该链接肯定有帮助,尽管只是想指出我实际上可以通过 SQLite 查看器查看 Cookies 文件。我看到了我通过电子打开的其他网站的 cookie,但没有看到我们用于用户会话的 Auth cookie。我猜电子不存储通过 Http 标头创建的 cookie,而是存储在电子中打开的辅助链接的 cookie?但这只是一个猜测。【参考方案2】:

我正在加载一个外部网页,下面的配置对我有用。默认情况下,网页配置为使用“会话 cookie”,这就是为什么我将其更改为“持久 cookie”,有效期为 2 周:

// Modules to control application life and create native browser window
const app, BrowserWindow = require('electron')
const path = require('path')
const util = require('util')

function createWindow () 
  // Create the browser window.
  const mainWindow = new BrowserWindow(
    width: 700,
    height: 500,
    webPreferences: 
      preload: path.join(__dirname, 'preload.js'),
      partition: 'persist:infragistics'
    ,
    icon: __dirname + '/assets/favicon.ico',
    show:false
  )



  let cookies = mainWindow.webContents.session.cookies;
  cookies.on('changed', function(event, cookie, cause, removed) 
    if (cookie.session && !removed) 
      let url = util.format('%s://%s%s', (!cookie.httpOnly && cookie.secure) ? 'https' : 'http', cookie.domain, cookie.path);
      console.log('url', url);
      cookies.set(
        url: url,
        name: cookie.name,
        value: cookie.value,
        domain: cookie.domain,
        path: cookie.path,
        secure: cookie.secure,
        httpOnly: cookie.httpOnly,
        expirationDate: new Date().setDate(new Date().getDate() + 14)
      , function(err) 
        if (err) 
          log.error('Error trying to persist cookie', err, cookie);
        
      );
    
  );

注意:确保您已设置"partition" webPreferences property as well,这一点很重要。

设置页面使用的会话的字符串。如果分区以 persist: 开头,则页面将使用可用于应用程序中具有相同分区的所有页面的持久会话。如果没有persist:前缀,页面将使用内存中的会话

您可以检查是否在您的 Chrome 应用程序部分设置了 cookie:

Origin source.

【讨论】:

以上是关于电子是不是将来自 mainWindow 的 cookie 存储在内存中或硬盘驱动器的某个地方?如果硬盘那么在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

来自 Qt 中 main.cpp 代码的 MainWindow

电子占据100%的屏幕(不是全屏)

如何隐藏电子默认菜单

Coo_matrix和其他矩阵示例

在 Qt 中无效使用非静态数据成员 Ui_Mainwindow::(Pushbutton)

MS Access 发送电子邮件(不是来自 Outlook 或用户的电子邮件)