1.简述

最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证,

很多无效的身份证号就成了漏网之鱼。

导致后台存表里很多无效的身份证号,随便输入用户名和身份证号就可以实名成功,这样就存在很多的弊端。

最终我们决定对身份证号进行有效性验证,严谨的剖析身份证号的组成,研究它的生成算法。

当然网上也有很多资源供做参考。https://www.jianshu.com/p/07c7ee44579c(组成规则)

我们就不详细介绍组成规则了,直接用js代码来进行有效性验证。

首先我们要明白现在我们的身份证号有两种:15位和18位,最常见的也就是18位的。但是15位的有效性验证也要兼顾。

2.面向对象的验证方法

//==面向对象方法===验证身份证号是否真实有效
function IdentityCodeValid(id){
this.aCity = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" }; this.iSum = 0;//计算校验位
this.pass = true;//身份证号是否有效标识
this.tip = '';//身份证号无效提示
//console.log(this.sSex) ;//地址,出生年月,性别
this.judgmentIdLength(id);//开始验证
} //检验18位身份证号是否真实有效==面向对象方法
IdentityCodeValid.prototype={
judgmentIdLength:function(code){
/**
===如果是15位则将其转换为18位再进行验证===
15位身份证号码各位的含义:
1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-12位出生年月日,比如670401代表1967年4月1日,与18位的第一个区别;
13-15位为顺序号,其中15位男为单数,女为双数;
与18位身份证号的第二个区别:没有最后一位的验证码。
**/
if(code.length==15){
codeArr = code.split(''); code = code.toString().substr(0,6)+"19"+code.toString().substr(6);
var last = this.computeCheckBit(code);
code = code + last;
//console.log('code=='+code);
//return this.id;
this.codeValid(code); }else{
this.codeValid(code);
}
},
computeCheckBit:function(sId){
//∑(ai×Wi)(mod 11)
//加权因子
var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
//校验位
var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
var sum = 0;
var ai = 0;
var wi = 0;
for (var i = 0; i < 17; i++) {
ai = sId[i];
wi = factor[i];
sum += ai * wi;
}
var last = parity[sum % 11];
console.log(last);
return last;
}, codeValid:function(sId){
this.id = $.trim(sId);//id去空格
this.sBirthday= this.id.substr(6, 4) + "-" + Number(this.id.substr(10, 2)) + "-" + Number(this.id.substr(12, 2));//出生年月
this.sSex = this.aCity[parseInt(this.id.substr(0, 2))] + "," + this.sBirthday + "," + (this.id.substr(16, 1) % 2 ? "男" : "女");
this.sDate = new Date(this.sBirthday.replace(/-/g, "/"));
this.sAddress = this.id.replace(/x$/i, "a");//地址 var iSum;
if(!sId || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/i.test(sId)){ this.tip = "你输入的身份证长度或格式错误!";
this.pass = false; }else if(this.aCity[parseInt(this.sAddress.substr(0, 2))] == null) { this.tip = "你的身份证地区非法!";
this.pass = false; }else if(this.sBirthday != (this.sDate.getFullYear() + "-" + (this.sDate.getMonth() + 1) + "-" + this.sDate.getDate())) {
this.tip = "身份证上的出生日期非法!";
this.pass = false;
}else{ var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
//校验位
var last = this.computeCheckBit(sId);
console.log('==='+last);
if(sId.substr(-1,1)!=last){
console.log(1);
this.tip = "你输入的身份证号校验位错误!";
this.pass = false;
} } if (!this.pass){
//alert(this.tip);
} return this.pass;
}
}

3.new对象进行验证

var idObj = new IdentityCodeValid(id);
console.log(idObj);//打印返回的信息即知是否通过验证

