我的每个编码和算法设置都可以,但需要您的建议,无论我是否进入这个方向。我有两个需要建议/审查的问题。
关注点一:算法
在登录页面中,我们不使用谷歌验证码。但我们有以下逻辑来控制洪水和封锁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/