WordPress.org

Make WordPress Core

Ticket #30952: 30952.demo.diff

File 30952.demo.diff, 3.5 KB (added by westonruter, 5 years ago)

Example: escape admin menu item URLs when output

  • src/wp-admin/menu-header.php

    diff --git src/wp-admin/menu-header.php src/wp-admin/menu-header.php
    index c599fd1..59333e3 100644
    function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { 
    127127                                $menu_file = substr( $menu_file, 0, $pos );
    128128                        if ( ! empty( $menu_hook ) || ( ( 'index.php' != $submenu_items[0][2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) {
    129129                                $admin_is_parent = true;
    130                                 echo "<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>";
     130                                $href = esc_url( admin_url( "admin.php?page={$submenu_items[0][2]}" ) );
     131                                echo "<a href='$href'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>";
    131132                        } else {
    132                                 echo "\n\t<a href='{$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>";
     133                                $href = esc_url( $submenu_items[0][2] );
     134                                echo "\n\t<a href='{$href}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>";
    133135                        }
    134136                } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) {
    135137                        $menu_hook = get_plugin_page_hook( $item[2], 'admin.php' );
    function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { 
    138140                                $menu_file = substr( $menu_file, 0, $pos );
    139141                        if ( ! empty( $menu_hook ) || ( ( 'index.php' != $item[2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) {
    140142                                $admin_is_parent = true;
    141                                 echo "\n\t<a href='admin.php?page={$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
     143                                $href = esc_url( admin_url( "admin.php?page={$item[2]}" ) );
     144                                echo "\n\t<a href='$href'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
    142145                        } else {
    143                                 echo "\n\t<a href='{$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
     146                                $href = $item[2];
     147                                if ( ! preg_match( '#^/|^https?:#', $href ) ) {
     148                                        $href = admin_url( $href );
     149                                }
     150                                $href = esc_url( $href );
     151                                echo "\n\t<a href='{$href}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>";
    144152                        }
    145153                }
    146154
    function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { 
    200208                                                $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] );
    201209                                        else
    202210                                                $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' );
    203 
    204                                         $sub_item_url = esc_url( $sub_item_url );
    205                                         echo "<li$class><a href='$sub_item_url'$class>$title</a></li>";
    206211                                } else {
    207                                         echo "<li$class><a href='{$sub_item[2]}'$class>$title</a></li>";
     212                                        $sub_item_url = $sub_item[2];
     213                                }
     214
     215                                if ( ! preg_match( '#^/|^https?:#', $sub_item_url ) ) {
     216                                        $sub_item_url = admin_url( $sub_item_url );
    208217                                }
     218                                $sub_item_url = esc_url( $sub_item_url );
     219                                echo "<li$class><a href='$sub_item_url'$class>$title</a></li>";
    209220                        }
    210221                        echo "</ul>";
    211222                }