之前,我们为接口做了验证系统,但是验证系统有可能被暴力破解,今天,我们就尝试着为我们的接口做一个IP黑名单,阻止失败尝试过多的IP访问我们的接口:

首先,既然要做IP黑名单,我们就得获取用户的IP地址

$_SERVER["HTTP_CLIENT_IP"];

再把之前用于判断签名是否正确的if语句稍作修改

if($sign != SIGN){
    $handle = fopen("blacklist", "a");
    if ($handle) {
        fwrite($handle,$_SERVER["HTTP_CLIENT_IP"] . "\n");
        fclose($handle);
    }
    die("forbidden"); 
}

这样我们就可以记录试图访问者的IP了

那怎么判断当前访问者是否在黑名单中呢?我们需要在此之前加上一句:

$ip=$_SERVER["REMOTE_ADDR"]; 
$ban=file_get_contents("blacklist"); 
if(stripos($ban,$ip)){ 
    die("你的IP:$ip,已经被列入黑名单");
}

先来解释一下以上代码的意思

$ban=file_get_contents("blacklist");

此句获取文件blacklist中的所有数据,存入变量$ban中

stripos($ban,$ip)

此句是用于获取$ip于$ban中所出现的位置,也就是说,如果$ban中存在$ip,那么即会返回一个>0的数字,而在if语句中,除0以外的数字均为真,所以当$ip在黑名单中存在时,便会执行

die("你的IP:$ip,已经被列入黑名单");

当然,你的blacklist的最前面得加上点东西,比如说BEGIN:

完整代码如下

<?php
/*
用法说明:
请求http(s)://domain.com/api.php?q=需要计算的内容&sign=secret
返回值:[“md5”]
*/
$ip=$_SERVER["REMOTE_ADDR"];
$ban=file_get_contents("blacklist");
if(stripos($ban,$ip)){
    die("你的IP:$ip,已经被列入黑名单");
}
define('SIGN','这里填入你的secret');
$sign=$_GET["sign"];
if($sign != SIGN){
    $handle = fopen("blacklist", "a");
    if ($handle) {
        fwrite($handle, $ip . "\n");
        fclose($handle);
    }
  	die("forbidden");
}
$q=$_GET["q"];
$result = array(
    md5($q)
    );
echo json_encode($result);
?>

至此,可以说我们的接口已经基本成型了

打赏 赞(0)
支付宝二维码图片

支付宝扫描二维码打赏

发表评论

电子邮件地址不会被公开。

Scroll Up