怎么校验接口请求来源?

在给WEB-APP提供接口时,如何判断接口是网站通过ajax发过来的,而不是通过其他方式非法调用的。
已邀请:

zkbhj - 凯冰科技站长

赞同来自:

方法一:利用$_SERVER['HTTP_REFERER']接口校验请求来源
 
简而言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
 
PHP的$_SERVER['HTTP_REFERER'],记录了http的请来源地址。换一句话说就是可以得到链接/提交当前页的父页面URL。若不是从父页面提交过来的;比如是浏览器直接访问url地址则isset($_SERVER['HTTP_REFERER'])为假。若是ajax请求,$_SERVER['HTTP_REFERER']为发出ajax请求的页面url地址。利用这一特性我们就可以在写PHP接口的时候;为了安全性(防止其它网站来请求我们的接口),来做"请求来源地址"的校验。
 /**
* 网站请求,校验来源地址
*
* @author wen gong<bestphper@126.com>
* @param string $refWhiteList 域名白名单
* @return bool
*/
function checkrefer( $refWhiteList ){
//判断refer校验开关,是否开启
if( !defined( 'ENABLE_CHECKREFER' ) || ENABLE_CHECKREFER == false ){
return true;
}else{
if(isset($_SERVER['HTTP_REFERER'])){
$ref = $_SERVER['HTTP_REFERER'];
if( strpos( $ref, 'http://' ) !== 0 && strpos( $ref , 'https://' ) !== 0 ){
$ref = 'http://' . $ref;
}
foreach ( $refWhiteList as $item ){
if( preg_match( "/{$item}/i" , $ref ) ){
return true;
}
}
return false;
}else{
return false;
}
}
}

//使用实例
if( checkrefer( $refWhiteList ) ){
//请求来源合法
$re['msg']='success';
echo $_GET['callback'].'('.json_encode( $re ).')';
}else{
//请求来源非法
$re['msg']='error';
echo $_GET['callback'].'('.json_encode( $re ).')';
}

要回复问题请先登录注册