脚本化文件删除安全措施及游戏引擎文件写入防护方案咨询
限制游戏引擎仅在指定目录内保存文件的解决方案
一、实现仅允许保存到游戏目录内的方法
当然可以实现这类限制,核心思路是对所有待保存的路径做严格的范围校验,具体步骤如下:
- 先确定合法的保存根目录:可以是游戏安装目录下的专属子文件夹(比如
./saves/),或是系统标准的用户数据目录(比如Windows的%APPDATA%\YourGame\Saves),并获取该目录的规范化绝对路径(消除所有相对路径、符号链接等特殊情况)。 - 对用户输入的保存路径/文件名,通过系统API或标准库(比如C++17的
std::filesystem、Python的pathlib)将其转换为绝对路径并规范化,处理掉相对路径、短文件名、符号链接等问题。 - 校验规范化后的路径是否完全落在合法根目录的子树内:不能仅做字符串前缀匹配(要考虑Windows大小写不敏感、路径分隔符混用等情况),应该用专门的路径对比函数,比如
std::filesystem::path::lexically_normal处理后判断是否以合法根路径为前缀,或是调用系统提供的路径归属校验接口。 - 封装统一的保存入口:所有模块的文件写入操作必须通过这个校验后的接口,禁止直接调用底层文件写入API,避免出现绕过校验的情况。
二、仅检查..不足以保障安全
只过滤路径中的..完全不够,攻击者或误操作的用户有很多其他方式跳出游戏目录:
- 绝对路径直接输入:用户直接填写
C:\Windows\test.txt这类绝对路径,无需..就能直接访问游戏目录外的文件。 - Windows短文件名:比如
C:\Game\PROGRA~1可能对应C:\Program Files,这类路径不含..但会跳转到外部目录。 - 符号链接/ junction点:如果游戏目录内存在指向外部的符号链接,用户保存到该链接路径会直接跳转到外部文件。
- 环境变量注入:用户输入
%SYSTEMROOT%\file.txt,解析后会指向系统目录,同样不含..。 - 特殊路径格式:比如Windows的
\\?\C:\...扩展路径格式,或者/与\混用的路径,仅检查..无法识别。
正确的做法是跳过字符校验,直接通过路径规范化+范围校验来确保所有保存操作都限制在合法目录内。
额外安全建议
- 使用系统提供的路径拼接函数(比如
std::filesystem::operator/)拼接用户输入的文件名,避免手动拼接导致的路径注入问题。 - 采用"先写临时文件,成功后替换目标文件"的保存逻辑,既避免文件损坏,也降低恶意利用的风险。
- 限制用户输入的文件名只能包含合法字符(比如Windows禁止
:、*、?、"等字符),减少异常路径的产生。 - 以普通用户权限运行游戏,即使出现漏洞,也能限制破坏范围。
内容的提问来源于stack exchange,提问作者Eric Bishop
相关产品推荐
相关产品推荐

