WordPress.org

Make WordPress Core

Ticket #5367: secure_cookie.2.diff

File secure_cookie.2.diff, 11.5 KB (added by ryan, 7 years ago)
  • wp-login.php

     
    288288default: 
    289289        $user_login = ''; 
    290290        $user_pass = ''; 
    291         $using_cookie = FALSE; 
    292291 
    293292        if ( !isset( $_REQUEST['redirect_to'] ) || is_user_logged_in() ) 
    294293                $redirect_to = 'wp-admin/'; 
     
    296295                $redirect_to = $_REQUEST['redirect_to']; 
    297296 
    298297        if ( $http_post ) { 
     298                // If cookies are disabled we can't log in even with a valid user+pass 
     299                if ( empty($_COOKIE[TEST_COOKIE]) ) 
     300                        $errors['test_cookie'] = __('<strong>ERROR</strong>: WordPress requires Cookies but your browser does not support them or they are blocked.'); 
     301                 
    299302                $user_login = $_POST['log']; 
    300303                $user_login = sanitize_user( $user_login ); 
    301304                $user_pass  = $_POST['pwd']; 
    302305                $rememberme = $_POST['rememberme']; 
     306 
     307                do_action_ref_array('wp_authenticate', array(&$user_login, &$user_pass)); 
    303308        } else { 
    304                 $cookie_login = wp_get_cookie_login(); 
    305                 if ( ! empty($cookie_login) ) { 
    306                         $using_cookie = true; 
    307                         $user_login = $cookie_login['login']; 
    308                         $user_pass = $cookie_login['password']; 
     309                $user = wp_validate_auth_cookie(); 
     310                if ( !$user ) { 
     311                        $errors['expiredsession'] = __('Your session has expired.'); 
     312                } else { 
     313                        $user = new WP_User($user); 
     314 
     315                        // If the user can't edit posts, send them to their profile. 
     316                        if ( !$user->has_cap('edit_posts') && ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' ) ) 
     317                                $redirect_to = get_option('siteurl') . '/wp-admin/profile.php'; 
     318                        wp_safe_redirect($redirect_to); 
     319                        exit(); 
    309320                } 
    310321        } 
    311322 
    312         do_action_ref_array('wp_authenticate', array(&$user_login, &$user_pass)); 
    313  
    314         // If cookies are disabled we can't log in even with a valid user+pass 
    315         if ( $http_post && empty($_COOKIE[TEST_COOKIE]) ) 
    316                 $errors['test_cookie'] = __('<strong>ERROR</strong>: WordPress requires Cookies but your browser does not support them or they are blocked.'); 
    317  
    318323        if ( $user_login && $user_pass && empty( $errors ) ) { 
    319324                $user = new WP_User(0, $user_login); 
    320325 
     
    322327                if ( !$user->has_cap('edit_posts') && ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' ) ) 
    323328                        $redirect_to = get_option('siteurl') . '/wp-admin/profile.php'; 
    324329 
    325                 if ( wp_login($user_login, $user_pass, $using_cookie) ) { 
    326                         if ( !$using_cookie ) 
    327                                 wp_setcookie($user_login, $user_pass, false, '', '', $rememberme); 
     330                if ( wp_login($user_login, $user_pass) ) { 
     331                        wp_setcookie($user_login, $user_pass, false, '', '', $rememberme); 
    328332                        do_action('wp_login', $user_login); 
    329333                        wp_safe_redirect($redirect_to); 
    330334                        exit(); 
    331                 } else { 
    332                         if ( $using_cookie ) 
    333                                 $errors['expiredsession'] = __('Your session has expired.'); 
    334335                } 
    335336        } 
    336337 
  • wp-includes/compat.php

     
    147147        } 
    148148} 
    149149 
     150if ( ! function_exists('hash_hmac') ): 
     151function hash_hmac($algo, $data, $key, $raw_output = false) { 
     152        $packs = array('md5' => 'H32', 'sha1' => 'H40'); 
     153 
     154        if ( !isset($packs[$algo]) ) 
     155                return false; 
     156 
     157        $pack = $packs[$algo]; 
     158 
     159        if (strlen($key) > 64) 
     160                $key = pack($pack, $algo($key)); 
     161        else if (strlen($key) < 64) 
     162                $key = str_pad($key, 64, chr(0)); 
     163         
     164        $ipad = (substr($key, 0, 64) ^ str_repeat(chr(0x36), 64)); 
     165        $opad = (substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64)); 
     166 
     167        return $algo($opad . pack($pack, $algo($ipad . $data))); 
     168} 
     169endif; 
     170 
    150171// Added in PHP 4.3.0? 
    151172if (!defined('IMAGETYPE_GIF')) 
    152173    define('IMAGETYPE_GIF', 1); 
  • wp-includes/pluggable.php

     
    4646        if ( ! empty($current_user) ) 
    4747                return; 
    4848 
    49         if ( empty($_COOKIE[USER_COOKIE]) || empty($_COOKIE[PASS_COOKIE]) || 
    50                 !wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true) ) { 
     49        if ( ! $user = wp_validate_auth_cookie() ) { 
    5150                wp_set_current_user(0); 
    5251                return false; 
    5352        } 
    5453 
    55         $user_login = $_COOKIE[USER_COOKIE]; 
    56         wp_set_current_user(0, $user_login); 
     54        wp_set_current_user($user); 
    5755} 
    5856endif; 
    5957 
     
    293291endif; 
    294292 
    295293if ( !function_exists('wp_login') ) : 
    296 function wp_login($username, $password, $already_md5 = false) { 
     294function wp_login($username, $password, $deprecated = false) { 
    297295        global $wpdb, $error; 
    298296 
    299297        $username = sanitize_user($username); 
     
    313311                return false; 
    314312        } 
    315313 
    316         // If the password is already_md5, it has been double hashed. 
    317         // Otherwise, it is plain text. 
    318         if ( !$already_md5 ) { 
    319                 if ( wp_check_password($password, $login->user_pass) ) { 
    320                         // If using old md5 password, rehash. 
    321                         if ( strlen($login->user_pass) <= 32 ) { 
    322                                 $hash = wp_hash_password($password); 
    323                                 $wpdb->query("UPDATE $wpdb->users SET user_pass = '$hash', user_activation_key = '' WHERE ID = '$login->ID'"); 
    324                                 wp_cache_delete($login->ID, 'users'); 
    325                         } 
     314        if ( !wp_check_password($password, $login->user_pass) ) { 
     315                $error = __('<strong>ERROR</strong>: Incorrect password.'); 
     316                return false; 
     317        } 
    326318 
    327                         return true; 
    328                 } 
     319        // If using old md5 password, rehash. 
     320        if ( strlen($login->user_pass) <= 32 ) { 
     321                $hash = wp_hash_password($password); 
     322                $wpdb->query("UPDATE $wpdb->users SET user_pass = '$hash', user_activation_key = '' WHERE ID = '$login->ID'"); 
     323                wp_cache_delete($login->ID, 'users'); 
     324        } 
     325 
     326        return true; 
     327} 
     328endif; 
     329 
     330if ( !function_exists('wp_validate_auth_cookie') ) : 
     331function wp_validate_auth_cookie($cookie = '') { 
     332        if ( empty($cookie) ) { 
     333                if ( empty($_COOKIE[AUTH_COOKIE]) ) 
     334                        return false; 
     335                $cookie = $_COOKIE[AUTH_COOKIE]; 
     336        } 
     337 
     338        list($username, $expiration, $hmac) = explode('|', $cookie); 
     339 
     340        if ( $expiration < time() ) 
     341                return false; 
     342 
     343        $user = get_userdatabylogin($username); 
     344        if ( ! $user ) 
     345                return false; 
     346 
     347        $key = wp_hash($username . $expiration); 
     348        $hash = hash_hmac('md5', $username . $expiration, $key); 
     349         
     350        if ($hmac != $hash) 
     351                return false; 
     352 
     353        return $user->ID; 
     354} 
     355endif; 
     356 
     357if ( !function_exists('wp_set_auth_cookie') ) : 
     358function wp_set_auth_cookie($user_id, $remember = false) { 
     359        $user = get_userdata($user_id); 
     360 
     361        if ( $remember ) { 
     362                $expiration = $expire = time() + 1209600; 
    329363        } else { 
    330                 if ( md5($login->user_pass) == $password ) 
    331                         return true; 
     364                $expiration = time() + 172800; 
     365                $expire = 0; 
    332366        } 
    333367 
    334         $error = __('<strong>ERROR</strong>: Incorrect password.'); 
    335         return false; 
     368        $key = wp_hash($user->user_login . $expiration); 
     369        $hash = hash_hmac('md5', $user->user_login . $expiration, $key); 
     370 
     371        $cookie = $user->user_login . '|' . $expiration . '|' . $hash; 
     372 
     373        setcookie(AUTH_COOKIE, $cookie, $expire, COOKIEPATH, COOKIE_DOMAIN); 
     374        if ( COOKIEPATH != SITECOOKIEPATH ) 
     375                setcookie(AUTH_COOKIE, $cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN); 
    336376} 
    337377endif; 
    338378 
     
    350390if ( !function_exists('auth_redirect') ) : 
    351391function auth_redirect() { 
    352392        // Checks if a user is logged in, if not redirects them to the login page 
    353         if ( (!empty($_COOKIE[USER_COOKIE]) && 
    354                                 !wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true)) || 
    355                          (empty($_COOKIE[USER_COOKIE])) ) { 
     393        if ( (!empty($_COOKIE[AUTH_COOKIE]) && 
     394                                !wp_validate_auth_cookie($_COOKIE[AUTH_COOKIE])) || 
     395                         (empty($_COOKIE[AUTH_COOKIE])) ) { 
    356396                nocache_headers(); 
    357397 
    358398                wp_redirect(get_option('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI'])); 
     
    379419        if ( !wp_verify_nonce( $nonce, $action ) ) { 
    380420                $current_name = ''; 
    381421                if ( ( $current = wp_get_current_user() ) && $current->ID ) 
    382                         $current_name = $current->data->user_login; 
     422                        $current_name = $current->user_login; 
    383423                if ( !$current_name ) 
    384424                        die('-1'); 
    385425 
     426                $auth_cookie = ''; 
    386427                $cookie = explode('; ', urldecode(empty($_POST['cookie']) ? $_GET['cookie'] : $_POST['cookie'])); // AJAX scripts must pass cookie=document.cookie 
    387428                foreach ( $cookie as $tasty ) { 
    388                         if ( false !== strpos($tasty, USER_COOKIE) ) 
    389                                 $user = substr(strstr($tasty, '='), 1); 
    390                         if ( false !== strpos($tasty, PASS_COOKIE) ) 
    391                                 $pass = substr(strstr($tasty, '='), 1); 
     429                        if ( false !== strpos($tasty, AUTH_COOKIE) ) 
     430                                $auth_cookie = substr(strstr($tasty, '='), 1); 
    392431                } 
    393432 
    394                 if ( $current_name != $user || !wp_login( $user, $pass, true ) ) 
     433                if ( $current_name != $user || empty($auth_cookie) || !wp_validate_auth_cookie( $auth_cookie ) ) 
    395434                        die('-1'); 
    396435        } 
    397436        do_action('check_ajax_referer'); 
     
    483522endif; 
    484523 
    485524if ( !function_exists('wp_setcookie') ) : 
    486 function wp_setcookie($username, $password, $already_md5 = false, $home = '', $siteurl = '', $remember = false) { 
     525function wp_setcookie($username, $password = '', $already_md5 = false, $home = '', $siteurl = '', $remember = false) { 
    487526        $user = get_userdatabylogin($username); 
    488         if ( !$already_md5) { 
    489                 $password = md5($user->user_pass); // Double hash the password in the cookie. 
    490         } 
    491  
    492         if ( empty($home) ) 
    493                 $cookiepath = COOKIEPATH; 
    494         else 
    495                 $cookiepath = preg_replace('|https?://[^/]+|i', '', $home . '/' ); 
    496  
    497         if ( empty($siteurl) ) { 
    498                 $sitecookiepath = SITECOOKIEPATH; 
    499                 $cookiehash = COOKIEHASH; 
    500         } else { 
    501                 $sitecookiepath = preg_replace('|https?://[^/]+|i', '', $siteurl . '/' ); 
    502                 $cookiehash = md5($siteurl); 
    503         } 
    504  
    505         if ( $remember ) 
    506                 $expire = time() + 31536000; 
    507         else 
    508                 $expire = 0; 
    509  
    510         setcookie(USER_COOKIE, $username, $expire, $cookiepath, COOKIE_DOMAIN); 
    511         setcookie(PASS_COOKIE, $password, $expire, $cookiepath, COOKIE_DOMAIN); 
    512  
    513         if ( $cookiepath != $sitecookiepath ) { 
    514                 setcookie(USER_COOKIE, $username, $expire, $sitecookiepath, COOKIE_DOMAIN); 
    515                 setcookie(PASS_COOKIE, $password, $expire, $sitecookiepath, COOKIE_DOMAIN); 
    516         } 
     527        wp_set_auth_cookie($user->ID, $remember); 
    517528} 
    518529endif; 
    519530 
    520531if ( !function_exists('wp_clearcookie') ) : 
    521532function wp_clearcookie() { 
     533        setcookie(AUTH_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); 
     534        setcookie(AUTH_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); 
     535 
     536        // Old cookies 
    522537        setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); 
    523538        setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); 
    524539        setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); 
     
    697712        if ( empty($salt) ) 
    698713                $salt = DB_PASSWORD . DB_USER . DB_NAME . DB_HOST . ABSPATH; 
    699714 
    700         return $salt; 
     715        if ( ! defined('SECRET_KEY') ) 
     716                $secret_key = 'shhhh'; 
     717        else 
     718                $secret_key = SECRET_KEY; 
     719                 
     720        return $salt . $secret_key; 
    701721} 
    702722endif; 
    703723 
  • wp-config-sample.php

     
    66define('DB_HOST', 'localhost');    // 99% chance you won't need to change this value 
    77define('DB_CHARSET', 'utf8'); 
    88define('DB_COLLATE', ''); 
     9define('SECRET_KEY', 'shhhh'); // Change this to something unique 
    910 
    1011// You can have multiple installations in one database if you give each a unique prefix 
    1112$table_prefix  = 'wp_';   // Only numbers, letters, and underscores please! 
  • wp-settings.php

     
    186186} 
    187187 
    188188if ( !defined('USER_COOKIE') ) 
    189         define('USER_COOKIE', 'wordpressuser_'. COOKIEHASH); 
     189        define('USER_COOKIE', 'wordpressuser_' . COOKIEHASH); 
    190190if ( !defined('PASS_COOKIE') ) 
    191         define('PASS_COOKIE', 'wordpresspass_'. COOKIEHASH); 
     191        define('PASS_COOKIE', 'wordpresspass_' . COOKIEHASH); 
     192if ( !defined('AUTH_COOKIE') ) 
     193        define('AUTH_COOKIE', 'wordpress_' . COOKIEHASH); 
    192194if ( !defined('TEST_COOKIE') ) 
    193195        define('TEST_COOKIE', 'wordpress_test_cookie'); 
    194196if ( !defined('COOKIEPATH') )