Make WordPress Core

Changeset 46472


Ignore:
Timestamp:
10/14/2019 10:50:41 AM (5 years ago)
Author:
SergeyBiryukov
Message:

Formatting: In wp_validate_redirect(), normalize the path when validating the location for relative URLs, to account for Windows paths.

Props peterwilsoncc, rconde, jmmathc, mat-lipe, Sixes, justinahinon, cmagrin, daxelrod, SergeyBiryukov.
Fixes #47980.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/pluggable.php

    r46467 r46472  
    14191419            if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
    14201420                $path = dirname( parse_url( 'http://placeholder' . $_SERVER['REQUEST_URI'], PHP_URL_PATH ) . '?' );
     1421                $path = wp_normalize_path( $path );
    14211422            }
    14221423            $location = '/' . ltrim( $path . '/', '/' ) . $location;
  • trunk/tests/phpunit/tests/formatting/redirect.php

    r46462 r46472  
    142142        );
    143143    }
     144
     145    /**
     146     * @ticket 47980
     147     * @dataProvider relative_url_provider
     148     */
     149    function test_wp_validate_redirect_relative_url( $current_uri, $url, $expected ) {
     150        // Backup the global.
     151        $unset = false;
     152        if ( ! isset( $_SERVER['REQUEST_URI'] ) ) {
     153            $unset = true;
     154        } else {
     155            $backup_request_uri = $_SERVER['REQUEST_URI'];
     156        }
     157
     158        // Set the global to current URI.
     159        $_SERVER['REQUEST_URI'] = $current_uri;
     160
     161        $this->assertEquals( $expected, wp_validate_redirect( $url, false ) );
     162
     163        // Delete or reset the global as required.
     164        if ( $unset ) {
     165            unset( $_SERVER['REQUEST_URI'] );
     166        } else {
     167            $_SERVER['REQUEST_URI'] = $backup_request_uri;
     168        }
     169    }
     170
     171    /**
     172     * Data provider for test_wp_validate_redirect_relative_url.
     173     *
     174     * @return array[] {
     175     *      string Current URI (i.e. path and query string only).
     176     *      string Redirect requested.
     177     *      string Expected destination.
     178     * }
     179     */
     180    function relative_url_provider() {
     181        return array(
     182            array(
     183                '/',
     184                'wp-login.php?loggedout=true',
     185                '/wp-login.php?loggedout=true',
     186            ),
     187            array(
     188                '/src/',
     189                'wp-login.php?loggedout=true',
     190                '/src/wp-login.php?loggedout=true',
     191            ),
     192            array(
     193                '/wp-admin/settings.php?page=my-plugin',
     194                './settings.php?page=my-plugin',
     195                '/wp-admin/./settings.php?page=my-plugin',
     196            ),
     197            array(
     198                '/wp-admin/settings.php?page=my-plugin',
     199                '/wp-login.php',
     200                '/wp-login.php',
     201            ),
     202            array(
     203                '/wp-admin/settings.php?page=my-plugin',
     204                '../wp-admin/admin.php?page=my-plugin',
     205                '/wp-admin/../wp-admin/admin.php?page=my-plugin',
     206            ),
     207            array(
     208                '/2019/10/13/my-post',
     209                '../../',
     210                '/2019/10/13/../../',
     211            ),
     212            array(
     213                '/2019/10/13/my-post',
     214                '/',
     215                '/',
     216            ),
     217        );
     218    }
    144219}
Note: See TracChangeset for help on using the changeset viewer.