如何避免意外在我的 WiX / MSI 中分发敏感信息?
- 我不小心将密码、机器名称或登录凭据与我的 MSI 文件一起分发。我如何最好地处理这个问题?
- 部署后,我的应用程序错误地连接到我的 QA / UAT 系统而不是我的生产系统 - 因为我的设置的自定义操作代码中的调试构造错误。如何检测和避免这种情况?
- 我一般如何避免分发此类信息?
这是一个问答式问题,采用最简单的方法来避免意外通过您的 MSI 传播敏感信息
如何避免意外在我的 WiX / MSI 中分发敏感信息?
这是一个问答式问题,采用最简单的方法来避免意外通过您的 MSI 传播敏感信息
Super Condensed:安装 Orca,让其他人参与帮助并按顺序浏览原始表,然后是任何自定义操作代码。
所有这一切都是显而易见的——如果这发生在你身上并且你在野外有敏感信息:你所能做的就是撤回 MSI(希望从下载中——在光学媒体时代更糟),更改任何密码或者其他任何被揭露的东西——然后确保你不会再经历它。现在对于重要的部分,未来如何避免它。
除了以下有关敏感信息的信息外,还请记住,您要包含在设置中的某些文件可能无法合法再分发。典型示例是来自 Microsoft 的调试工具或来自第三方 SDK 工具包的调试工具。请仔细阅读文档并避免在您的自定义操作中使用此类“hacky 工具”。
更新:让我记下,在我忘记之前,您应该从所有设置文件中删除“下载文件阻止标志”(通常也是只读标志)。
下面建议的所有内容基本上是 1)使用 Orca 扫描您的最终 MSI,2)查看已安装的设置文件以及随您的 MSI 提供的任何模板安装脚本。此外,3)很好地审查您编译的自定义操作源#ifdef _DEBUG
,并可能改进发布构建配置实践(例如,见下文)。4)通过检查您的 MSI 中的实际内容(提取它们)来查看您的脚本自定义操作。至关重要的是:5)从其他人那里获得一些帮助以进行所有手动测试 - 获得一些同谋:-)。严重地:设置与应用程序一样重要——要使您的解决方案成功,您有责任让 QA 人员和其他参与测试的人员参与测试——并告诉他们测试什么以及如何测试。
我会避免自己尝试自动进行此类检查。没有什么可以替代对数据的真实关注。也许社区解决方案将有助于长期。它可以成为验证套件的一部分吗?半自动的帮助可能会起作用,但全自动的魔法:算了吧。有太多的方法可以使用你必须使用的所有绳索来击中自己的脚。
敏感数据可能是错误的术语,也许“无效内容”更合适。问题可能是由于您的应用程序在启动时指向您的测试服务器而不是生产服务器。自定义操作可能会弹出意外的消息框(有时会显示敏感数据),并且除了暴露纯敏感数据之外,还会出现类似的发布错误。
检查意外包含的敏感数据显然与您的包的一般 QA 相关。它应该与一般测试同时进行。QA 人员忙于应用程序测试,您真的必须推动这个部署测试,并制定测试计划。没什么花哨的,但是请测试所有安装模式(install
, reinstall
, repair
, self-repair
, upgrade
, patching
, uninstall
, administrative install
, resume / suspended install
(设置重新启动问题),您还应该这样做- 如果您有设备和网络来测试它)并测试所有自定义操作功能(彻底publishing
)advertisement
. 实际上,您必须测试安装、重新安装、卸载和升级,但请测试所有模式。
如果您正在本地化,请在所有版本的所有核心区域进行测试。还在德国地区运行英语,反之亦然,仅用于烟雾测试。事实上,在所有地区测试英语 - 我猜很明显。自定义操作很容易在由该机器上的随机状态触发的本地化机器上失败(例如,CA 试图访问硬编码的英文路径和异常结果),或者在异常处理程序代码或类似代码中显示一些被遗忘的英文消息框从未在英文盒子上触发。不好,哦,是的,而且我经常看到它应该被记录为一个问题。
而且我想应该提到一位经验丰富的开发人员的话:“ ......在发现的每个错误都是真正的惊喜之前,不要对太多人进行测试”。而且 - 他的更有趣的建议 - 预发布会留下几个已知的错误,并告诉 QA 人员有这样那样数量的错误要找到 - 只是为了一些集中注意力的动力:-)。PS:我喜欢称这位经验丰富的开发者为“老蚱蜢”,或者更常见的是他的“素食男孩”。孔子说:“永远不要相信可以用(有机)胡萝卜收买的人! ”
一个大题外话,回到真正的话题:错误包含敏感数据。
在检查我的 MSI 文件中是否有敏感信息时,我会保持简单。
如何检查?一些脚本检查可能很有用,但从经验来看,我并不喜欢它。如果我是诚实的,我更喜欢第二双眼睛而不是花哨的脚本检查。只是我从真正的发布工作中获得的两分钱。
Registry
, Property
, IniFile
- 但在其他几个位置可能存在某些问题。tables relating to GUI
也容易受到攻击。
ListBox
, ComboBox
, UIText
,Dialog
CustomAction
表或Binary
表 - 后者要求您流式传输任何脚本 - 或在其源位置检查它们)。msiexec.exe /a "Your.msi"
, 或setup.exe /a
(Installshield), 或setup.exe /extract
(高级安装程序)。一些 setup.exe 信息。#ifdef _DEBUG
包装debugging message boxes
和任何hard coded test variables
. 请参阅下面的 C++ 片段。这意味着发布版本中根本没有实验值(预处理器将删除所有调试结构)。NOMB
到您的发布版本中?请参阅下面的示例 - 应该防止杂散发布构建消息框 - 定义基本上“禁止”它们(其他可能的定义:如何驯服 Windows 标头(有用的定义)?)。
user32.dll
,它似乎甚至支持上述NOMB
功能以及超时。换句话说,您可以将消息框设置为在发布版本中禁止和在调试版本中超时。没有彻底测试。d
为您编译的自定义操作 dll 或任何其他文件添加一个文件名?即使它会给你带来一些额外的工作?在 C++ 自定义操作中仅调试消息框:
我使用消息框将调试器附加到 C++ 自定义操作代码。如何避免这些小动物出现在发布版本中?这里有一个建议:
#ifdef _DEBUG //Display Debug information only for debug builds
MessageBox(NULL, "Text", "Caption", MB_OK|MB_SYSTEMMODAL);
#endif
高级 C++ 人员会立即看到他们应该为此创建一个更好的宏 - 将所有内容都包含在内 - 我不是 C++ 专家,所以我暂时将其排除在外(SafeMessageBox?DeploymentMessageBox?)。
在stdafx.h
中,可能还启用NOMB
(应防止MessageBox
编译,除非用#ifdef _DEBUG
-包装,MessageBoxes
仅在调试版本中可用):
#ifndef _DEBUG // Forbid MessageBox in Release builds
#define NOMB
#endif
(公平的赌注,这可能会成为你最讨厌的定义之一 :-)。谁闻到了注释掉的部分?我不会使用#undef
添加临时发布消息框 - 它会破坏整个保护功能 - 可能会导致您希望避免的事情:一个杂散的消息框。stdafx.h
如果必须的话,也许只需注释掉 #define ,然后再次启用定义 - 通过构建过程自动 - 对于真正的公共发布构建,触发任何杂散消息框的编译错误)
如上所述,您可以尝试新的MessageBoxTimeout方法(从 开始user32.dll
,从 XP 开始显然可用)来显示不会“卡住”但在指定秒数后超时的消息框。不用于发布,但可能对调试和 QA 有用。
一些上下文:#ifdef DEBUG 与 #if DEBUG。真正了解 C++ 的人,可以根据需要随时澄清或详细说明。以上来自一个非常古老的 C++ 项目。
基本上就是这样——几乎不是火箭科学——只是“咬人的小事”。关于以下主题的一些进一步讨论,但没有替代此手动扫描恕我直言。我诚实的建议,抓住一些人(经理很好:-) - 把他们作为同谋拉进来!),为他们安装 Orca 并告诉他们单击表格并查看所有设置文件 - 并让开发人员帮助编译自定义操作代码。仅仅查看原始的 Orca 表甚至可以有效地发现其他错误或缺陷。
在开发过程中,有很多机会在您的 MSI 源中意外包含敏感信息:login credentials
、passwords
、database connection strings
、user names
、share name
、IP-address
、machine names
、或.ftp passwords
web host login credentials
other sensitive data
您的 MSI 显然根本不应该包含任何此类敏感信息- 当然,除非您想指向您自己的网站,或者提供联系电子邮件或电话号码。然而,其他任何事情几乎总是不受欢迎的——并且由于开发实验(通常在脚本自定义操作中——或为此编译的自定义操作——甚至更糟且无法检测到),很快就会忘记从生产 MSI 文件中删除此类硬编码信息通过上面建议的 Orca 审查方法,但用户通常无法查看,除非它通过意外消息框显示 - 或者如果 .NET 托管代码被反汇编)。
如果安装确实需要,则此类“敏感”信息应该是最终用户在安装时设置的参数(属性),可以通过设置的交互式 GUI 设置,也可以通过 PUBLIC PROPERTIES 设置,或者在安装时在命令行转换正在安装。这里有一些关于使用转换和公共属性的信息:如何更好地利用 MSI 文件进行 MSI 文件的静默企业部署(链接的答案还提供了对 MSI 问题和更一般意义上的好处的相当特别的描述)。