接口鉴权
接口鉴权是指后台接口(包括自建后台接口与云函数)在被调用时需要对本次接口调用进行权限校验,否则容易发生越权行为。比如商品删除接口,后台在收到请求时应当校验调用者的身份信息(如 openid、IP 地址、开发者自定义的登录态信息等),只有指定用户才可以通过校验进行删除。
越权通常分为平行越权和垂直越权:
平行越权
平行越权是指相同角色之间的越权。A1 和 A2 都是普通用户,A1 通过请求后台接口 userinfo.php?id=A1 来获取用户 A1 自己的信息。如果 userinfo.php 没有进行权限校验,用户 A1 把请求改为 userinfo.php?id=A2 便可以获取到 A2 用户的信息,造成 A2 用户信息的泄露。
垂直越权
垂直越权是指不同角色之间的越权。B1 是管理员,B2 是普通用户。管理员 B1 通过请求后台接口 getalluserinfo.php 可以获取所有注册用户的信息。如果 getalluserinfo.php 没有进行权限校验,B2 用户也可以请求 getalluserinfo.php 来获取所有注册用户的信息,出现越权行为。
开发建议:
敏感数据、能力相关接口需要在后台进行鉴权。通常可校验 openid、IP 地址、自定义登陆态等信息。
鉴权逻辑应放在后台进行,不应在微信小程序前端以隐藏页面、隐藏按钮等方式来代替。参照原则4。
鉴权代码示例(仅供参考)
自建后台鉴权
function actionDelete(){ $item_id = $_POST["item_id"]; $openid = $_POST["openid"]; $ip = $_SERVER['REMOTE_ADDR']; $user_role = $_SESSION["user_role"]; if ($openid === "xxx" && $ip === "192.168.0.101" && $user_role === "admin") { // 进行删除操作 // ... return 0; } else { // 记录非法请求 // ... return -1; } }云函数接口鉴权
exports.main = async (event, context) => { const { OPENID, APPID, UNIONID } = cloud.getWXContext(); if (OPENID === "xxx") { // 进行删除操作 // ... } else { // 记录非法请求 // ... } }
代码管理与泄漏
当使用 git、svn 等版本管理工具时,会产生 .git 等目录。某些编辑器或软件也会在运行过程中生成临时文件。若这些目录或文件被带到生产环境,则可能发生源码泄漏。
使用微信小程序代码管理平台或 github 等第三方平台时需要注意项目权限,不要公开敏感、内部项目。
开发建议:
- 备份文件和版本管理工具产生的文件不要同步到 Web 目录下。
- 禁止外部访问 .git 等目录与文件。
- 在微信小程序代码管理平台等管理平台内配置适当的访问权限。