proxy 安全依赖 handler 中的主动校验:需白名单控制属性访问、类型/范围验证写入值、角色校验敏感方法调用;必须用 reflect 执行默认行为;显式拦截原型与元属性;限制代理暴露面并保护 target。

Proxy 代理对象本身不自带安全机制,拦截器的安全性完全取决于 handler 中的逻辑设计。关键不是“防止 Proxy 被滥用”,而是确保你在 get、set、apply 等拦截方法中主动做校验、过滤和权限控制。
明确目标属性与操作边界
避免 handler 泛化处理所有属性或方法调用。应预先定义哪些属性允许访问、哪些值允许写入、哪些函数允许执行。
- 在
get中检查property是否属于白名单,非授权字段返回undefined或抛错 - 在
set中验证value类型、格式(如邮箱正则)、范围(如年龄 0–150),非法值直接拒绝并返回false - 对敏感方法(如
deleteAccount)在apply中强制校验用户角色或 token 有效性
始终使用 Reflect 执行默认行为
不要绕过 Reflect.get()、Reflect.set() 等原语直接操作 target,否则可能破坏原型链、忽略 accessor、遗漏不可枚举属性等隐式行为。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 错误写法:
return target[prop]—— 忽略 getter、proxy 链、receiver 绑定 - 正确写法:
return Reflect.get(target, prop, receiver)—— 保持语义一致性 -
set拦截必须返回布尔值,推荐统一用Reflect.set(...)的返回结果
防御原型与元属性篡改
攻击者可能通过 __proto__、constructor、toString 等内置属性绕过逻辑。需在 handler 中显式拦截关键元操作。
- 重写
getPrototypeOf和setPrototypeOf,禁止修改原型链 - 在
has和ownKeys中过滤以_、#开头的私有属性名 - 拦截
getOwnPropertyDescriptor,隐藏敏感 descriptor(如writable: false的配置)
限制代理暴露面与生命周期
Proxy 对象一旦创建就可被任意代码持有,需从使用端降低风险。
- 避免将 proxy 直接挂到全局或长期缓存中;用完即弃,或封装在闭包内限制作用域
- 对传入的
target做浅克隆或冻结(Object.freeze()),防止外部绕过 proxy 修改原始数据 - 如用于 API 客户端,可在
apply中统一注入 auth header,并拒绝未签名的请求










