如何安全地将WordPress用户名信息发送至第三方站点并实现访问控制
方案可行性分析与实现建议
原有方案的风险
你考虑的客户端传用户名的方案确实存在严重安全问题,完全称不上过度担忧:所有客户端可控的参数都没有可信度,攻击者只要打开浏览器控制台就能轻易构造携带任意用户名的请求,甚至不需要抓包,属于只要有人想进你的站点就能随便绕过的低门槛攻击,绝对不能用。
可落地的安全实现方案
全程走服务端不可篡改的签名校验逻辑,不需要改现有站点的架构,开发量极小:
- 首先在WordPress侧生成不可伪造的身份令牌
直接在WordPress主题的functions.php中加代码即可:给每个已登录的用户生成临时令牌,令牌包含三个字段:当前登录用户名、当前时间戳、HMAC-SHA256签名。签名的生成规则是用只有你WordPress和Meteor服务端知道的私密字符串作为秘钥,对用户名+时间戳做哈希计算,最终令牌拼接格式参考:用户名.时间戳.签名值。可以给令牌加5~10分钟的有效期,足够用户点击跳转使用。 - 调整WordPress侧的跳转逻辑
不需要用表单POST,直接把按钮的跳转链接改成xyz.com?token=生成的令牌,点击后新标签页打开即可。 - Meteor服务端做校验
xyz.com的Node服务端收到请求后,首先拆分拿到的令牌:先判断时间戳是否在有效期内,过期直接拒绝;再用相同的秘钥对令牌里的用户名和时间戳重新计算HMAC签名,和令牌携带的签名做比对,完全一致才是合法请求,直接取出用户名给后续业务使用,不一致直接返回403拒绝访问。 - 可选辅助加固:可以在Meteor服务端增加
Referer请求头校验,仅允许来源为你的WordPress站点域名的请求通过,进一步降低令牌泄露后被盗用的风险,注意该规则仅可作为辅助校验,不能替代签名逻辑。
内容的提问来源于stack exchange,提问作者Patrick Abbey
相关产品推荐
相关产品推荐

