1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
if( login_limit() )
die( 'Your IP has been banned from logging in for the next 5 minutes' );
/*
* Counts login times by same IP
* returns true if limit reached or false if not
*/
function login_limit(){
//get real IP if user behind proxy noted by Sebastian Enger
$ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
//user still banned from login
if( _cache( $ip . 'banned' ) )
return true;
//number of seconds
$sec = 30;
//find ip info array in cache saved less than $sec ago
if( ($ip_info=_cache( $ip )) && $ip_info[0] > time()-$sec ){
//user login 10 times during last $sec
if( $ip_info[1] > 10 ){
//ban user ip for the next 5 minutes
_cache( $ip . 'banned', 1, 0, 60*5 );
_cache( $ip, -1 );
return true;
}
//increase login retries +1
_cache( $ip, array( $ip_info[0], ++$ip_info[1] ), 0, $sec );
return false;
}
//add ip info to cache
_cache( $ip, array( time(), 1 ), 0, $sec );
return false;
}
function _cache( $name, $val=NULL, $ttl=false ){
//memcached
global $mcdb;
if(empty($mcdb) )
$mcdb = memcache_connect('unix:///etc/sockets/memcached.sock', 0);
if($val === -1){
return memcache_delete($mcdb,$name);
}elseif( $val !== NULL ){
return memcache_set($mcdb,$name,$val, false, $ttl);
}else{
$retval = memcache_get($mcdb,$name);
return $retval ? $retval : NULL;
}
} |
Recommended posts:
Tags :
This entry was posted on Friday, August 5th, 2011 at 9:34 pm and is filed under Solutions.
You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, or trackback from your own site.