python IP格式校验

    校验对于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-9a-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


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


结束!!!


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值