wp_privacy_anonymize_ip() – Return an anonymized IPv4 or IPv6 address.

You appear to be a bot. Output may be restricted

Description

Returns an anonymized IPv4 or IPv6 address.

Usage

$string = wp_privacy_anonymize_ip( $ip_addr, $ipv6_fallback );

Parameters

$ip_addr
( string ) required – The IPv4 or IPv6 address to be anonymized.
$ipv6_fallback
( bool ) optional – Optional. Whether to return the original IPv6 address if the needed functions to anonymize it are not present. Default false, return :: (unspecified address).

Returns

string The anonymized IP address.

Source

File name: wordpress/wp-includes/functions.php
Lines:

1 to 63 of 63
function wp_privacy_anonymize_ip( $ip_addr, $ipv6_fallback = false ) {
  if ( empty( $ip_addr ) ) {
    return '0.0.0.0';
  }

  // Detect what kind of IP address this is.
  $ip_prefix = '';
  $is_ipv6   = substr_count( $ip_addr, ':' ) > 1;
  $is_ipv4   = ( 3 === substr_count( $ip_addr, '.' ) );

  if ( $is_ipv6 && $is_ipv4 ) {
    // IPv6 compatibility mode, temporarily strip the IPv6 part, and treat it like IPv4.
    $ip_prefix = '::ffff:';
    $ip_addr   = preg_replace( '/^\[?[0-9a-f:]*:/i', '', $ip_addr );
    $ip_addr   = str_replace( ']', '', $ip_addr );
    $is_ipv6   = false;
  }

  if ( $is_ipv6 ) {
    // IPv6 addresses will always be enclosed in [] if there's a port.
    $left_bracket  = strpos( $ip_addr, '[' );
    $right_bracket = strpos( $ip_addr, ']' );
    $percent       = strpos( $ip_addr, '%' );
    $netmask       = 'ffff:ffff:ffff:ffff:0000:0000:0000:0000';

    // Strip the port (and [] from IPv6 addresses), if they exist.
    if ( false !== $left_bracket && false !== $right_bracket ) {
      $ip_addr = substr( $ip_addr, $left_bracket + 1, $right_bracket - $left_bracket - 1 );
    } elseif ( false !== $left_bracket || false !== $right_bracket ) {
      // The IP has one bracket, but not both, so it's malformed.
      return '::';
    }

    // Strip the reachability scope.
    if ( false !== $percent ) {
      $ip_addr = substr( $ip_addr, 0, $percent );
    }

    // No invalid characters should be left.
    if ( preg_match( '/[^0-9a-f:]/i', $ip_addr ) ) {
      return '::';
    }

    // Partially anonymize the IP by reducing it to the corresponding network ID.
    if ( function_exists( 'inet_pton' ) && function_exists( 'inet_ntop' ) ) {
      $ip_addr = inet_ntop( inet_pton( $ip_addr ) & inet_pton( $netmask ) );
      if ( false === $ip_addr ) {
        return '::';
      }
    } elseif ( ! $ipv6_fallback ) {
      return '::';
    }
  } elseif ( $is_ipv4 ) {
    // Strip any port and partially anonymize the IP.
    $last_octet_position = strrpos( $ip_addr, '.' );
    $ip_addr             = substr( $ip_addr, 0, $last_octet_position ) . '.0';
  } else {
    return '0.0.0.0';
  }

  // Restore the IPv6 prefix to compatibility mode addresses.
  return $ip_prefix . $ip_addr;
}
 

 View on GitHub View on Trac