尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
API 权限验收:用 Python 检查白名单配置,再验证允许与拒绝
一个服务从门户目录消失后持有旧链接或 API 凭证的程序还能不能调用它只看页面回答不了这个问题。目录控制的是展示凭证的调用范围需要由服务端鉴权并通过受控请求验证。本文给出一个只依赖 Python 标准库的离线示例先检查白名单配置生成允许和拒绝的验收用例再说明怎样补齐服务端证据。代码不联网、不创建凭证也不消耗 API 额度。1. 先把两个集合写清楚假设有三个虚构的 API 资源 A、B、C门户目录展示 A、B。测试凭证的目标调用范围是 A、C。待验收的资源包括 A、B、C。这会产生三类有用的用例A 可见且在范围内B 可见但在范围外C 不可见但在范围内。B 用于检查“看到入口不等于获得调用权限”C 用于检查“隐藏入口不等于撤销已有授权”。这里的“在范围内”只描述权限范围这一项条件。账号归属、凭证有效期、服务开通状态和额度等条件仍可能导致请求失败不能把它直接写成“必定调用成功”。2. 不要猜空白名单的含义不同接口对字段缺失、null、空数组[]的定义可能不同可能不限制、拒绝全部、继承默认值也可能直接报错。应先读目标接口的当前定义再决定请求如何构造。下面的本地检查器采取一个明确的团队规则既然本次要验收“明确限制了范围的凭证”允许列表就必须非空。它会拒绝空列表要求填写者先澄清意图。这是本地验收规则不是对任何远端 API 空值语义的推断。示例假设目标系统使用 UUID 形式的 API 资源标识。不要把模型名称、界面标题或应用 ID 填入这个字段如果实际系统使用另一种标识格式应替换对应校验规则。3. 可直接运行的离线示例保存为permission_matrix.py使用 Python 3 运行。三个 UUID 都是虚构占位值不对应真实服务。import json from uuid import UUID def normalize_ids(values, *, allow_emptyFalse): if not isinstance(values, list): raise ValueError(IDs must be a list) if not values and not allow_empty: raise ValueError(explicit scope must not be empty) result [] seen set() for index, value in enumerate(values): if not isinstance(value, str): raise ValueError(fitem {index} must be a string) try: parsed UUID(value.strip()) except ValueError: raise ValueError(fitem {index} is not a UUID) from None if parsed.int 0: raise ValueError(fitem {index} is a nil UUID) normalized str(parsed) if normalized not in seen: seen.add(normalized) result.append(normalized) return result def build_matrix(visible_ids, allowed_ids, candidate_ids): visible set(normalize_ids(visible_ids, allow_emptyTrue)) allowed set(normalize_ids(allowed_ids)) candidates normalize_ids(candidate_ids) return [ { resource_id: resource_id, catalog_visible: resource_id in visible, scope_expectation: ( in_scope if resource_id in allowed else out_of_scope ), actual_result: not_tested, } for resource_id in candidates ] if __name__ __main__: A 11111111-1111-4111-8111-111111111111 B 22222222-2222-4222-8222-222222222222 C 33333333-3333-4333-8333-333333333333 matrix build_matrix([A, B], [A, C], [A, B, C]) print(json.dumps(matrix, ensure_asciiFalse, indent2))运行命令python3 permission_matrix.py输出包含三行用例A、B、C 的scope_expectation分别是in_scope、out_of_scope、in_scopecatalog_visible分别是true、true、false。每行的actual_result都保留为not_tested因为程序只生成验收计划没有访问服务端。normalize_ids会把可解析的 UUID 统一为带连字符的小写形式并按首次出现的顺序去重。格式合法不代表资源存在也不代表该账号有权使用它这些信息仍需在目标系统核对。4. 用边界输入检查本地规则把下面的代码另存为同目录下的test_permission_matrix.py。这些测试验证的是本地输入检查与用例生成不验证远端鉴权。import unittest from permission_matrix import build_matrix, normalize_ids class PermissionMatrixTest(unittest.TestCase): def test_rejects_ambiguous_or_invalid_scope(self): bad_inputs [ None, [], not-a-list, [None], [123], [], [not-a-uuid], [00000000-0000-0000-0000-000000000000], ] for value in bad_inputs: with self.subTest(valuevalue): with self.assertRaises(ValueError): normalize_ids(value) def test_normalizes_and_deduplicates(self): resource_id abcdefab-cdef-4abc-8def-abcdefabcdef values [resource_id.upper(), resource_id ] self.assertEqual(normalize_ids(values), [resource_id]) def test_catalog_and_scope_are_independent(self): a 11111111-1111-4111-8111-111111111111 b 22222222-2222-4222-8222-222222222222 c 33333333-3333-4333-8333-333333333333 rows build_matrix([a, b], [a, c], [a, b, c]) self.assertEqual( [(r[catalog_visible], r[scope_expectation]) for r in rows], [(True, in_scope), (True, out_of_scope), (False, in_scope)], ) self.assertTrue(all(r[actual_result] not_tested for r in rows)) self.assertEqual(normalize_ids([], allow_emptyTrue), []) if __name__ __main__: unittest.main()运行python3 -m unittest discover -v应看到 3 个测试方法通过。第一个方法包含 8 组异常输入分别检查类型、空值、错误格式和全零 UUID。5. 怎样把计划变成服务端验收证据先核对 API 标识与目标服务的映射再由有权限的负责人创建专用测试凭证设置预定范围、有效期和小额用量限制。不要使用客户生产凭证也不要为了触发上限而故意耗尽预算。然后分别执行范围内和范围外用例。范围内用例需要使用文档规定的有效最小请求范围外用例也应满足其他必要条件否则可能先遇到格式错误或余额不足根本没有检验到权限范围。测试方式须限于自己获授权的系统与资源。不要只凭一个 HTTP 状态码判断测试通过。例如一个失败响应可能来自未登录、资源不存在或网关错误而非预期的范围限制。结合对应接口的错误码、错误说明与有权查看的服务端记录确认真正触发的检查项。可以为每个用例补充以下记录用例编号与资源代号 测试环境与凭证名称不填密钥 目录是否可见 预期范围in_scope / out_of_scope 前置条件核对账号、有效期、服务状态、额度 请求时间与时区 实际响应状态及已脱敏错误码 可提供的请求或任务标识 证据来源与核对人 结论符合预期 / 不符合预期 / 证据不足 / 未测试对于异步接口如果已经返回任务标识应查询原任务的状态。提交超时或等待过久本身不能证明任务未创建不应据此反复提交新的付费任务。记录和截图中不要包含完整 API Key、Authorization 请求头、密码、验证码或客户原始输入。结果 URL、重定向 Location 和回调地址也需要检查带签名或令牌的链接可能授予访问权。6. 把验收结果与后续处理一起交接本地检查通过只说明验收输入和用例结构符合本地规则远端权限验收是否完成取决于实际请求和证据。尚未运行的用例继续保留“未测试”不能因为目录显示正确就改成“通过”。验收结束后由有权限的负责人处理只用于测试的凭证并按系统支持的方式确认停用结果。交接时同时写明配置版本、已验证的用例、尚未验证的部分和负责人避免下一位同事把一张配置截图误当成完整的授权测试报告。
RELATED

