diff options
author | Fabian Becker <fabian.becker@uni-tuebingen.de> | 2013-09-03 15:40:03 +0400 |
---|---|---|
committer | Fabian Becker <fabian.becker@uni-tuebingen.de> | 2013-09-03 15:40:03 +0400 |
commit | c072a0e5911b544890a39e86c9efe024bb247577 (patch) | |
tree | bc2d7105ea6dbf52514ae477caf4ce809dbb745b /plugins/AnonymizeIP | |
parent | 1e313cdda164281cdf175fdf9fdc1251ae7e1a31 (diff) |
Extend AnonymizeIP to properly mask IPv6 addresses.
maskLength is now interpreted as "mask level" (0-4) and determines the number of bits to be masked.
Level IPv4 IPv6
0 0 0
1 8 64
2 16 80
3 24 104
4 32 n/a
fixes #3710
Diffstat (limited to 'plugins/AnonymizeIP')
-rw-r--r-- | plugins/AnonymizeIP/AnonymizeIP.php | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/plugins/AnonymizeIP/AnonymizeIP.php b/plugins/AnonymizeIP/AnonymizeIP.php index ba0e2c2230..d3c707bddc 100644 --- a/plugins/AnonymizeIP/AnonymizeIP.php +++ b/plugins/AnonymizeIP/AnonymizeIP.php @@ -12,6 +12,7 @@ namespace Piwik\Plugins\AnonymizeIP; use Piwik\Config; use Piwik\Common; +use Piwik\IP; use Piwik\Version; /** @@ -51,22 +52,32 @@ class AnonymizeIP extends \Piwik\Plugin * @param int $maskLength Number of octets to reset * @return string */ - static public function applyIPMask($ip, $maskLength) + public static function applyIPMask($ip, $maskLength) { - $i = Common::strlen($ip); - if ($maskLength > $i) { - $maskLength = $i; - } + // IPv4 or mapped IPv4 in IPv6 + if(IP::isIPv4($ip)) { + $i = Common::strlen($ip); + if ($maskLength > $i) { + $maskLength = $i; + } - while ($maskLength-- > 0) { - $ip[--$i] = chr(0); + while ($maskLength-- > 0) { + $ip[--$i] = chr(0); + } + } else { + $masks = array( + 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', + 'ffff:ffff:ffff:ffff::', + 'ffff:ffff:ffff:0000::', + 'ffff:ff00:0000:0000::' + ); + return $ip & current(unpack('a16', inet_pton($masks[$maskLength]))); } - return $ip; } /** - * Hook on Tracker.Visit.setVisitorIp to anonymize visitor IP addresses + * Hook on Tracker.Visit.setVisitorIp to anomymize visitor IP addresses */ public function setVisitorIpAddress(&$ip) { |