Предотвращение затопления PHP-скрипта

Я хочу, чтобы мой скрипт не был залит - если пользователь нажал F5, он каждый раз запускает скрипт.

Я хочу предотвратить это и разрешить выполнение одного скрипта за 2 секунды. Есть ли какое-то решение для этого?

 Lucas15 апр. 2012 г., 16:14
@Baba Большое спасибо! :)
 Baba14 апр. 2012 г., 19:42
Я знаю, что вы выбрали мой ответ, но ... хотелось написать улучшенную версию для вас ... см. Ответ на обновленный сценарий

Ответы на вопрос(5)

Store the last execution time of your script in a database or a file. Read from that file/database and compare to the current time. If the difference is under 2 seconds, terminate the script. Else, continue normally.
 Lucas14 апр. 2012 г., 18:40
Я должен использовать сеансы для этого?
 14 апр. 2012 г., 18:41
Если пользователь не хранит файлы cookie, ваши сеансы бесполезны, и сценарий не будет сокращен.

так что это не очень хорошая идея, или вы можете сохранить свой IP-адрес в базе данных, так что если более X пытается с того же IP-адреса, то не выполняет код, просто если еще оператор, вам понадобится таблица с ip адресами, время запроса, количество попыток

Если вы не хотите использовать базы данных, вы можете использовать следующий код

$file = "file.txt";
$file_content = file_get_contents($file);
$fh = fopen($file, 'w') or die("could not open file");
$now = time();
if($now - $file_content > 60){
// your code here
fwrite($fh, $now);
}else{
echo "Try again later";
}
fclose($fh);

но в этом случае это будет не для каждого посетителя, а скорее для всех них (например, пользователь A пришел и выполнил сценарий, пользователь B не сможет выполнить его до истечения 60 секунд).

Решение Вопроса

Простой демонстрационный скрипт

$memcache = new Memcache ();
$memcache->connect ( 'localhost', 11211 );
$runtime = $memcache->get ( 'floodControl' );

if ((time () - $runtime) < 2) {
    die ( "Die! Die! Die!" );
} 

else {
    echo "Welcome";
    $memcache->set ( "floodControl", time () );
}

Это просто пример кода. Есть и другие вещи, которые следует учитывать, такие как

ЛучшеIP обнаружение адреса (Proxy, Tor)

B. Текущее действие

C. Максимальное выполнение в минуту и т.д ...

D. Бан пользователя после максимального потока и т. Д.

EDIT 1 - Improved Version

использование

$flood = new FloodDetection();
$flood->check();

echo "Welcome" ;

Учебный класс

class FloodDetection {
    const HOST = "localhost";
    const PORT = 11211;
    private $memcache;
    private $ipAddress;

    private $timeLimitUser = array (
            "DEFAULT" => 2,
            "CHAT" => 3,
            "LOGIN" => 4 
    );
    private $timeLimitProcess = array (
            "DEFAULT" => 0.1,
            "CHAT" => 1.5,
            "LOGIN" => 0.1 
    );

    function __construct() {
        $this->memcache = new Memcache ();
        $this->memcache->connect ( self::HOST, self::PORT );
    }

    function addUserlimit($key, $time) {
        $this->timeLimitUser [$key] = $time;
    }

    function addProcesslimit($key, $time) {
        $this->timeLimitProcess [$key] = $time;
    }

    public function quickIP() {
        return (empty ( $_SERVER ['HTTP_CLIENT_IP'] ) ? (empty ( $_SERVER ['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER ['REMOTE_ADDR'] : $_SERVER ['HTTP_X_FORWARDED_FOR']) : $_SERVER ['HTTP_CLIENT_IP']);
    }

    public function check($action = "DEFAULT") {
        $ip = $this->quickIP ();
        $ipKey = "flood" . $action . sha1 ( $ip );

        $runtime = $this->memcache->get ( 'floodControl' );
        $iptime = $this->memcache->get ( $ipKey );

        $limitUser = isset ( $this->timeLimitUser [$action] ) ? $this->timeLimitUser [$action] : $this->timeLimitUser ['DEFAULT'];
        $limitProcess = isset ( $this->timeLimitProcess [$action] ) ? $this->timeLimitProcess [$action] : $this->timeLimitProcess ['DEFAULT'];

        if ((microtime ( true ) - $iptime) < $limitUser) {
            print ("Die! Die! Die! $ip") ;
            exit ();
        }

        // Limit All request
        if ((microtime ( true ) - $runtime) < $limitProcess) {
            print ("All of you Die! Die! Die! $ip") ;
            exit ();
        }

        $this->memcache->set ( "floodControl", microtime ( true ) );
        $this->memcache->set ( $ipKey, microtime ( true ) );
    }

}
 14 апр. 2012 г., 20:37
Я собирался поднять голос. До того момента, как вы использовали этот синглтон.
 14 апр. 2012 г., 20:45
сделано ... @ правда .. надеюсь, вы можете пересмотреть сейчас ...
 14 апр. 2012 г., 20:43
хаааа .. я бы сразу поменял .. +1 спасибо за наблюдение
 02 июл. 2012 г., 20:13
+1, вау, какие-то классные идеи :)
 14 апр. 2012 г., 21:19
Синглтоны не имеют преимуществ перед статическими классами или объектами экземпляров. Они только налагают ограничения и на более поздних этапах проекта, неприятности. Трудно проверить, трудно поддерживать код (тугое сцепление бла-бла-бла).Read all about it

ормацию на стороне клиента, это будет легко обойти.

Я бы, например, сохранить метку времени в таблице. Это вводит и проверяет от спама ваш сценарий. И было бы легко установить терпимость.

или чтения из файла, который, по моему мнению, требует много времени и ресурсов

Ваш ответ на вопрос