想了好久,不知道取什么标题,姑且暂时定这个标题吧。
在笔者的测试经历中,曾遇到过这样一个案例 身份证校验 输入15个1 能校验通过。笔者曾经试图打算当bug 反馈给研发,但凭借着职业敏感,决定尝试输入其他的测试条件 18个1 ,15个2进行尝试, 结果在我的预料之中,这2次的输入测试是不合法的。那么问题来了,这15个1是否属于合法身份证? 带着这些疑问,笔者开始寻找真相。
首先在网上的一些身份证校验的网站上,大多数是认可15个1 是合法的,少部分网站认为不合法,然而网上的一些技术党们争论不休。 回到这,我们不妨看一下身份证的验证规则 前6位 地区码 以此代表省 市 区(县) 。中间8(6)位 是我们的出生年月日,剩下的是3位为顺序码 。其中18位身份证中的最后一位为校验码。倒数第二位为性别,这里对这个不在阐述。由于顺序码的产生是随机的,所以也不做讨论。
回到正题15位的身份证号(15个1)是否合法呢?接下来给大家看一张图:
看到这,可能很多朋友明白了,自己的身份证的最后一位是怎么来的了,不妨自己可以对照这张表,自己计算试试。 以本文的例子来说通过计算得到最后的和为108 除以11 得到的余数为9.8 那么对应的数为3 那么这个15位号码转换为18为既为: 11111119111111113 单从计算规则来看 ,那么这个在理论上是成立(合法)的, 我们现在把这个放到部分查询网站上去验证,得到的结果是通过的,但也有部分是不通过的,那么剩下的唯一可能性就是地区码的可能性了。 下一步笔者找了一些地区的地区码做进一步的验证。
北京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、台湾(886)71、香港(852) 81、澳门(853) 82。 (这些只是省份代码)
下面我以北京以及湖南怀化的二个地区码为例:
110101 19111111 1113 、 431281 19111111 1113 在各大查询网站均查询通过。由于6个1的地区码并为在度娘中查到,因此如果严格按照身份验证的规则来说的话,本案例所说的15个1这条身份证号码是不存在的了。
接下来我想讨论的是,需求是否一定要求严格的身份校验。 其次如果判断前面的地区码的话,如果有的县升级为市,部分区合并等等,可能会使用新的地区码,那么这个时候,是否在对程序进行判断,更改呢? 这样岂不是更麻烦? 其次这样带来的好处,以及做这个功能所带来的开发代码以及测试成本,整个之间的关系值得思考。
写在文末:
如果你要好的建议和想法,或者测试途中遇到的趣事欢迎一起交流和讨论。