比如a站点向b站点发起get请求,我怎么判断这个请求是不是a站点来的?
目前我知道的有$_server['http_referer']
但是$_server['http_referer']是可以伪造的,请求更好的解决方法
回复内容: 比如a站点向b站点发起get请求,我怎么判断这个请求是不是a站点来的?
目前我知道的有$_server['http_referer']
但是$_server['http_referer']是可以伪造的,请求更好的解决方法
如果只有 b 站在自己的控制范围内 ... 那么没有更好的办法 ...
http_referer 是 http 协议里面唯一用来标识用户来源的字段 ...
不过如果 a 站也在你的控制范围内 ... 你可以做一个协议来确认这个请求真的来自 a 站 ...
比如在每个 a 站给 b 站的请求上传递两个参数 ... 一个叫做 t 一个叫做 f ...
如果你收到的 $_get['f'] 等于 md5( $_get['t'] . 'secret_key' ) 的话就视为合法 ...
继续按照原来的逻辑处理这个请求 ... 否则直接将之丢弃掉 ...
如果不想加入两个参数 ... 也可以用一些 a 站可以获取的内容来作为 t 参与计算 ...
这是比较稳妥的两个站点之间标记身份的方法 ... 俗称指纹或者签名 ...
上面描述的一次盐化散列算法是比较简单的 ...
如果你需要安全性更高的传递 ... 也可以使用 rsa 一类更高强度的算法 ...
另外还有一种方法 ... 也需要 a 站在你的控制范围内 ...
比如目标链接是 http://b.ext/somelink ... 需要转换成 http://a.ext/go/somelink ...
然后在 a 站的后台处理这样链接的时候给 b 站的某个限定来源 ip 的地址发一条消息 ...
消息内容就是用户的 ip 浏览器和欲访问的地址 ...
然后 b 站如果紧跟着接到了这样的访问就视为是合法的 ... 否则丢弃 ...
恩恩基本就是这样啦 ...
在服务端目前是没有更好的方法了,因为http头部就那么点内容,很简单,只有这个字段是用来标记链接来源的。
a站发送和b站接收时:
1,先用一个字符串作为密钥$key = 'alsfjewoi212';分别放到a站与b站。
2,再把a站要get的数据$data与密钥相连并将md5值赋给$x = md5($data.$key);
3,将$x与$data同时get到b站。
4,b站接收时判断:
if($_get['x']!== md5($_get['data'].$key)) exit();
done.