WordPress.org

Make WordPress Core


Ignore:
Timestamp:
01/22/2013 10:32:59 PM (8 years ago)
Author:
nacin
Message:

Validate pingback source URIs. Less verbose errors.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3.4/wp-includes/comment.php

    r20569 r23331  
    19131913}
    19141914
     1915/**
     1916 * Default filter attached to pingback_ping_source_uri to validate the pingback's Source URI
     1917 *
     1918 * @since 3.5.1
     1919 *
     1920 * @param string $source_uri
     1921 * @return string
     1922 */
     1923function pingback_ping_source_uri( $source_uri ) {
     1924    $uri = esc_url_raw( $source_uri, array( 'http', 'https' ) );
     1925    if ( ! $uri )
     1926        return '';
     1927
     1928    $parsed_url = @parse_url( $uri );
     1929    if ( ! $parsed_url )
     1930        return '';
     1931
     1932    if ( isset( $parsed_url['user'] ) || isset( $parsed_url['pass'] ) )
     1933        return '';
     1934
     1935    if ( false !== strpos( $parsed_url['host'], ':' ) )
     1936        return '';
     1937
     1938    $parsed_home = @parse_url( get_option( 'home' ) );
     1939
     1940    $same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );
     1941
     1942    if ( ! $same_host ) {
     1943        $host = trim( $parsed_url['host'], '.' );
     1944        if ( preg_match( '#^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $host ) ) {
     1945            $ip = $host;
     1946        } else {
     1947            $ip = gethostbyname( $host );
     1948            if ( $ip === $host ) // Error condition for gethostbyname()
     1949                $ip = false;
     1950        }
     1951        if ( $ip ) {
     1952            if ( '127.0.0.1' === $ip )
     1953                return '';
     1954            $parts = array_map( 'intval', explode( '.', $ip ) );
     1955            if ( 10 === $parts[0] )
     1956                return '';
     1957            if ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )
     1958                return '';
     1959            if ( 192 === $parts[0] && 168 === $parts[1] )
     1960                return '';
     1961        }
     1962    }
     1963
     1964    if ( empty( $parsed_url['port'] ) )
     1965        return $uri;
     1966
     1967    $port = $parsed_url['port'];
     1968    if ( 80 === $port || 443 === $port || 8080 === $port )
     1969        return $uri;
     1970
     1971    if ( $parsed_home && $same_host && $parsed_home['port'] === $port )
     1972        return $uri;
     1973
     1974    return '';
     1975}
     1976
     1977/**
     1978 * Default filter attached to xmlrpc_pingback_error.
     1979 *
     1980 * Returns a generic pingback error code unless the error code is 48,
     1981 * which reports that the pingback is already registered.
     1982 *
     1983 * @since 3.5.1
     1984 * @link http://www.hixie.ch/specs/pingback/pingback#TOC3
     1985 *
     1986 * @param IXR_Error $ixr_error
     1987 * @return IXR_Error
     1988 */
     1989function xmlrpc_pingback_error( $ixr_error ) {
     1990    if ( $ixr_error->code === 48 )
     1991        return $ixr_error;
     1992    return new IXR_Error( 0, '' );
     1993}
     1994
    19151995//
    19161996// Cache
Note: See TracChangeset for help on using the changeset viewer.