python IP格式校验
2017-06-10 14:35
351 查看
校验对于web开发同学来说,写代码时是必不可少的。
不管前端有没有做校验,后端还是必须得要做校验。出于安全性考虑,可以有效的防止sql注入。
校验其实是一件很无聊的事情,重复写着代码。所以整理出通用的接口还是蛮有必要的。今天贴出一版python的IP校验接口,包括IPv4和IPv6的校验
IPv4:
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也是合法的。
有了上面这些合法的格式,贴上代码:
原理也比较简单,先利用正则匹配,然后在考虑其他特殊情况。
结束!!!
不管前端有没有做校验,后端还是必须得要做校验。出于安全性考虑,可以有效的防止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
原理也比较简单,先利用正则匹配,然后在考虑其他特殊情况。
结束!!!
相关文章推荐
- python和shell实现的校验IP地址合法性脚本分享
- ip和mac地址格式填报校验
- javascript校验ip格式是否正确
- 使用Python获取并处理IP的类型及格式
- 使用Python获取并处理IP的类型及格式方法
- 完美校验带网址、IP网址、FTP等格式的格式(jQuery Validate)
- 使用python 中的IPy 验证IP格式是否合法
- Python 正则表达式匹配ip格式详解
- python和shell实现的校验IP地址合法性脚本分享
- 校验IP格式是否合法正则表达式
- 把IP字串转化为数值格式的SQL Server自定义函数
- [python]学习dpkt-ip.py
- IP包头格式
- TCP/IP 数据包头格式
- IP协议头格式 推荐
- python ip和int 互转函数
- (转)TCP/IP 数据包头格式
- 将CSS样式写为JS格式,以通过W3C校验
- tcp和ip的格式
- IP包头部格式