PHP防止被重复请求接口的方法(网页端签名验证的方法) 可以采取签名验证的方式来 解决这个问题
1 time和随机数都是PHP生成的显示在前端 2 前端生成sign 3 进行每次请求的sign计数 这个是时候用redis自增 来判断一共用了10次以上就返回 请重新刷新页面
所以参数一定要静态 比方说根据可以学习微信jssdk 用appid time 随机数生成 这个必须每次刷新才能更新
<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) {
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() {
$.post("/home/moban/signtest", { "suijishu":suijishu, "time":time, "sign":sign, }, function (data) { if(data.success==1){
}else { alert('网络繁忙'); }
}, "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 采取验证码方式
|
请发表评论