反证问题的构造方式,是先写下一个能被推翻的预测,再设计一组只改变一个条件的对照观察,让不同解释在同一份证据上分出胜负。以下用一段明确标注为假设的情境,把这个过程拆成可核对的动作。
假设某次Web安全检测中,扫描器报告某接口在特定参数下返回500错误,同时WAF日志出现拦截记录,应用日志出现未捕获异常。三个角色给出三种解释:开发认为是WAF误拦,运维认为是应用自身缺陷,安全负责人认为是对抗性输入触发了规则。此时能确认的事实只有三条:请求到达过WAF、WAF产生过一条拦截记录、应用侧产生过一条异常。至于谁先谁后、谁导致谁,都还是解释,不是事实。
构造反证问题的第一步,就是把这三条事实写成不带因果词的中性描述,并标注每条事实的来源、时间戳精度和采集口径。如果WAF日志与应用日志的时间戳一个来自网关、一个来自容器,两者相差数秒,那么“WAF拦截导致异常”这个解释本身就缺乏可核对的基础,需要先对齐时钟再谈反证。
反证问题的关键不是追问“为什么”,而是问“如果这个解释成立,那么在不改变其他条件的前提下,应该还能观察到什么”。把上例的三种解释分别改写:
这三条预测互斥程度越高,反证问题越有价值。如果两条预测在任何结果下都同时成立,说明它们还没被拆到可区分的粒度,需要继续细化。
反证要靠对照,而不是靠更多日志量。假设情境中可以做的最小对照是:保留同一路径、同一方法、同一请求体,只把流量入口从“经WAF”改为“直连应用”,各发送一次,记录三处结果。这一步的动作是改变入口这一变量并重复同一请求,其结果是:
注意,单次对照只能排除或保留假设,不能证明因果。若直连后异常消失,还有别的合理解释,比如直连路径走了不同的后端实例、或请求在某一层被改写。因此对照结果要配合“该变量之外是否真的没变”的核查,否则反证问题本身就被污染了。
第三方估算的流量、搜索引擎侧报告与站内统计口径往往不同,同理,Web安全检测里的WAF日志、应用日志和扫描器报告也各有采集边界。某类记录归零,不能单独证明处理正确:可能是规则被调整、可能是流量路径改变、也可能是日志采集本身中断。判断时要问三个问题:这条记录由谁产生、在哪个环节产生、该环节是否仍被覆盖。只有把产生条件和覆盖范围都写清,反证得出的结论才站得住。
假设情境的收尾动作,是把三条预测、对照结果和仍存疑的解释写成一张核对项清单,交给不同角色分别确认自己负责的那一列。分歧不会因为一次对照就消失,但会从“各说各话”变成“对同一份可核对记录表态”,这已经足够决定下一步先查规则还是先查代码。