2011-07-21 51 views
0

我想阻止访问者每隔100分钟观看2到5分钟..如果用户在2到5分钟之间查看100页然后阻止用户,如果用户在6分钟内查看100视图, t阻止并重置计数器。如何暂时阻止用户

我已经创建了计数器脚本,但我有创建功能,可以阻止2-5薄荷访客之间的问题。

我需要帮助解决这个问题......我尝试创建一个if条件,但没有运气..请帮我...

$sb_current_time = date("Y-m-d H:i:s", Time()); 
/////////////////// Cookies Encryption ////////////// 
function encrypt($text) 
{ 
    $key = "E4HD9h4DhS23DYfhHemkS3Nf"; // 24 bit Key 
    $iv = "fYfhHeDm"; // 8 bit IV 
    $bit_check = 8; 
    $text_num = str_split($text, $bit_check); 
    $text_num = $bit_check - strlen($text_num[count($text_num) - 1]); 
    for ($i = 0; $i < $text_num; $i++) { 
     $text = $text . chr($text_num); 
    } 
    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', ''); 
    mcrypt_generic_init($cipher, $key, $iv); 
    $decrypted = mcrypt_generic($cipher, $text); 
    mcrypt_generic_deinit($cipher); 
    return base64_encode($decrypted); 
} 
//////////////// Encription end ///////// 

////// Cookies decription ///// 
function decrypt($encrypted_text) 
{ 
    $key = "E4HD9h4DhS23DYfhHemkS3Nf"; // 24 bit Key 
    $iv = "fYfhHeDm"; // 8 bit IV 
    $bit_check = 8; 
    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', ''); 
    mcrypt_generic_init($cipher, $key, $iv); 
    if ($encrypted_text != "") { 
     $decrypted = mdecrypt_generic($cipher, base64_decode($encrypted_text)); 
     mcrypt_generic_deinit($cipher); 
     $last_char = substr($decrypted, -1); 
     for ($i = 0; $i < $bit_check - 1; $i++) { 
      if (chr($i) == $last_char) { 
       $decrypted = substr($decrypted, 0, strlen($decrypted) - $i); 
       break; 
      } 
     } 
    } 
    return $decrypted; 
} 
///////// Coookies decription end ///////////////// 


//$sb_check_ban_time = date($sb_current_time, strtotime("+20 minute")); 
if ($_COOKIE['spamer_check_time'] == "") { 
    setcookie('spamer_check_time', encrypt(time())); 
} 
function time_deff($date2) 
{ 
    $date1 = time(); 
    //sleep(2000); 
    // $date2 = decrypt($_COOKIE['spamer_check_time']); 
    //echo $date2; 
    $mins = ($date1 - $date2)/60; 
    //echo $mins; 
    return $mins; 
} 


//$sb_cookie_expiration = time() + 1200; 
//echo $sb_cookie_expiration; 
if ($_COOKIE['view2'] != "") { 
    $explod = explode("-", decrypt($_COOKIE["view2"])); 
} 
$i_print = $explod[0]; 
// $i2=$explod[1]; 
//echo $i2; 
$i = 1 + $i_print; 
setcookie("view2", encrypt($i . "-123456789")); //// Need to add extra bit to block unwanted text and secure the cookes more.. 
// 
$i = $i++; 
// echo $i_print; 
    //echo "empty".decrypt($_COOKIE["spamer_check_time"]); 
$spammer_blocker = decrypt($_COOKIE["spammer_blocker"]); 
// or $spammer_blocker=="" 
$mins = time_deff(decrypt($_COOKIE['spamer_check_time'])); 
    $diff_time = .1; /// User BLock Time 
    if ($mins >=1 or $mins <=2) { 
    $block_user=1; 
    } elseif ($mins >= 2.1) { 
    $block_user=2; 
    } else { 

    } 
/* if (.2>$mint) { 
    // echo "not done"; 
    $block_user=0; 
    } elseif (.2 <= $mint) { 
    echo "block User"; 
    $block_user=1; 
    } elseif ($mins>=1) { 
    echo "reset cookies"; 
    $block_user=2; 
    }*/ 
if ($block_user==1 and $i_print >= 15) { 

    if ($spammer_blocker == "") { 
     setcookie("spammer_blocker", encrypt(time())); 
     header('HTTP/1.1 403 Forbidden'); 
      $time_rev = $diff_block_time - $diff_time; 
      $round_time = round($time_rev, 2); 
      $time_reverse = str_replace('-', '', $round_time); 
      echo "Wait " . $time_reverse . " Minuts before using this site.."; 
     exit(0); 
    } else { 

     //$sb_check_ban_time = $spammer_blocker; 
     $diff_block_time = time_deff($spammer_blocker); 
     //echo $diff_block_time; 
     //$sb_check_ban_time = date($spammer_blocker, strtotime("+1 minute")); 
     if ($diff_time <= $diff_block_time) { 
      /// echo "Delete the IP and cookies"; 
      setcookie("spammer_blocker", ""); 
      setcookie("view2", ""); 
      setcookie("spamer_check_time", ""); 
     } else { 
      //echo "Still Block"; /// echo "Still Block"; 
      header('HTTP/1.1 403 Forbidden'); 
     // echo "IP Block for Spaming wait few mint"; 

      $time_rev = $diff_block_time - $diff_time; 
      $round_time = round($time_rev, 2); 
      $time_reverse = str_replace('-', '', $round_time); 
      echo "Wait " . $time_reverse . " Minuts before using this site.."; 
    exit(0); 
     } 

    } 
} elseif ($block_user==2) { 
    setcookie("spammer_blocker", ""); 
      setcookie("view2", ""); 
      setcookie("spamer_check_time", ""); 
      echo "cookies reset"; 
} else { 

    } 
+0

什么是*薄荷* ?? – 2011-07-21 21:24:44

+0

什么是“薄荷”在这种情况下? –

+1

薄荷是分钟。此外,我建议你不要将它存储在cookie中 - 作为它可以很容易地被清除。可能推送到服务器上的会话... – MunkiPhD

回答

3

首先,你要知道他们是谁...

对于普通用户,你可以依靠饼干。但是,如果你与施虐者有问题,那么他们会忽略你阻止他们而不发送cookie的企图。

有不同程度的认识“谁”是某人。在URL

  1. ID
  2. 饼干
  3. IP地址

而且他们都可以用不同层次的diffulculty克服...

  1. 太简单了(只是恶搞一个不同的ID等......)
  2. 饼干是一样的#1
  3. IP地址是很难克服的,除非你有一个僵尸网络或类似

对于你的情况,因为它是你得到完成你所寻找的唯一合理的方式,你应该会阻止IP地址。

-

接下来,您需要能够跟踪他们的连接。 Linux中的iptables有一种方法可以在达到certian阈值后跟踪特定分钟数的连接数和阻塞数。

只使用PHP,你需要记录每个命中,以及该命中的IP地址。一个SQL数据库将是这样做的更有效的方法之一。

如果你不关心历史,然后简单地(MySQL的):

INSERT INTO HitTable SET IP=..., Visits=1 
ON DUPLICATE KEY UPDATE Visits=Visits+1 

后台的crontab可以运行这样每分钟的查询?

UPDATE HitTable SET Visits = Visits - 10 
DELETE FROM HitTable WHERE Visits < 1 

最后,当访问者访问,就可以检查数据库表

SELECT Visits<100 WHERE IP=... 

,如果返回true,让他们在,其他人阻止他们。

希望这会有所帮助。

+2

那些谁做出每一个新的请求IP?或者当几十或几百个人共享一个IP时的其他方式? – 2011-07-21 21:32:38

+0

@Gahooa:你给我最好的想法是什么,我想用PHP/MySQL的..但是知道我只确定使用cookie ..我知道如果任何人删除cookie或块cookie可以轻松绕过安全..但我需要一个解决方案,我可以轻松阻止用户在2-5分钟内查看100页..如果他/她没有,然后不阻止,并开始检查用户的时间和页面查看..正如我在我的queastion问。 (BTW对不起我的英语..我是巴基斯坦...) – Muhammad

+0

@穆罕默德:Cookie只是不可靠的,因为敌人根本不会发送cookie,除了新的访问者你不会知道它们。 – gahooa

1
  1. 存储在cookie中的超时值将是用户更改/删除cookie绝对微不足道
  2. 将它存储在会话变量中会更可靠一些,但同样 - 用户可以删除会话cookie,获取新会话并重新开始阅读。

话虽这么说,你会做这样的事情:

<?php 

session_start(); 

if (user_should_be_blocked()) { 
    $_SESSION['blocked_start_time'] = time(); 
    header("Location: timeout.html"); 
} 

if ($_SESSION['blocked_start_time'] > (time() - 300)) { 
    header("Location: timeout.html"); 
} 

// got here, must not be blocked and/or timeout has expired 
$_SESSION['blocked'] = false; 
$_SESSION['block_start_time'] = null; 

.... continue on 
+0

我将使用mysql来验证用户IP ..现在我只是创建的功能,可以请阻止几个薄荷用户。 – Muhammad

1

我会用头功能可按他们重定向到另一个页面,要么是空或只是少bankwidth密集(假设这就是为什么你无论如何,这是做这个)。像...

if ($block_user == 1) 
    header("Location: blockPage.php"); 

在所有页面的顶部你需要阻止。

+0

请记住,在将任何输出实际推送到页面之前,必须调用标题函数。它不一定是第一个PHP函数,但它必须在任何回声或打印之前出现。 – Heckman

+0

首先,我需要检查时间是否正常,如果使用介于2-5和100页之间,则$ block_user = 1; ..请检查我上面的代码,我编辑小时前..我只需要一个解决方案,因为我可以很容易地确定使用时间... – Muhammad

+0

我只是想念类型.. USE是USER – Muhammad

0

编辑:其实,细想起来,(2)当然是没有必要的,如果2人或2台电脑都记录在他们只会消耗其获分配的意见较快量..

你可以这样做:

  1. 用户需要登录才能看到页面。
  2. 您不允许使用不同的会话登录两次相同的用户(名称)。
  3. 您存储每个用户的计数,而不是每个会话或每个ip /任何。

(2)对于默认的基于文件的会话是不可能的。需要自定义数据库或其他永久性存储解决方案,您可以在其中扫描当前用户标识的其他会话标识。在数据库中,您只需存储用户标识字段,还可以构建定制的memcached解决方案等。为防止用户被锁定在会话之外,他们不再有我的解决方案,总是要销毁用户拥有的任何旧会话他们即刻登录。实际上,如果尝试使用多个会话/ ips,他们将不得不再次登录,从而使以前的会话失效。

(3)再次时间戳+用户ID +计数(在MySQL的情况下INSERT INTO tablename (user_id,time,count) VALUES (<id>,NOW(),1) ON DUPLICATE KEY UPDATE count=count+1想到可以轻松地增加观看次数一些持久性存储。

而且在每个视图再次查询数据库,再如何许多观点的访问者有最后的X分钟