PHP防止被重複請求接口的方法(網頁端簽名驗證的方法)
能夠採起簽名驗證的方式來 解決這個問題前端
1 time和隨機數都是PHP生成的顯示在前端
2 前端生成sign
3 進行每次請求的sign計數 這個是時候用redis自增 來判斷一共用了10次以上就返回 請從新刷新頁面ajax
因此參數必定要靜態 比方說根據能夠學習微信jssdk 用appid time 隨機數生成 這個必須每次刷新才能更新redis
<pre>
/
function getsigns()
{
$parameters = array();
$parameters['suijishu'] = getRandom(10, 5);
$parameters['time'] = time();
$sign = str_encrypt($parameters);
$newpar['suijishu']=$parameters['suijishu'];
$newpar['time']=$parameters['time'];
$newpar['sign']=$sign;
return $newpar;
}
//新版加密
function str_encrypt($parameters)
{json
unset($parameters['sign']);
ksort($parameters);
$parameters['key']='myk22';
$signPars = url_build($parameters);
$signPars = trim($signPars, '&');
return strtolower(md5($signPars));
}微信
//新版字符串拼接
function url_build($parameters)
{
$signPars = '';
foreach ($parameters as $k => $v) {
if (isset($v)) {
$signPars .= $k . '=' . $v . '&';
}
}
return $signPars;
}
</pre>網絡
客戶端 post的3個參數都是上面getsigns()生成的
<pre>
function ajaxpost() {app
$.post("/home/moban/signtest", {
"suijishu":suijishu,
"time":time,
"sign":sign,
},
function (data) {
if(data.success==1){dom
}else {
alert('網絡繁忙');
}post
}, "json");
}
</pre>學習
服務端
<pre>
function verifys(){
$parameters['suijishu']=$_POST['suijishu'];
$parameters['time']=$_POST['time'];
$parameters['sign']=$_POST['sign'];
if(!verify($parameters)){
echo json_encode(array('success'=>0,'msg'=>'驗證簽名失敗'));
exit();
}
}
</pre>
驗證下就行了
ps:另外 不要js生成sign 由於js代碼都是暴露的 也不要經過ajax請求生成sign 這樣就沒意思了。。
2 採起驗證碼方式