相关推荐

离散元分析(DEM)和机器学习(Machine Learning, ML)

离散元分析(DEM)和机器学习(Machine Learning, ML)

文章目录1. 机器学习辅助2PFV-DEM参数标定2. GNN DEM:最值得作为创新点3. AI预测非饱和土土水特征曲线4. 深度学习识别SEM/MIP细观结构 → DEM胶结模型5. 论文最推荐的AI路线第一阶段第二阶段第三阶段(创新)第四阶段最终可以形成的论文题目方…

📅 2026/10/15 3:57:51
第五章 检索增强与知识库

第五章 检索增强与知识库

前面四章已经让 Agent 具备了工具调用、多步规划、错误恢复和记忆能力。但它还有一个重要限制:模型只能依靠训练数据和当前上下文回答问题。如果用户问的是公司内部文档、产品手册、私有知识库,或者最近刚发生的事件,模型就可能答不上来&…

📅 2026/10/15 3:57:51
东北农业大学转专业怎么申请?2025级条件、流程和热门学院考核一文讲透

东北农业大学转专业怎么申请?2025级条件、流程和热门学院考核一文讲透

东北农业大学2025级本科生集中转专业安排在2026年春季进行,3上旬起线上填报,每名学生限报1个专业志愿。申请人须未受学校纪律处分、已修课程全部及格,补考及格也可参加;通过学校资格审核后,再按目标学院规则参加考核。…

📅 2026/10/15 3:57:51
MORE NEWS

更多资讯

📰

PS5实用优化手册:屏幕、网络、外设与存储的适配

看到“AnyPS5”这个题目,我先说个结论:它不是系统级破解,也不是什么魔改固件的黑话。我花了三周时间,把手里这台PS5从头到脚折腾了一遍,最后得出的理解是——所谓“Any”,指的是一台主机在任何日常条件不算…

📰

浅析Tarjan:从强连通分量到割点桥的图论算法全解析

“浅析 Tarjan”——这标题一看就是算法老手写给新手的作战笔记。熟悉图论的人都知道,Tarjan 这个名字几乎等价于“强连通分量”“割点”“桥”“最近公共祖先”,一个基于深度优先搜索的框架,把一堆看起来毫不相干的图论问题统一收编。你要是…

📰

GitHub Trending日榜拆解:三个值得深挖的开发者工具

晚上十一点多,我照例点开 GitHub Trending,把 2026-10-12 的日榜从头到尾过了一遍。和上周那种清一色“大模型套壳”的场面不太一样,今天榜单里 AI 相关的项目明显退了一截,反而冒出不少针对开发者日常痛点的“小玩意儿”&#xf…

📰

读懂DDR2数据手册:MT47H64M16HR时序参数解析与FPGA配置实战

简介:本资源为美光(Micron)官方发布的MT47H64M16HR DDR2 SDRAM芯片完整数据手册PDF,面向嵌入式系统工程师、硬件开发人员及TI C6455 DSP平台开发者,用于指导该内存芯片的选型、电路设计、时序配置与可靠性验证。手册详…

📰

单片机电容触摸按键实战:从RC充放电到量产参数调优

简介:本资源是一份面向单片机初学者与家电控制开发者的电容感应式触摸按键技术详解文档,聚焦STC系列单片机(如STC12C4052AD)的纯软件实现方案,解决专用芯片成本高、维修难、标准不统一等实际工程痛点。文档深入剖析玻璃…

📰

查询销帮帮产品分类并落入轻易云集成平台:单策略同步实战教程

这个策略解决什么问题在零售与分销一体化的场景里,产品分类是后续商品同步、库存口径、销售统计的「地基」。一次实际项目中,某零售企业同时使用聚水潭管商品、用销帮帮管产品主数据与销售流程。最早他们让两边各自维护一份分类表,结果三个月…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