Make WordPress Core

Changeset 55786


Ignore:
Timestamp:
05/16/2023 03:50:47 PM (12 months ago)
Author:
SergeyBiryukov
Message:

Grouped backports to the 4.8 branch.

  • Media: Prevent CSRF setting attachment thumbnails.
  • Embeds: Add protocol validation for WordPress Embed code.

Merges [55763] and [55764] to the 4.8 branch.
Props dd32, isabel_brison, martinkrcho, matveb, ocean90, paulkevan, peterwilsoncc, timothyblynjacobs, xknown, youknowriad.

Location:
branches/4.8
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • branches/4.8/package-lock.json

    r54594 r55786  
    11{
    22    "name": "WordPress",
    3     "version": "4.8.21",
     3    "version": "4.8.22",
    44    "lockfileVersion": 1,
    55    "requires": true,
  • branches/4.8/package.json

    r54594 r55786  
    11{
    22    "name": "WordPress",
    3     "version": "4.8.21",
     3    "version": "4.8.22",
    44    "description": "WordPress is web software you can use to create a beautiful website or blog.",
    55    "repository": {
  • branches/4.8/src/wp-admin/about.php

    r55384 r55786  
    4646        <div class="changelog point-releases">
    4747            <h3><?php _e( 'Maintenance and Security Releases' ); ?></h3>
     48            <p>
     49                <?php
     50                printf(
     51                    /* translators: %s: WordPress version number */
     52                    __( '<strong>Version %s</strong> addressed some security issues.' ),
     53                    '4.8.22'
     54                );
     55                ?>
     56                <?php
     57                printf(
     58                    /* translators: %s: HelpHub URL */
     59                    __( 'For more information, see <a href="%s">the release notes</a>.' ),
     60                    sprintf(
     61                        /* translators: %s: WordPress version */
     62                        esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
     63                        sanitize_title( '4.8.22' )
     64                    )
     65                );
     66                ?>
     67            </p>
    4868            <p>
    4969                <?php
  • branches/4.8/src/wp-admin/includes/ajax-actions.php

    r54568 r55786  
    22552255    }
    22562256
     2257    if ( false === check_ajax_referer( 'set-attachment-thumbnail', '_ajax_nonce', false ) ) {
     2258        wp_send_json_error();
     2259    }
     2260
    22572261    $post_ids = array();
    22582262    // For each URL, try to find its corresponding post ID.
  • branches/4.8/src/wp-includes/js/media/views/frame/video-details.js

    r33337 r55786  
    105105            wp.ajax.send( 'set-attachment-thumbnail', {
    106106                data : {
     107                    _ajax_nonce: wp.media.view.settings.nonce.setAttachmentThumbnail,
    107108                    urls: urls,
    108109                    thumbnail_id: attachment.get( 'id' )
  • branches/4.8/src/wp-includes/js/wp-embed.js

    r39347 r55786  
    3838        var iframes = document.querySelectorAll( 'iframe[data-secret="' + data.secret + '"]' ),
    3939            blockquotes = document.querySelectorAll( 'blockquote[data-secret="' + data.secret + '"]' ),
     40            allowedProtocols = new RegExp( '^https?:$', 'i' ),
    4041            i, source, height, sourceURL, targetURL;
    4142
     
    7273                sourceURL.href = source.getAttribute( 'src' );
    7374                targetURL.href = data.value;
     75
     76                /* Only follow link if the protocol is in the allow list. */
     77                if ( ! allowedProtocols.test( targetURL.protocol ) ) {
     78                    continue;
     79                }
    7480
    7581                /* Only continue if link hostname matches iframe's hostname. */
  • branches/4.8/src/wp-includes/media.php

    r41054 r55786  
    34363436        'captions'  => ! apply_filters( 'disable_captions', '' ),
    34373437        'nonce'     => array(
    3438             'sendToEditor' => wp_create_nonce( 'media-send-to-editor' ),
    3439             'wpRestApi'    => wp_create_nonce( 'wp_rest' ),
     3438            'sendToEditor'           => wp_create_nonce( 'media-send-to-editor' ),
     3439            'wpRestApi'              => wp_create_nonce( 'wp_rest' ),
     3440            'setAttachmentThumbnail' => wp_create_nonce( 'set-attachment-thumbnail' ),
    34403441        ),
    34413442        'post'    => array(
  • branches/4.8/src/wp-includes/version.php

    r54594 r55786  
    55 * @global string $wp_version
    66 */
    7 $wp_version = '4.8.21-src';
     7$wp_version = '4.8.22-src';
    88
    99/**
  • branches/4.8/tests/phpunit/tests/ajax/Attachments.php

    r37288 r55786  
    110110        $this->assertEquals( $expected, $response['data'] );
    111111    }
     112
     113    public function test_wp_ajax_set_attachment_thumbnail_success() {
     114        // Become an administrator.
     115        $post    = $_POST;
     116        $user_id = self::factory()->user->create(
     117            array(
     118                'role'       => 'administrator',
     119                'user_login' => 'user_36578_administrator',
     120                'user_email' => 'user_36578_administrator@example.com',
     121            )
     122        );
     123        wp_set_current_user( $user_id );
     124        $_POST = array_merge( $_POST, $post );
     125
     126        // Upload the attachment itself.
     127        $filename = DIR_TESTDATA . '/uploads/small-audio.mp3';
     128        $contents = file_get_contents( $filename );
     129
     130        $upload     = wp_upload_bits( wp_basename( $filename ), null, $contents );
     131        $attachment = $this->_make_attachment( $upload );
     132
     133        // Upload the thumbnail.
     134        $filename = DIR_TESTDATA . '/images/waffles.jpg';
     135        $contents = file_get_contents( $filename );
     136
     137        $upload    = wp_upload_bits( wp_basename( $filename ), null, $contents );
     138        $thumbnail = $this->_make_attachment( $upload );
     139
     140        // Set up a default request.
     141        $_POST['_ajax_nonce']  = wp_create_nonce( 'set-attachment-thumbnail' );
     142        $_POST['thumbnail_id'] = $thumbnail;
     143        $_POST['urls']         = array( wp_get_attachment_url( $attachment ) );
     144
     145        // Make the request.
     146        try {
     147            $this->_handleAjax( 'set-attachment-thumbnail' );
     148        } catch ( WPAjaxDieContinueException $e ) {
     149            unset( $e );
     150        }
     151
     152        // Get the response.
     153        $response = json_decode( $this->_last_response, true );
     154
     155        // Ensure everything is correct.
     156        $this->assertTrue( $response['success'] );
     157    }
     158
     159    public function test_wp_ajax_set_attachment_thumbnail_missing_nonce() {
     160        // Become an administrator.
     161        $post    = $_POST;
     162        $user_id = self::factory()->user->create(
     163            array(
     164                'role'       => 'administrator',
     165                'user_login' => 'user_36578_administrator',
     166                'user_email' => 'user_36578_administrator@example.com',
     167            )
     168        );
     169        wp_set_current_user( $user_id );
     170        $_POST = array_merge( $_POST, $post );
     171
     172        // Upload the attachment itself.
     173        $filename = DIR_TESTDATA . '/uploads/small-audio.mp3';
     174        $contents = file_get_contents( $filename );
     175
     176        $upload     = wp_upload_bits( wp_basename( $filename ), null, $contents );
     177        $attachment = $this->_make_attachment( $upload );
     178
     179        // Upload the thumbnail.
     180        $filename = DIR_TESTDATA . '/images/waffles.jpg';
     181        $contents = file_get_contents( $filename );
     182
     183        $upload    = wp_upload_bits( wp_basename( $filename ), null, $contents );
     184        $thumbnail = $this->_make_attachment( $upload );
     185
     186        // Set up a default request.
     187        $_POST['thumbnail_id'] = $thumbnail;
     188        $_POST['urls']         = array( wp_get_attachment_url( $attachment ) );
     189
     190        // Make the request.
     191        try {
     192            $this->_handleAjax( 'set-attachment-thumbnail' );
     193        } catch ( WPAjaxDieContinueException $e ) {
     194            unset( $e );
     195        }
     196
     197        // Get the response.
     198        $response = json_decode( $this->_last_response, true );
     199
     200        // Check that success is false without sending nonce.
     201        $this->assertFalse( $response['success'] );
     202    }
    112203}
Note: See TracChangeset for help on using the changeset viewer.