如何将QSettings生成的ini文件设为只读,避免用户篡改配置?
QSettings Ini文件只读限制的实现方案
QSettings本身没有内置只读开关,可通过以下几种路径实现需求:
方案1:操作系统层设置文件只读权限
实现成本最低,仅需在配置写入完成后修改文件系统级权限,QSettings读取只读文件无影响,写入时会静默失败(可通过status()方法判断写入结果)。
示例代码:
import os import stat from PyQt6.QtCore import QSettings # 初始化配置并写入内容 settings = QSettings("config.ini", QSettings.Format.IniFormat) settings.setValue("window/width", 1280) settings.setValue("window/height", 720) settings.sync() # 强制刷新写入磁盘 # 获取配置文件路径并设置为全局只读 config_path = settings.fileName() os.chmod(config_path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
如果后续需要修改配置,可临时收回只读权限、写入完成后再重新设置即可。
方案2:存储到普通用户无写入权限的系统路径
将配置文件存到系统级目录,普通用户默认无法修改:
- Windows:
C:\ProgramData\你的应用名称\ - Linux:
/etc/你的应用名称/ - macOS:
/Library/Preferences/你的应用名称/
仅当程序以管理员/root权限运行时才能写入配置,普通用户运行时仅能读取,适合多用户场景下全局配置的管控。
方案3:配置篡改校验(防刻意修改)
如果要避免用户手动修改文件权限后篡改配置,可增加哈希校验逻辑:
每次程序正常写入配置时,将所有配置项计算哈希值存入配置文件;读取时先校验哈希,不一致则判定为用户非法修改,直接加载默认配置或弹出提示。
示例代码:
import hashlib import json from PyQt6.QtCore import QSettings def calc_config_hash(settings: QSettings) -> str: config_items = {} for key in settings.allKeys(): if key != "internal/hash": # 排除哈希字段本身 config_items[key] = settings.value(key) # 排序后序列化保证哈希计算结果稳定 sorted_str = json.dumps(config_items, sort_keys=True).encode("utf-8") return hashlib.sha256(sorted_str).hexdigest() # 读取配置时校验 settings = QSettings("config.ini", QSettings.Format.IniFormat) saved_hash = settings.value("internal/hash", "") current_hash = calc_config_hash(settings) if saved_hash and current_hash != saved_hash: # 配置被篡改,重置为默认值 settings.clear() settings.setValue("window/width", 1280) settings.setValue("window/height", 720) # 保存新的哈希值 settings.setValue("internal/hash", calc_config_hash(settings)) settings.sync()
方案4:固定配置存入资源文件
如果配置完全不需要修改,可直接将ini文件打入Qt资源系统(qrc),资源文件默认只读,用户完全无法修改,适合静态配置场景。
内容的提问来源于stack exchange,提问作者Gillian Grace
相关产品推荐
相关产品推荐

