PHP处理用户登录的IP封锁和泛洪控制的最佳实践

标签 php mysql .htaccess

我的每个编码和算法设置都可以,但需要您的建议,无论我是否进入这个方向。我有两个需要建议/审查的问题。

关注点一:算法

在登录页面中,我们不使用谷歌验证码。但我们有以下逻辑来控制洪水和封锁IP:

  • 对于每个非用户失败的登录尝试,我们将其 IP 以及 IP 和时间存储在 mysql“flood”表中。
  • 通过这种方式,我们可以存储并检查过去 2 小时内最多 20 次尝试。如果发生,那么我们删除与该 IP 相关的所有洪水记录并将该 IP 添加到“block_ip”mysql 表中。

对于我们的每个 PHP 页面(30+),我们调用以下 IP 阻止函数将被阻止的 IP 访问者重定向到“block.php”页面。

function block_ip(){
$mysqli_2 = new mysqli(HOST, USER, PASSWORD, DATABASE);
    if ($mysqli_2->connect_error) {
    header("Location: ../error.php?err=Unable to connect to MySQL");
    exit();
    }
   $stmt_block_ip= $mysqli_2->prepare("SELECT b_ip FROM block_ip");   
   $stmt_block_ip->execute();
   $stmt_block_ip->store_result();
   $stmt_block_ip->bind_result($block_iip);
   while( $stmt_block_ip->fetch()){
  if(strpos($_SERVER['REMOTE_ADDR'],$block_iip) === 0)
    {
       header("Location: ../block.php");
        exit();
    } 
   }
  $stmt_block_ip->close();
 }
  • 下一步的管理计划是,如果阻止 IP 的总数 > 50,则通过复制所有阻止的 IP 并要求服务器服务提供商将其添加到 .htaccess 以重定向它们来清除表格。

Is this idea is good? or should I keep it on blocked IP table, but that might slow the page loading, isn't it? as for a long list of blocked IP's? Any better idea?

关注点二:算法

在忘记用户名.php 和忘记密码.php 页面上,我们有谷歌验证码。所以我们没有在这里添加任何洪水控制算法,只是对于非用户尝试,我们只是将他们重定向到注册页面。

For the security concern is this approach is okay?

最佳答案

我的第一个问题似乎已经通过 WillParky 建议得到解决:IP block 检查下面的代码应该更快地完成。我想我不需要使用 .htaccess 并到处传输被阻止的 IP。

  function block_ip(){
  $viewer_ip = $_SERVER['REMOTE_ADDR'];
   $mysqli_2 = new mysqli(HOST, USER, PASSWORD, DATABASE);
    if ($mysqli_2->connect_error) {
    header("Location: ../error.php?err=Unable to connect to MySQL");
    exit();
    }
  $stmt_block_ip= $mysqli_2->prepare("SELECT b_ip FROM block_ip WHERE b_ip = 
   ?"); 
  $stmt_block_ip->bind_param('s',$viewer_ip);
  $stmt_block_ip->execute();
  $stmt_block_ip->store_result();

 if($stmt_block_ip->num_rows == 1){
    {
     header("Location: ../block.php");
     exit();
   } 
 }
 $stmt_block_ip->close();
  }

关于PHP处理用户登录的IP封锁和泛洪控制的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46152435/

相关文章:

php - MySQL 加入案例语句

php - Composer 的自动加载没有类映射

php - 循环调度器填写 "byes"

php - 将用户限制在他们的个人资料页面

php - 使用 htaccess 将另一个域图像加载到我的域?

php - 在不使用验证码的情况下阻止垃圾评论

php - Laravel 和批量分配保护

MySQL - 全文索引搜索问题

php - .htaccess RewriteRule 保留 GET URL 参数

php - 如何防止通过 URL 直接下载和查看文件