Add optional referer check to prevent CSRF in GET requests
| | |
| | | CHANGELOG Roundcube Webmail |
| | | =========================== |
| | | |
| | | - Security: add optional referer check to prevent CSRF in GET requests |
| | | - Fix email_dns_check setting not used for identities/contacts (#1487740) |
| | | - Fix ICANN example addresses doesn't validate (#1487742) |
| | | - Security: protect login form submission from CSRF |
| | |
| | | // check client IP in session athorization |
| | | $rcmail_config['ip_check'] = false; |
| | | |
| | | // check referer of incoming requests |
| | | $rcmail_config['referer_check'] = false; |
| | | |
| | | // this key is used to encrypt the users imap password which is stored |
| | | // in the session record (and the client cookie if remember password is enabled). |
| | | // please provide a string of exactly 24 chars. |
| | |
| | | $OUTPUT->show_message('invalidrequest', 'error'); |
| | | $OUTPUT->send($RCMAIL->task); |
| | | } |
| | | |
| | | // check referer if configured |
| | | if (!$request_check_whitelist[$RCMAIL->action] && $RCMAIL->config->get('referer_check') && !rcube_check_referer()) { |
| | | raise_error(array( |
| | | 'code' => 403, |
| | | 'type' => 'php', |
| | | 'message' => "Referer check failed"), true, true); |
| | | } |
| | | } |
| | | |
| | | // handle special actions |
| | |
| | | | program/include/main.inc | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2009, The Roundcube Dev Team | |
| | | | Copyright (C) 2005-2011, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | PURPOSE: | |
| | |
| | | |
| | | |
| | | /** |
| | | * Check whether the HTTP referer matches the current request |
| | | * |
| | | * @return boolean True if referer is the same host+path, false if not |
| | | */ |
| | | function rcube_check_referer() |
| | | { |
| | | $uri = parse_url($_SERVER['REQUEST_URI']); |
| | | $referer = parse_url(rc_request_header('Referer')); |
| | | return $referer['host'] == rc_request_header('Host') && $referer['path'] == $uri['path']; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @access private |
| | | * @return mixed |
| | | */ |
| | |
| | | | program/steps/utils/error.inc | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2010, The Roundcube Dev Team | |
| | | | Copyright (C) 2005-2011, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | PURPOSE: | |
| | |
| | | "Please contact your server-administrator."; |
| | | } |
| | | |
| | | // forbidden due to request check |
| | | else if ($ERROR_CODE==403) { |
| | | $__error_title = "REQUEST CHECK FAILED"; |
| | | $__error_text = "Access to this service was denied due to failing security checks!<br />\n". |
| | | "Please contact your server-administrator."; |
| | | } |
| | | |
| | | // failed request (wrong step in URL) |
| | | else if ($ERROR_CODE==404) { |
| | | $__error_title = "REQUEST FAILED/FILE NOT FOUND"; |