举个例子:
a.com //我的网站 b.com //其他网站 a.com/api/getUserName //我的网站的API,返回user表的所有username
在没有对接口进行权限控制之前,b.com在其站内请求a.com/api/getUserName也能获得数据。
现在我不想让b.com可以请求这个接口拿到数据,度了一下。了解了两个方法:
1.验证referer,据说这个可以被伪造,所以没用;
2.token,说是请求的时候加几个参数:a.com/api/getUserName?a=1&b=2&token=xxxxxxxxxxxxx,
然后服务器将a和b再加上一个密钥进行加密得到一个字符串与客户端传过来的token进行对比即可。
但是其他人可以在访问a.com的时候拿到这样的请求链接,直接复制a.com/api/getUserName?a=1&b=2&token=xxxxxxxxxxxxx,放在b.com的代码里面向a.com的这个api发请求拿到数据?
还是我对这个方式理解有误? 求大牛指点。
如果光是网站作区分,基本都是可以通过伪造成你的网站数据来访问API的,要想对API进行权限控制,像微信SDK这类需要在其平台上成为开发者,拿到独有的KEY和SECRET,然后生成token...这样就可以了
但是其他人可以在访问a.com的时候拿到这样的请求链接,直接复制a.com/api/getUserName?a=1&b=2&token=xxxxxxxxxxxxx,放在b.com的代码里面向a.com的这个api发请求拿到数据?
题主这个你理解错了,任何人在请求你的接口之前,你需要跟他确认身份,如果该身份是被认可的才生成token,请求借口的时候再次验证token,通过才能请求借口。PHP可以参考JWT
搜索 防跨站攻击 CSRF( Cross-Site-Request-Forgery)
我们是这样做的, 给a和b不同的key, 你传参数的时候需要, 告诉我是a,还是b(parter=1, parter=b),然后校验签名, 不同的parter, 签名是不同的, 然后根据这个来判断用户是a,还是b, 然后到数据库里面判断是否有权限进行当前操作