您的位置:首页 > 编程语言 > Python开发

python IP格式校验

2017-06-10 14:35 351 查看
    校验对于web开发同学来说,写代码时是必不可少的。

    不管前端有没有做校验,后端还是必须得要做校验。出于安全性考虑,可以有效的防止sql注入。

    校验其实是一件很无聊的事情,重复写着代码。所以整理出通用的接口还是蛮有必要的。今天贴出一版python的IP校验接口,包括IPv4和IPv6的校验

IPv4:

def validate_ip(ip_str):
sep = ip_str.split('.')
if len(sep) != 4:
return False
for i,x in enumerate(sep):
try:
int_x = int(x)
if int_x < 0 or int_x > 255:
return False
except ValueError, e:
return False
return True


IPv4校验较简单,原理如上述代码,以“.”分割一下,然后对每位进行范围校验,不在0~255的就校验失败。

IPv6:

IPv6地址大小为128位。首选的 IPv6 地址表示为:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,其中每个 x 是代表一个
4 位的十六进制数字。

v6相比较v4的话,稍微复杂。首先,我们要明白IPv6有哪些格式都属于合法的:

1. 正常情况

FFFF:0000:0000:FFFF:FFFF:FFFF:FFFF;FFFF

2.前导0省略:

如:

FFFF:0000:0000:0FFF:FFFF:FFFF:FFFF;FFFF,可以写成:

FFFF:0:0:FFF:FFFF:FFFF:FFFF;FFFF

3.双冒号形式:

如:

FFFF:0000:0000:0FFF:FFFF:FFFF:FFFF;FFFF,可以写成:

FFFF::0FFF:FFFF:FFFF:FFFF;FFFF

4.兼容IPv4的IPv6格式:

如:

FFFF:0000:0000:0FFF:FFFF:FFFF:192.168.0.1也是合法的。

有了上面这些合法的格式,贴上代码:

# -*- coding:utf-8 -*-
import os
import sys
import re

def validate_ip(ip_str):
'''
Validate a hexidecimal IPv6 ip address.
:param ip_str: String to validate as a hexidecimal IPv6 ip address.
:type ip_str: str
:returns: ``True`` if a valid hexidecimal IPv6 ip address,
``False`` otherwise.
:raises: TypeError
'''
#:Regex for validating an IPv6 in hex notation
# _HEX_RE_1 = re.compile(r'^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$')
_HEX_RE = re.compile(r'^:{0,1}([0-9a-fA-F]{0,4}:){0,7}[0-9a-fA-F]{0,4}:{0,1}$')
# _HEX_RE = re.compile(r'^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}:{0,1}$')

#:Regex for validating an IPv6 in dotted-quad notation
_DOTTED_QUAD_RE = re.compile(r'^:{0,1}([0-9
4000
a-fA-F]{0,4}:){2,6}(\d{1,3}\.){3}\d{1,3}$')
if _HEX_RE.match(ip_str):
if ':::' in ip_str:
return False
if '::' not in ip_str:
halves = ip_str.split(':')
return len(halves) == 8 and halves[0] != '' and halves[-1] != ''
halves = ip_str.split('::')
if len(halves) != 2:
return False
if halves[0] != '' and halves[0][0] == ':':
return False
if halves[-1] != '' and halves[-1][-1] == ':':
return False
return True

if _DOTTED_QUAD_RE.match(ip_str):
if ':::' in ip_str:
return False
if '::' not in ip_str:
halves = ip_str.split(':')
return len(halves) == 7 and halves[0] != ''
halves = ip_str.split('::')
if len(halves) > 2:
return False
hextets = ip_str.split(':')
quads = hextets[-1].split('.')
for q in quads:
if int(q) > 255 or int(q) < 0:
return False
return True
return False


原理也比较简单,先利用正则匹配,然后在考虑其他特殊情况。

结束!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: