Flood защита

Hous

Registered
Чудя се кое е по-добрата защита,да се направи сесия която да проверява преди колко време си презаредил страницата (примерно ако е по-често от 1 секнда - тоест държиш само f5 да те redirect към началната страница)
намерих примерен код:
Код:
 if (!isset($_SESSION)) {
         session_start();
 }

 if($_SESSION['last_session_request'] > (time() - 5)){
    if(empty($_SESSION['last_request_count'])){
        $_SESSION['last_request_count'] = 1;
    }elseif($_SESSION['last_request_count'] < 5){
        $_SESSION['last_request_count'] = $_SESSION['last_request_count'] + 1;
    }elseif($_SESSION['last_request_count'] >= 5){
            header("location: http://www.example.com/403.html");
            exit;
         }
 }else{
    $_SESSION['last_request_count'] = 1;
 }

 $_SESSION['last_session_request'] = time();

или има по-добър вариянт?

Идеята ми е някой който опита да държи рефреш да кажем повече от 10 рефреша направи на една страница за по малко от 5 секунди да му изписва съобщение и да го препраща към началната страница.
 
Ем освен сесия, друг лесен начин не се сещам. Между другото пробва ли го този код, че ме съмнява нещо. Според мен трябва преди

PHP:
if($_SESSION['last_session_request'] > (time() - 5))

да си правиш и една порверка с isset() щото при първото зареждане на страницата няма да ти е сетнато и ако си си пуснал нотисите ще ти изпищи че няма такъв индекс. Иначе става.
 
ID-то на сесията се запазва в бисквитка. Тоест достатъчно е просто бота, който те флуди да не си пази бисквитките
 
Друг вариант е, ако не ти е проблем да си товариш БДто със заявки и наистина ти е толкова важна тая защита, да си направиш една таблица, в която да записваш ИПто което посещава страницата и последното и посещение. И пак си правиш тая проверка.
 
Ето този код мисля че ще ти свърши повече работа:
Ако някои рефрешне страницата повече от веднъж в рамките на 5 секунди автоматично го засича и го блокира :)
можеш да си промениш времето от $floodtime = 5
Дано да ти свърши работа :)
И само създай още един файл flood.php или нещо друго където да записва IP и часа на флуида :)
Поздрави и лек и успешен ден :)
PHP:
<?php
// В този файл ще ти записва часа и IP адреса на този който те флуиди , можеш да го направиш да го записва и в БД
$floodfile = "flood.php"; //
// Тук си нагласи времето
[color=red]$floodtime = 5[/color]; // 
$ipaddress = getrealip(); //
$addedtime = time(); //

if(flooder($ipaddress)){
echo "<center><font style=\"font-family: verdana; font-size: 11px; color: maroon;\"><b>FLOOD ЗАЩИТА!</b></font><br /><br /><font style=\"font-family: verdana; font-size: 10px; color: maroon;\">Трябва да изчакате $floodtime секунди преди да посетите страницата отново!</font></center>";
exit;
}
else{
$floodfp = fopen($floodfile, "a");
fwrite($floodfp, "$addedtime|$ipaddress|\n");
fclose($floodfp);
}

function flooder($ipaddress){
global $floodtime, $floodfile;

$old_db = file($floodfile);
$new_db = fopen($floodfile, w);
$result = FALSE;
foreach($old_db as $old_db_line){
$old_db_arr = explode("|", $old_db_line);
if(($old_db_arr[0] + $floodtime) > time() ){
fwrite($new_db, $old_db_line);
if($old_db_arr[1] == $ipaddress){
$result = TRUE;
}
}
}
fclose($new_db);
return $result;
}

function getrealip(){
if(getenv('HTTP_X_FORWARDED_FOR')){
$ipaddress = $_SERVER['REMOTE_ADDR'];
if(preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", getenv('HTTP_X_FORWARDED_FOR'), $ipaddress3)){
$ipaddress2 = array('/^0\./', '/^127\.0\.0\.1/', '/^192\.168\..*/', '/^172\.16\..*/', '/^10..*/', '/^224..*/', '/^240..*/');
$ipaddress = preg_replace($ipaddress2, $ipaddress, $ipaddress3[1]);
}
}else{
$ipaddress = $_SERVER['REMOTE_ADDR'];
}
if($ipaddress == ""){ $ipaddress = "12.34.56.78"; }
return $ipaddress;
}
?>
 
1 прост каптча код ,който ти изкарва някакъв текст в readonly после би ти свършил идеална работа,и можеш да го използваш на много места.

Ако ти върши работа нещо подобно,имам функция и мога да ти я дам.
 
Msecurity каза:
Ето този код мисля че ще ти свърши повече работа:
Като цяло си работи кода,но реално ако опитам да си браузвам сайта и постоянно излиза,защото преглеждам новини 1-2-3 в рамките на 5 секунди.Съответно смених времето на 1 секунда и пак е малко безсмислено.Дали не може да се записва номера на заявките (рефреш) на страницата и ако дадено ип направи повече от 10 за 5 секунди тогава да се изписва текста ,че е прекалил с рефрешите...
 

Back
Горе