WordPress.org

Make WordPress Core

Ticket #36419: 36419.diff

File 36419.diff, 5.8 KB (added by joehoyle, 4 years ago)
  • src/wp-includes/rest-api/class-wp-rest-server.php

    diff --git a/src/wp-includes/rest-api/class-wp-rest-server.php b/src/wp-includes/rest-api/class-wp-rest-server.php
    index 2555696..ebf58de 100644
    a b class WP_REST_Server { 
    303303
    304304                $request = new WP_REST_Request( $_SERVER['REQUEST_METHOD'], $path );
    305305
    306                 $request->set_query_params( $_GET );
    307                 $request->set_body_params( $_POST );
     306                $request->set_query_params( wp_unslash( $_GET ) );
     307                $request->set_body_params( wp_unslash( $_POST ) );
    308308                $request->set_file_params( $_FILES );
    309                 $request->set_headers( $this->get_headers( $_SERVER ) );
     309                $request->set_headers( $this->get_headers( wp_unslash( $_SERVER ) ) );
    310310                $request->set_body( $this->get_raw_data() );
    311311
    312312                /*
  • tests/phpunit/includes/spy-rest-server.php

    diff --git a/tests/phpunit/includes/spy-rest-server.php b/tests/phpunit/includes/spy-rest-server.php
    index 9a1b78a..4ba9017 100644
    a b class Spy_REST_Server extends WP_REST_Server { 
    44
    55        public $sent_headers = array();
    66        public $sent_body = '';
     7        public $last_request = null;
    78
    89        /**
    910         * Get the raw $endpoints data from the server
    class Spy_REST_Server extends WP_REST_Server { 
    2930                $this->sent_headers[ $header ] = $value;
    3031        }
    3132
     33        /**
     34         * Override the dispatch method so we can get a handle on the request object.
     35         *
     36         * @param  WP_REST_Request $request
     37         * @return WP_REST_Response Response returned by the callback.
     38         */
     39        public function dispatch( $request ) {
     40                $this->last_request = $request;
     41                return parent::dispatch( $request );
     42        }
     43
    3244        public function serve_request( $path = null ) {
    3345
    3446                ob_start();
  • tests/phpunit/tests/rest-api/rest-server.php

    diff --git a/tests/phpunit/tests/rest-api/rest-server.php b/tests/phpunit/tests/rest-api/rest-server.php
    index 5344875..21fc61c 100644
    a b class Tests_REST_Server extends WP_Test_REST_TestCase { 
    743743                }
    744744        }
    745745
     746        public function test_serve_request_url_params_are_unslashed() {
     747
     748                $this->server->register_route( 'test', '/test/(?P<data>.*)', array(
     749                        array(
     750                                'methods'  => WP_REST_Server::READABLE,
     751                                'callback' => '__return_false',
     752                                'args'     => array(
     753                                        'data' => array(),
     754                                ),
     755                        ),
     756                ) );
     757
     758                $result = $this->server->serve_request( '/test/data\\with\\slashes' );
     759                $url_params = $this->server->last_request->get_url_params();
     760                $this->assertEquals( 'data\\with\\slashes', $url_params['data'] );
     761        }
     762
     763        public function test_serve_request_query_params_are_unslashed() {
     764
     765                $this->server->register_route( 'test', '/test', array(
     766                        array(
     767                                'methods'  => WP_REST_Server::READABLE,
     768                                'callback' => '__return_false',
     769                                'args'     => array(
     770                                        'data' => array(),
     771                                ),
     772                        ),
     773                ) );
     774
     775                // WordPress internally will slash the superglobals on bootstrap
     776                $_GET = wp_slash( array(
     777                        'data' => 'data\\with\\slashes',
     778                ) );
     779
     780                $result = $this->server->serve_request( '/test' );
     781                $query_params = $this->server->last_request->get_query_params();
     782                $this->assertEquals( 'data\\with\\slashes', $query_params['data'] );
     783        }
     784
     785        public function test_serve_request_body_params_are_unslashed() {
     786
     787                $this->server->register_route( 'test', '/test', array(
     788                        array(
     789                                'methods'  => WP_REST_Server::READABLE,
     790                                'callback' => '__return_false',
     791                                'args'     => array(
     792                                        'data' => array(),
     793                                ),
     794                        ),
     795                ) );
     796
     797                // WordPress internally will slash the superglobals on bootstrap
     798                $_POST = wp_slash( array(
     799                        'data' => 'data\\with\\slashes',
     800                ) );
     801
     802                $result = $this->server->serve_request( '/test/data' );
     803
     804                $body_params = $this->server->last_request->get_body_params();
     805                $this->assertEquals( 'data\\with\\slashes', $body_params['data'] );
     806        }
     807
     808        public function test_serve_request_json_params_are_unslashed() {
     809
     810                $this->server->register_route( 'test', '/test', array(
     811                        array(
     812                                'methods'  => WP_REST_Server::READABLE,
     813                                'callback' => '__return_false',
     814                                'args'     => array(
     815                                        'data' => array(),
     816                                ),
     817                        ),
     818                ) );
     819
     820                $_SERVER['HTTP_CONTENT_TYPE'] = 'application/json';
     821                $GLOBALS['HTTP_RAW_POST_DATA'] = json_encode( array(
     822                        'data' => 'data\\with\\slashes',
     823                ) );
     824
     825                $result = $this->server->serve_request( '/test' );
     826                $json_params = $this->server->last_request->get_json_params();
     827                $this->assertEquals( 'data\\with\\slashes', $json_params['data'] );
     828        }
     829
     830        public function test_serve_request_file_params_are_unslashed() {
     831
     832                $this->server->register_route( 'test', '/test', array(
     833                        array(
     834                                'methods'  => WP_REST_Server::READABLE,
     835                                'callback' => '__return_false',
     836                                'args'     => array(
     837                                        'data' => array(),
     838                                ),
     839                        ),
     840                ) );
     841
     842                // WordPress internally will slash the superglobals on bootstrap
     843                $_FILES = array(
     844                        'data' => array(
     845                                'name' => 'data\\with\\slashes',
     846                        ),
     847                );
     848
     849                $result = $this->server->serve_request( '/test/data\\with\\slashes' );
     850                $file_params = $this->server->last_request->get_file_params();
     851                $this->assertEquals( 'data\\with\\slashes', $file_params['data']['name'] );
     852        }
     853
     854        public function test_serve_request_headers_are_unslashed() {
     855
     856                $this->server->register_route( 'test', '/test', array(
     857                        array(
     858                                'methods'  => WP_REST_Server::READABLE,
     859                                'callback' => '__return_false',
     860                                'args'     => array(
     861                                        'data' => array(),
     862                                ),
     863                        ),
     864                ) );
     865
     866                // WordPress internally will slash the superglobals on bootstrap
     867                $_SERVER['HTTP_X_MY_HEADER'] = wp_slash( 'data\\with\\slashes' );
     868
     869                $result = $this->server->serve_request( '/test/data\\with\\slashes' );
     870                $this->assertEquals( 'data\\with\\slashes', $this->server->last_request->get_header( 'x_my_header') );
     871        }
     872
    746873        public function filter_wp_rest_server_class() {
    747874                return 'Spy_REST_Server';
    748875        }