Сравните время в PHP как строку - PullRequest
0 голосов
/ 10 сентября 2011

Мне нужен метод, который получает две строки, которые представляют DateTime (в синтаксисе MySql) и возвращает разницу во времени между ними.
Затем мне нужно сравнить это время с 3 seconds, чтобы я мог заблокировать атаку грубой силы на мой сервер.

Я много перепутал с Google, и мне удалось получить строковое представление объекта DateTime, но мне не удалось преобразовать и сравнить их.

Ответы [ 5 ]

2 голосов
/ 10 сентября 2011
$time_str1 = '2011-09-10 19:59:23'; // first string datetime from DB
$time_str2 = '2011-09-10 19:59:24'; // second string datetime from DB

// first DateTime object created based on the MySQL datetime format
$dt1 = DateTime::createFromFormat('Y-m-d H:i:s', $time_str1);

// second DateTime object created based on the MySQL datetime format
$dt2 = DateTime::createFromFormat('Y-m-d H:i:s', $time_str2);

// difference comparison to check if at least 3 seconds have passed
if ( ($dt2->format('U') - $dt1->format('U')) > 3) {
    echo 'Ok, no brute force'; // yes, three seconds have passed
} else{
    echo 'We got you newbie'; // nope, three second haven't passed
}
1 голос
/ 10 сентября 2011

Вот альтернативный метод, использующий сеанс, нет необходимости запрашивать базу данных для отметки времени:

<?php 
session_start();

function post_check($limit){
    //Check for first time
    if(isset($_SESSION['post_check'])){
        //Check for count on failed 
        if(isset($_SESSION['post_check_count'])){
            //If fail count is more then 3 block till user closes down browser
            if($_SESSION['post_check_count']>$limit){
                die('Too many requsets to the server, please close down your browesr and try again.');
            }
        }else{
             //Set for count on failed
            $_SESSION['post_check_count']=0;
        }

        //Check (time-limit) against timestamp held in session
        if(($_SESSION['post_check']+$limit)<=time()){
            //Update timestamp
            $_SESSION['post_check']=time();
            //Ok
            return true;
        }else{
            //Update Fail count
            $_SESSION['post_check_count']++;
            //Fail
            return false;
        }
    }else{
        //Set for first time
        $_SESSION['post_check']=time();
        return true;
    }
}


//Pretty self explanitry here
if(post_check('3')===true){
    echo 'Allowed: handle post stuff here';
}else{
    echo'Too many requests within given time limit do nothing';
}
?>
1 голос
/ 10 сентября 2011
$diffInSeconds = $dateTimeLater->format('U') - $dateTimeFirst->format('U');
1 голос
/ 10 сентября 2011

strtotime( $timeStr ), которое преобразуется в количество секунд с начала эпохи http://en.wikipedia.org/wiki/Unix_epoch. Тогда вы можете просто использовать стандартные математические операторы. Будьте осторожны, иногда strtotime может быть неточным. Чтобы преобразовать обратно, date("m-d-Y H:i:s", $time)

0 голосов
/ 10 сентября 2011

На стороне MySQL:

SELECT UNIX_TIMESTAMP(my_time) FROM my_table

На стороне PHP у вас есть метки времени UNIX в секундах, которые вы можете сравнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...