diff --git a/lib/models/WebserviceAccessRule.php b/lib/models/WebserviceAccessRule.php
index 120ac471ed3beb74eb722631b2bf451b20fe4167..857830a3abb3cbfa8d67540545b892b920938a6c 100644
--- a/lib/models/WebserviceAccessRule.php
+++ b/lib/models/WebserviceAccessRule.php
@@ -99,18 +99,34 @@ class WebserviceAccessRule extends SimpleORMap
      */
     function checkIpInRange($check_ip)
     {
-        if (!ip2long($check_ip)) {
-            return false;
-        }
+        $ip_addr = inet_pton($check_ip);
+
         if (!count($this->ip_range)) {
             return true;
         }
-        foreach($this->ip_range as $range) {
-            list($ip, $mask) = explode('/', $range);
-            if (!$mask) {
-                $mask = 32;
+        foreach ($this->ip_range as $range) {
+            if (strpos($range, '/') !== false) {
+                list($range, $bits) = explode('/', $range);
+                $range = inet_pton($range) ?: '';
+                $mask = str_repeat(chr(0), strlen($range));
+
+                for ($i = 0; $i < strlen($mask); ++$i) {
+                    if ($bits >= 8) {
+                        $bits -= 8;
+                    } else {
+                        $mask[$i] = chr((1 << 8 - $bits) - 1);
+                        $bits = 0;
+                    }
+                }
+
+                $ip_start = $range & ~$mask;
+                $ip_end = $range | $mask;
+            } else {
+                $ip_start = inet_pton($range);
+                $ip_end = inet_pton($range);
             }
-            if ( (ip2long($check_ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($ip)) {
+
+            if (strcmp($ip_start, $ip_addr) <= 0 && strcmp($ip_addr, $ip_end) <= 0) {
                 return true;
             }
         }