我的程序的安全自动更新程序

问题描述 投票:0回答:2

我用Python编写了一个经常修改的程序。 我有大约十几个测试人员(希望这个数字会增加),他们在便携式版本中使用该程序,这不需要他们安装任何东西。 我最近尝试在程序中提供自动更新程序,这样他们就可以从最近的更新中受益,而不会丢失配置,也不需要手动下载新版本。

但是,考虑到此类更新程序可能带来的安全风险,我希望尽可能安全地进行操作。 这是我想到的。

  1. 程序启动时,它会检查其构建版本(硬编码)。
  2. 它会将此构建版本与服务器上可用的最新构建版本进行比较。 这个检查是通过https完成的,除了获取服务器上的信息并进行比较之外,没有做太多事情。
  3. 如果有更新的版本可用,系统会询问用户是否要下载并安装它。 如果是,程序将在启动更新程序(不同的程序)后关闭。
  4. 更新程序从服务器下载新版本。 此时它是一个 zip 存档。
  5. 更新程序将 zip 存档提取到为此目的创建的临时目录中。 然后它调用一个批处理文件。 更新程序在启动批处理文件之前关闭。
  6. 批处理文件将临时目录中的所有内容复制到当前目录,但保留原样的设置除外。 然后,当它即将关闭时,它再次调用客户端。
  7. 再次开始,已更新。

使用批处理文件是因为更新程序无法替换自身(操作系统似乎不太喜欢那样,这也不能怪它)。

这个效果非常好。 一些用户告诉我 https 中的初始连接不起作用,这很令人费解,但我认为通过 http 做同样的事情不是一个好主意,太容易改变 zip 文件了。 是吗?

也许我的步骤列表对于安全来说确实是错误的。 我想听听您的想法和意见,了解哪些内容应该被删除,哪些内容可以加强。

提前谢谢您,

python auto-update
2个回答
0
投票

嗨,我之前回答过类似的问题,这里是链接Answer

但是和你的需求不一样但是我觉得更好。

这是代码

import tkinter as tk #for you it is pyqt5
from tkinter import * #MessageBox and Button
import requests #pip install requests
import os #part of standard library
import sys #part of standard library

VERSION = 4

b1 = Button(frame, text = "Back", command = homepage)
b1.pack(ipadx= 10, ipady = 10, fill = X, expand = False, side = TOP)

checkupdate = Label(frame, text = "Looking for updates", font = ("Arial", 14))
checkupdate.pack()

try:
    link = "https://raw.githubusercontent.com/SomeUser/SomeRepo/main/SomeFolder/version.txt"
    check = requests.get(link)
    
    if float(VERSION) < float(check.text):
        mb1 = messagebox.askyesno('Update Available', 'There is an update available. Click yes to update.')
        if mb1 is True:
            filename = os.path.basename(sys.argv[0])

            for file in os.listdir():
                if file == filename:
                    pass

                else:
                    os.remove(file)

            exename = f'NameOfYourApp{float(check.text)}.exe'
            code = requests.get("https://raw.githubusercontent.com/SomeUser/SomeRepo/main/SomeFolder/NewUpdate.exe", allow_redirects = True)
            open(exename, 'wb').write(code.content)

            root.destroy()
            os.remove(sys.argv[0])
            sys.exit()
            
        elif mb1 == 'No':
            pass
        
    else:
        messagebox.showinfo('Updates Not Available', 'No updates are available')

except Exception as e:
    pass

0
投票

您可以尝试Python包tufup,它基于python更新框架,并且可以与PyInstaller结合使用。

© www.soinside.com 2019 - 2024. All rights reserved.