ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Appium 日志过滤指南:用 --log-filters 对服务器日志中的敏感信息进行脱敏

Appium 日志过滤指南:用 --log-filters 对服务器日志中的敏感信息进行脱敏 Appium 日志过滤指南用 --log-filters 对服务器日志中的敏感信息进行脱敏【免费下载链接】appiumCross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol项目地址: https://gitcode.com/GitHub_Trending/ap/appiumAppium 服务器在运行过程中会把会话参数、应用包名、设备标识、令牌等信息打印到控制台与日志文件这些内容一旦泄露可能带来安全风险。本文围绕 Appium 提供的--log-filters日志过滤机制展开介绍过滤规则配置文件的格式、全部支持的规则属性与配置示例并深入仓库源码说明规则是如何在启动阶段被加载、解析以及在每条日志输出前被逐条替换的完整链路。读完本文你可以为生产环境的 Appium 服务器配置一套可复用、可校验的日志脱敏方案并能自行排错。为什么需要日志脱敏密码、设备标识符UDID/IMEI、会话令牌、哈希值等敏感数据经常随caps、请求头或错误堆栈出现在 Appium 服务器日志里。Appium 允许通过--log-filters命令行参数指定一个“日志混淆规则配置文件”让服务器在输出每一条日志之前把命中的敏感值替换为统一的掩码文本。该功能的入口说明位于 服务器 CLI 参考|--log-filters|List of log filtering rules. See the [log filtering guide](https://link.gitcode.com/i/5001722a71531f2a26f84c55c57d4d9b) for details.|array||配置来源两种合法的规则提供方式过滤规则可以通过以下两种方式提供给 Appium二者等效一个合法的 JSON 文件路径文件内容是一个过滤规则数组通过--log-filters /path/to/filters.json传入Appium Config 文件中的log-filters条目规则数组直接内联在配置文件的server段中。仓库自带的配置文件示例 appium-config-log-filters.json 展示了第二种方式的标准形态{ server: { log-filters: [ { text: foo, replacer: bar }, { pattern: /foo/, flags: i } ] } }server段的log-filters字段在配置 schema 中被定义为数组且带有 CLI 转换器json见 appium-config-schema.ts。这意味着通过命令行传入时值既可以是文件路径也可以是一段内联 JSON 字符串——cli-transformers.ts 中的json转换器会先检测入参是否为已存在的文件是则读文件否则直接JSON.parse原始字符串。因此下面两种写法都成立# 方式一指向 JSON 文件 appium --log-filters /etc/appium/log-filters.json # 方式二内联 JSON注意 shell 引号转义 appium --log-filters [{text:my.magic.app}]规则属性详解每条规则是一个对象支持以下预定义属性对应 schema 中的logFilter定义见 appium-config-schema.ts属性类型说明patternstring合法的 JavaScript 正则表达式模式必须是非空字符串。正则中的元字符在 JSON 里需要转义如my\.magic\.\\w。textstring精确文本匹配。pattern与text二者必须至少提供一个同时提供时pattern优先。flagsstring正则标志与标准 JavaScriptRegExp构造函数的标志一致i、m、s、u、y等。g全局匹配标志始终自动开启无需手写。schema 对标志串的格式校验为^igmsduy*即单字符或逗号分隔多个标志请写成i,s这类形式。replacerstring替换值。默认为**SECURE**允许空字符串。replacer与标志的默认行为在源码中有明确实现secure-values-preprocessor.ts 中DEFAULT_SECURE_REPLACER常量即为**SECURE**而parseRule方法初始化时flags [g]随后才合并用户提供的i/m/s/u/y标志这从代码层面印证了“g标志恒开”的文档约定。text属性并不是简单的“包含匹配”源码中的 toExactMatchPattern 会在文本首尾按需附加\b单词边界只有当文本以“单词字符”开头或结尾时才加边界否则像Pssw0rd!这类以符号结尾的文本将永远匹配不到任何内容并且会对整个文本做正则转义。该行为有专门的测试覆盖preprocessor.spec.ts 验证了Pssw0rd!、15550100、#hunter2均能整词命中。配置示例可直接复用以下示例完整继承自官方指南均可保存为 JSON 文件后经--log-filters使用。示例 1用默认替换器隐藏一个固定字符串替换日志中所有my.magic.app出现为默认的**SECURE**[ { text: my.magic.app } ]示例 2正则 自定义替换器忽略大小写替换所有形如my.magic.任意字符的字符串例如my.magic.app、my.magic.1替换为***忽略大小写[ { pattern: my\\.magic\\.\\w, flags: i, replacer: *** } ]示例 3多条规则组合同时替换my.magic.任意多个字符与your.magic忽略大小写[ { pattern: my\\.magic\\.\\w, flags: i, replacer: *** }, { pattern: your\\.magic, flags: i, replacer: *** } ]示例 4进阶——截断超长日志行利用“捕获组 替换引用”的机制把所有日志行截断为最多 15 个字符注意s标志让.能匹配换行[ { pattern: (.{1,15}).*, flags: s, replacer: $1 } ]这个示例说明replacer支持 JavaScript 字符串替换的$1这类组引用因此过滤规则不仅限于“打码”还可以做通用的日志改写。错误处理启动即拦截若规则配置中存在任何非法项如空/非法的pattern、缺少pattern/text的空规则、text为空字符串等Appium 会打印完整的错误清单并拒绝启动直到问题被修复。这一行为在启动器中有明确实现appium-initializer.ts 的applyLogFilters方法会把解析阶段收集到的issues组装成一条带完整错误清单的Error抛出错误信息前缀为The log filtering rules config ... has issues:若规则数组为空则打印一条Found no log filtering rules in the ... config. Is that expected?的警告全部加载成功时打印Loaded N filtering rules。每条规则的具体校验逻辑位于 secure-values-preprocessor.ts 的parseRule方法它会逐条抛出带规则原文 JSON 的错误消息例如The value of pattern must be a valid non-empty string、Must either have a field named pattern or text再由loadRules汇总为issues数组返回而不是让单条坏规则悄悄被忽略。源码级链路规则如何生效从源码结构看整条脱敏链路分为四个环节参数解析--log-filters是服务器级数组参数schema 中声明了appiumCliTransformer: jsonappium-config-schema.ts支持文件路径或内联 JSON解析结果挂载到serverArgs.logFilters启动期加载服务器初始化流程 appium-initializer.ts 在logsinkInit之后立即调用applyLogFilters进而调用 log.ts 中的loadSecureValuesPreprocessingRules。该方法委托给SecureValuesPreprocessor.loadRules完成解析与校验注意 JSDoc 说明“每次调用会替换之前加载的规则”逐条日志预处理Log类的 log 方法 在构造每条日志记录时对prefix和message分别调用this._secureValuesPreprocessor.preprocess(...)也就是说日志前缀和消息体两个字段都会被过滤而不仅是消息正文规则引擎执行preprocess 按规则声明顺序依次对整串执行String.replace因g标志恒开每次替换都是全局的。多条规则是顺序串联的——后一条规则作用于前一条规则的输出结果。preprocessor.spec.ts 中的用例验证了这一点加载{text:yolo, flags:i}与{pattern:^:, replacer:***}两条规则后:yolo yo Yolo yyolo会变成***yolo yo **SECURE** yyolo注意锚定^:的规则先执行后首行文本已变化后续规则看到的是替换后的串。验证与测试依据仓库内有两类可直接参考的测试与夹具单元层preprocessor.spec.ts 覆盖了字符串简写规则、多条规则串联、pattern优先于text、含非法 pattern 时部分规则仍生效且产生issues、以及非单词字符文本的边界匹配等场景端到端层config-file.e2e.spec.ts 验证了server.log-filters配置段能被正确读取并通过 schema 校验规则解析为logFilters: [{text: foo, replacer: bar}, {pattern: /foo/, flags: i}]。配套夹具见 log-filters.json 与 appium-config-log-filters.json。进阶面向扩展开发者的 markSensitive 机制--log-filters是全局静态的脱敏手段它只能依据“事先写死的规则”匹配日志文本。对于需要运行时条件脱敏的场景例如某个会话的令牌只在处理该请求时才需要打码Appium 提供了更精细的机制扩展可以在日志表达式中使用logger.markSensitive(value)包装敏感值并配合请求头X-Appium-Is-Sensitive: 1条件触发掩码。该方案的原理、局限与写法见仓库中的 Masking Sensitive Log Data 指南它内部也明确指出“Appium 服务器已提供通过 filtering 操作日志记录的方式但它有自身局限”。二者可以互补--log-filters负责兜底静态打码markSensitive负责按请求动态打码。小结--log-filters接受规则 JSON 文件路径或内联 JSON也可内联在 Appium Config 的server段规则属性为pattern/text/flags/replacerpattern优先于textg标志恒开replacer默认为**SECURE**规则加载发生在服务器启动早期任何非法规则都会阻止启动并输出完整错误清单过滤作用于每条日志的前缀与消息体多规则按声明顺序串联执行动态脱敏需求可进一步结合markSensitive机制。【免费下载链接】appiumCross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol项目地址: https://gitcode.com/GitHub_Trending/ap/appium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表