Bernd Wurst commited on 2012-09-18 11:54:20
Zeige 2 geänderte Dateien mit 34 Einfügungen und 1 Löschungen.
| ... | ... |
@@ -115,7 +115,19 @@ function generate_secret($username) |
| 115 | 115 |
return $secret; |
| 116 | 116 |
} |
| 117 | 117 |
|
| 118 |
+function check_locked($username) |
|
| 119 |
+{
|
|
| 120 |
+ $username = mysql_real_escape_string($username); |
|
| 121 |
+ $result = db_query("SELECT 1 FROM mail.webmail_googleauth WHERE unlock_timestamp IS NOT NULL and unlock_timestamp > NOW() AND email='{$username}'");
|
|
| 122 |
+ return (mysql_num_rows($result) > 0); |
|
| 123 |
+} |
|
| 124 |
+ |
|
| 118 | 125 |
function check_googleauth($username, $code) {
|
| 126 |
+ if (check_blacklist($username, $code)) {
|
|
| 127 |
+ DEBUG('Replay-Attack');
|
|
| 128 |
+ return false; |
|
| 129 |
+ } |
|
| 130 |
+ |
|
| 119 | 131 |
$username = mysql_real_escape_string($username); |
| 120 | 132 |
|
| 121 | 133 |
$result = db_query("SELECT ga_secret, failures FROM mail.webmail_googleauth WHERE email='{$username}' AND (unlock_timestamp IS NULL OR unlock_timestamp <= NOW())");
|
| ... | ... |
@@ -128,6 +140,7 @@ function check_googleauth($username, $code) {
|
| 128 | 140 |
$checkResult = $ga->verifyCode($secret, $code, 2); // 2 = 2*30sec clock tolerance |
| 129 | 141 |
if ($checkResult) {
|
| 130 | 142 |
db_query("UPDATE mail.webmail_googleauth SET failures = 0, unlock_timestamp=NULL WHERE email='{$username}'");
|
| 143 |
+ blacklist_token($username, $code); |
|
| 131 | 144 |
DEBUG('OK');
|
| 132 | 145 |
} else {
|
| 133 | 146 |
if ($tmp['failures'] > 0 && $tmp['failures'] % 5 == 0) {
|
| ... | ... |
@@ -195,3 +208,20 @@ function delete_googleauth($id) |
| 195 | 208 |
db_query("DELETE FROM mail.webmail_googleauth WHERE id={$id} AND useraccount={$uid}");
|
| 196 | 209 |
} |
| 197 | 210 |
|
| 211 |
+ |
|
| 212 |
+function blacklist_token($email, $token) |
|
| 213 |
+{
|
|
| 214 |
+ $email = mysql_real_escape_string($email); |
|
| 215 |
+ $token = mysql_real_escape_string($token); |
|
| 216 |
+ db_query("INSERT INTO mail.webmail_googleauth_blacklist (timestamp, email, token) VALUES (NOW(), '{$email}', '{$token}')");
|
|
| 217 |
+} |
|
| 218 |
+ |
|
| 219 |
+function check_blacklist($email, $token) |
|
| 220 |
+{
|
|
| 221 |
+ $email = mysql_real_escape_string($email); |
|
| 222 |
+ $token = mysql_real_escape_string($token); |
|
| 223 |
+ db_query("DELETE FROM mail.webmail_googleauth_blacklist WHERE timestamp < NOW() - INTERVAL 10 MINUTE");
|
|
| 224 |
+ $result = db_query("SELECT id FROM mail.webmail_googleauth_blacklist WHERE email='{$email}' AND token='{$token}'");
|
|
| 225 |
+ return (mysql_num_rows($result) > 0); |
|
| 226 |
+} |
|
| 227 |
+ |
| ... | ... |
@@ -35,7 +35,10 @@ if (isset($_REQUEST['username'])) {
|
| 35 | 35 |
$success = false; |
| 36 | 36 |
} |
| 37 | 37 |
|
| 38 |
- if (! check_googleauth($username, $ga_code)) {
|
|
| 38 |
+ if (check_locked($username)) {
|
|
| 39 |
+ input_error('Aufgrund einiger Fehlversuche wurde dieses Konto übergangsweise deaktiviert. Bitte warten Sie ein paar Minuten.');
|
|
| 40 |
+ $success = false; |
|
| 41 |
+ } elseif (! check_googleauth($username, $ga_code)) {
|
|
| 39 | 42 |
input_error('Der Google-Authenticator-Code wurde nicht akzeptiert.');
|
| 40 | 43 |
$success = false; |
| 41 | 44 |
} |
| 42 | 45 |