用途:為了在程序上對某些驗證接口上防止暴力破解,或者降低數(shù)據(jù)的壓力可以使用這個簡單的請求訪問限制。
注意事項:首先要TP5開啟緩存,服務器要有Redis,或者用tp5默認的文件緩存也可以。
use think\Cache;
/**
* 接口請求限制
* $time:一個完全相同的請求多長時間內(nèi)不能重復請求
* $limit:一段時間內(nèi)不能重復訪問相同接口的次數(shù)
*/
function requestAccess($time=3,$limit=30){
//獲取訪問用戶的IP
$ip=md5(request()->ip());
//獲取訪問的接口路徑
$path=request()->path();
//將IP和訪問的接口路徑md5加密成一個字符串,這樣子就代表同一個客戶訪問的接口。
$UV=md5($ip.$path);
//每個IP和接口每分鐘不能超過的次數(shù)
$cacheIp=Cache::get($UV)?:0;
if($cacheIp){
if($cacheIp>$limit){
return false;
}else{
Cache::inc($UV,1);
}
}else{
Cache::set($ip,1,60);
}
//將每個請求的IP地址、參數(shù)和路徑拼接成同一個用戶的一個完全相同的接口。
$post=json_encode(request()->post());
$name=md5($path.$post);
//每個相同的數(shù)據(jù)多少時間內(nèi)不能請求
$cache=Cache::get($name);
if($cache==$ip){
return false;
}else{
Cache::set($name,$ip,$time);
return true;
}
}
PS:以上代碼是自己瞎琢磨的,如果有更好的實現(xiàn)方式,歡迎大家分享交流。