js身份证号有效性验证的更多相关文章

  1. js实现完美身份证号有效性验证

    最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个 ...

  2. js实现完美身份证号有效性验证(转)

    转载自:http://www.cnblogs.com/lzrabbit/archive/2011/10/23/2221643.html 最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验 ...

  3. JavaScript身份证号码有效性验证

    最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个 ...

  4. Python实现身份证号码有效性验证

    # -*- coding: utf-8 -*- import re #Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!' ...

  5. php身份证号的验证

    //身份证号验证 03 protected function checkIdCard(){ 04 if(empty($_POST['idcard'])){ 05 return false; 06 } ...

  6. 【C#】身份证号正确性验证及正则表达式格式验证

    身份证前两位各省对应的编号是: 1.华北地区:北京市|11,天津市|12,河北省|13,山西省|14,内蒙古自治区|15: 2.东北地区: 辽宁省|21,吉林省|22,黑龙江省|23: 3.华东地区: ...

  7. js身份证号、电话脱敏处理(用*替换中间数据)

    数字类型 certificatecodecopy = certificatecode.replace(/^(.{6})(?:\d+)(.{4})$/,  "\$1****\$2") ...

  8. 锋利的js之验证身份证号

    我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构  公民 ...

  9. 身份证号验证js程序

    最近注册一个网站,居然让我输入个人身份证号,身份证号是个人信息,怎么能告诉你呢? 输入正确的身份证号没有任何问题. 我就仅仅改了最后一位,就告诉我身份证号不对,你是怎么知道的呢?所以,搜了下身份证号的 ...

随机推荐

  1. [docker]docker run指定entrypiont

    指定entrypiont 错误的姿势 docker run -itd -v /tmp/:/tmp/ jdk-ori 'java -jar /tmp/sms.jar' 正确的姿势1 docker run ...

  2. 广告过滤神器(ADMuncher)4.93

    Ad Muncher 介绍:        浏览网页时,冷不防地被网站播放的MIDI音乐声音吓一跳,或是因为弹出的广告窗口碍事,而影响你上网络的心情.Ad Muncher支持Netscape.Inte ...

  3. javascript属性详解

    在js中,没有公共属性和私有属性之分,只有全局变量(全局属性)和局部变量以及对象属性.但是,程序员可以通过一定的技巧来实现面向对象语言的功能.下面我们来介绍这几种属性(变量) 全局变量也叫全局属性 / ...

  4. 刚新建好的动态网站项目,创建jsp页面就报错

    拿到刚刚可以运行的Eclipse,就马上想敲码了,但一创建项目之后再创建jsp页面就报错= =! 报错的内容大概为缺乏对应的jar包. 我们常用Tomcat为中间体,而他本身是带有开发jsp网站的对应 ...

  5. SQLServer2008设置开启远程连接

    SQL Server 2008默认是不允许远程连接的,sa帐户默认禁用的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,需要做两个部分的配置:    1,SQL Serve ...

  6. LTP4J的使用BUG及解决方案

    子墨子曾经曰过,LTP是个好模型! car老师oneplus还有bhan开发的LTP4J是个很好的项目,使用起来也非常方便,下面贴几个常见的错误使用引起的bug的log分析 1.现象描述:程序中断,生 ...

  7. eventlet设计模式

    1. 客户端模式(Client Pattern) 一个权威的客户端模式就是网络爬虫,下面例子列出一些站点URL,并尝试检索他们的网页内容以做后续操作 import eventlet from even ...

  8. jvm之 国际酒店 一次报表 load数据死循环导致的FULLGC

    从目前这几天的运行情况看,每天晚上0点到3点,应该是你们那边有大数据任务处理,在这个时间段,SOA会频繁报ZK断开重联的告警,见下图.   类似的问题,在CRM系统上也有出现过,我们dump内存,分析 ...

  9. VC++调节显示器的亮度SetDeviceGammaRamp

    出处:http://www.nirsoft.net/vc/change_screen_brightness.html SetDeviceGammaRamp API函数位于Gdi32.ll中,接收一个2 ...

  10. MAMP下配置虚拟主机域名

    第一步:修改虚拟主机地址: /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf 第二步: