summaryrefslogtreecommitdiffstats
path: root/frontends
diff options
context:
space:
mode:
authorartem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-04-29 11:52:36 +0000
committerartem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-04-29 11:52:36 +0000
commitec43f191d24dd3cf181061cbf4582029dcdca399 (patch)
treeb4a72c596497ddea14668433a355a6579ff3ebc7 /frontends
parent131500f24e0298058a33aa79ced9d01111c7b778 (diff)
downloadzabbix-ec43f191d24dd3cf181061cbf4582029dcdca399.tar.gz
zabbix-ec43f191d24dd3cf181061cbf4582029dcdca399.tar.xz
zabbix-ec43f191d24dd3cf181061cbf4582029dcdca399.zip
- [DEV-153] added protection against brute force attack (Artem)
git-svn-id: svn://svn.zabbix.com/trunk@5666 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'frontends')
-rw-r--r--frontends/php/include/config.inc.php2
-rw-r--r--frontends/php/include/defines.inc.php3
-rw-r--r--frontends/php/include/perm.inc.php5
-rw-r--r--frontends/php/index.php54
4 files changed, 45 insertions, 19 deletions
diff --git a/frontends/php/include/config.inc.php b/frontends/php/include/config.inc.php
index ae183ae4..024358ef 100644
--- a/frontends/php/include/config.inc.php
+++ b/frontends/php/include/config.inc.php
@@ -105,7 +105,7 @@ function TODO($msg) { echo "TODO: ".$msg.SBR; } // DEBUG INFO!!!
if(defined('ZBX_DENY_GUI_ACCESS')){
if(isset($ZBX_GUI_ACCESS_IP_RANGE) && is_array($ZBX_GUI_ACCESS_IP_RANGE)){
- $user_ip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']))?($_SERVER['HTTP_X_FORWARDED_FOR']):($_SERVER['REMOTE_ADDR']);
+ $user_ip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']))?($_SERVER['HTTP_X_FORWARDED_FOR']):($_SERVER['REMOTE_ADDR']);
if(!str_in_array($user_ip,$ZBX_GUI_ACCESS_IP_RANGE)) $DENY_GUI = TRUE;
}
else{
diff --git a/frontends/php/include/defines.inc.php b/frontends/php/include/defines.inc.php
index 728288b1..571386fb 100644
--- a/frontends/php/include/defines.inc.php
+++ b/frontends/php/include/defines.inc.php
@@ -27,6 +27,9 @@
define('PAGE_TYPE_XML', 2);
define('PAGE_TYPE_JS', 3); //javascript
define('PAGE_TYPE_HTML_BLOCK', 4); //simple block of html (as text)
+
+ define('ZBX_LOGIN_ATTEMPTS', 5);
+ define('ZBX_LOGIN_BLOCK', 180);
define('T_ZBX_STR', 0);
define('T_ZBX_INT', 1);
diff --git a/frontends/php/include/perm.inc.php b/frontends/php/include/perm.inc.php
index c0692cf4..5cf3ae64 100644
--- a/frontends/php/include/perm.inc.php
+++ b/frontends/php/include/perm.inc.php
@@ -53,9 +53,14 @@
' AND s.userid=u.userid'.
' AND ((s.lastaccess+u.autologout>'.time().') OR (u.autologout=0))'.
' AND '.DBin_node('u.userid', $ZBX_LOCALNODEID)));
+
if(!$USER_DETAILS){
$incorect_session = true;
}
+ else if($login['attempt_failed']){
+ error('There was ['.$login['attempt_failed'].'] failed attempts to Login from ['.$login['attempt_ip'].'] at ['.date('d.m.Y H:nn',$login['attempt_clock']).'] o\'clock!');
+ DBexecute('UPDATE users SET attempt_failed=0 WHERE userid='.zbx_dbstr($login['userid']));
+ }
}
if(!$USER_DETAILS){
diff --git a/frontends/php/index.php b/frontends/php/index.php
index f469e6df..218f8f05 100644
--- a/frontends/php/index.php
+++ b/frontends/php/index.php
@@ -43,8 +43,7 @@
<?php
$sessionid = get_cookie('zbx_sessionid', null);
- if(isset($_REQUEST["reconnect"]) && isset($sessionid))
- {
+ if(isset($_REQUEST["reconnect"]) && isset($sessionid)){
add_audit(AUDIT_ACTION_LOGOUT,AUDIT_RESOURCE_USER,"Manual Logout");
zbx_unsetcookie('zbx_sessionid');
@@ -63,16 +62,27 @@
$name = get_request('name','');
$password = md5(get_request('password',''));
- switch($config['authentication_type']){
- case ZBX_AUTH_LDAP:
- $login = ldap_authentication($name,get_request('password',''));
- break;
- case ZBX_AUTH_INTERNAL:
- default:
- $alt_auth = ZBX_AUTH_INTERNAL;
- $login = true;
+ $sql = 'SELECT u.userid,u.attempt_failed, u.attempt_clock, u.attempt_ip '.
+ ' FROM users u '.
+ ' WHERE u.alias='.zbx_dbstr($name).
+ ' AND ( attempt_failed<'.ZBX_LOGIN_ATTEMPTS.
+ ' OR (attempt_failed>'.(ZBX_LOGIN_ATTEMPTS-1).
+ ' AND ('.time().'-attempt_clock)>'.ZBX_LOGIN_BLOCK.'))';
+
+ $login = $attempt = DBfetch(DBselect($sql));
+
+ if($login){
+ switch($config['authentication_type']){
+ case ZBX_AUTH_LDAP:
+ $login = ldap_authentication($name,get_request('password',''));
+ break;
+ case ZBX_AUTH_INTERNAL:
+ default:
+ $alt_auth = ZBX_AUTH_INTERNAL;
+ $login = true;
+ }
}
-
+
if($login){
$login = $row = DBfetch(DBselect('SELECT u.userid,u.alias,u.name,u.surname,u.url,u.refresh,u.passwd '.
' FROM users u, users_groups ug, usrgrp g '.
@@ -89,13 +99,12 @@
if($login){
$login = (check_perm2login($row['userid']) && check_perm2system($row['userid']));
}
-
+
if($login){
$sessionid = md5(time().$password.$name.rand(0,10000000));
zbx_setcookie('zbx_sessionid',$sessionid);
- DBexecute("insert into sessions (sessionid,userid,lastaccess)".
- " values (".zbx_dbstr($sessionid).",".$row["userid"].",".time().")");
+ DBexecute('INSERT INTO sessions (sessionid,userid,lastaccess) VALUES ('.zbx_dbstr($sessionid).','.$row['userid'].','.time().')');
add_audit(AUDIT_ACTION_LOGIN,AUDIT_RESOURCE_USER,"Correct login [".$name."]");
@@ -113,16 +122,25 @@
else{
$row = NULL;
- $_REQUEST['message'] = "Login name or password is incorrect";
- add_audit(AUDIT_ACTION_LOGIN,AUDIT_RESOURCE_USER,"Login failed [".$name."]");
+ $_REQUEST['message'] = 'Login name or password is incorrect';
+ add_audit(AUDIT_ACTION_LOGIN,AUDIT_RESOURCE_USER,'Login failed ['.$name.']');
+
+ if($attempt){
+ $ip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']))?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
+ $attempt['attempt_failed']++;
+ $sql = 'UPDATE users SET attempt_failed='.zbx_dbstr($attempt['attempt_failed']).
+ ', attempt_clock='.time().
+ ', attempt_ip='.zbx_dbstr($ip).
+ ' WHERE userid='.zbx_dbstr($attempt['userid']);
+ DBexecute($sql);
+ }
}
}
include_once "include/page_header.php";
if(isset($_REQUEST['message'])) show_error_message($_REQUEST['message']);
-?>
-<?php
+
if(!isset($sessionid)){
insert_login_form();
}