首页 > 编程知识 正文

身份证校验原理和php实现,php身份证简易验证

时间:2023-12-27 22:28:03 阅读:327212 作者:TZTR

本文目录一览:

php登录系统身份验证

login.html

form id="form1" name="form1" method="post" action="checklogin.php"

table width="400"

tr

th width="27%" scope="row"用户名/th

td width="73%"input name="user_name" type="text" id="user_name" //td

/tr

tr

th scope="row"密码/th

tdinput name="user_pwd" type="password" id="user_pwd" //td

/tr

tr

th scope="row"请填写答案 /th

tdinput name="yzm" type="text" id="yzm" size="5" /

123/td

/tr

tr

td colspan="2" scope="row"div align="center"

input type="submit" name="Submit" value=" 登录 " /

/div/td

/tr

/table

/form

checklogin.php

?php

session_start();

require_once("../include/class/Mysql.class.php");

require_once("../include/class/FuncAdmin.class.php");

require_once("../include/class/Users.class.php");

$db = new Mysql();

$db-getConnection(1);

$db-select_db();

$db-query("set names gb2312");

$f = new FuncAdmin();

if(!empty($_POST['Submit'])){

//判断登录

$user_name = $_POST['user_name'];

$user_pwd = $_POST['user_pwd'];

$yzm = $_POST['yzm'];

//加强验证

//此处很重要但没写出呢cxmcook

if(empty($user_name) || empty($user_pwd)){

$f-alert_back("用户名与密码不能为空!");

}

$user = new Users();

$sql = $user-get_select_sql(" where user_name='".$user_name."' and user_pwd='".$user_pwd."' ");

$rs = $db-query($sql);

$row = $db-fetch_array($rs);

//var_dump($row);

//die("hr");

$rownum = $db-num_rows($rs);

//die('=========='.$rownum);

if( $rownum 0 ){

//$row = $db-fetch_array($rs);

$_SESSION['admin'] = 'admin';

$_SESSION['user_id'] = $row['user_id'];

$_SESSION['user_name'] = $row['user_name'];

$_SESSION['user_realname'] = $row['user_realname'];

$_SESSION['user_last_logintime'] = $row['user_last_logintime'];

$_SESSION['user_last_loginIp'] = $row['user_last_loginIp'];

$_SESSION['user_loginnum'] = $row['user_loginnum'];

//header("Location:index.php");

echo "script

alert('登录成功!".$_SESSION['user_realname']."');

location='index.php';

/script";

}else{

$f-admin_tip("用户名或密码错误!");

}

}

?

PHP正则表达式验证身份证号格式是否正确

$pattern = '/[0-9]{17}([0-9]|X)/'; [0-9]代表0-9中的一个数字,[0-9]{17}代表重复17个数字

([0-9]|X)代表一个数字或者X字符,()代表子表达式,| 代表或者

PHP CRYPT实现密码验证原理是什么?

例:

!--check_user_crypt.php:使用crypt() 函数验证用户----------------

?php

$user_name=$_POST["user_name"];

require_once("sys_conf.inc"); //系统配置文件,包含数据库配置信息

//连接数据库

$link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);

mysql_select_db($DBNAME); //选择数据库my_chat

//查询是否存在登录用户信息

$str="select name,password from user where name ='$user_name'";

$result=mysql_query($str,$link_id); //执行查询

@$rows=mysql_num_rows($result); //取得查询结果的记录笔数

$user_name=$_SESSION["user_name"];

$password=$_POST["password"];

$salt = substr($password, 0, 2);

$password_en=crypt($password,$salt); //使用crypt()对用户密码进行加密

//对于老用户

if($rows!=0)

{

list($name,$pwd)=mysql_fetch_row($result);

//如果密码输入正确

if($pwd==$password_en)

{

$str="update user set is_online =1 where name ='$user_name' and password='$password_en'";

$result=mysql_query($str, $link_id);//执行查询

require("main.php"); //转到聊天页面

}

//密码输入错误

else

{

require("relogin.php");

}

}

//对于新用户,将其信息写入数据库

else

{

$str="insert into user (name,password,is_online) values('$user_ name','$password_en',1)";

$result=mysql_query($str, $link_id); //执行查询

require("main.php"); //转到聊天页面

}

//关闭数据库

mysql_close($link_id);

?

核心部分在于第16、17行使用crypt()函数获取加密后的密码,而通过在第25行比较数据库中的密码和加密后的密码是否相等来检查用户是否合法。

例如,用户名为rock,密码为123456,则加密后的密码为: 12tir.zIbWQ3c

上面就实现了一个简单的用户身份验证系统。在使用crypt()保护重要的机密信息时,需要注意的是,在缺省状态下使用crypt()并不是最安全的,只能用在对安全性要求较低的系统中。

更多问题到后盾网问题求助专区。

如何使用PHP实现身份证是否合法的验证

function is_idcard( $id ) 

  $id = strtoupper($id); 

  $regx = "/(^d{15}$)|(^d{17}([0-9]|X)$)/"; 

  $arr_split = array(); 

  if(!preg_match($regx, $id)) 

  { 

    return FALSE; 

  } 

  if(15==strlen($id)) //检查15位 

  { 

    $regx = "/^(d{6})+(d{2})+(d{2})+(d{2})+(d{3})$/"; 

  

    @preg_match($regx, $id, $arr_split); 

    //检查生日日期是否正确 

    $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 

    if(!strtotime($dtm_birth)) 

    { 

      return FALSE; 

    } else { 

      return TRUE; 

    } 

  } 

  else      //检查18位 

  { 

    $regx = "/^(d{6})+(d{4})+(d{2})+(d{2})+(d{3})([0-9]|X)$/"; 

    @preg_match($regx, $id, $arr_split); 

    $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 

    if(!strtotime($dtm_birth)) //检查生日日期是否正确 

    { 

      return FALSE; 

    } 

    else

    { 

      //检验18位身份证的校验码是否正确。 

      //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 

      $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 

      $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 

      $sign = 0; 

      for ( $i = 0; $i  17; $i++ ) 

      { 

        $b = (int) $id{$i}; 

        $w = $arr_int[$i]; 

        $sign += $b * $w; 

      } 

      $n = $sign % 11; 

      $val_num = $arr_ch[$n]; 

      if ($val_num != substr($id,17, 1)) 

      { 

        return FALSE; 

      } //phpfensi.com 

      else

      { 

        return TRUE; 

      } 

    } 

  } 

  

}

身份证号码尾号的校验码是由什么公式计算出来的

校验码是根据前面十七位数字码,按照ISO

7064:1983.MOD

11-2校验码计算出来的检验码。

具体的公式举例说明为:

某男性公民身份号码本体码为34052419800101001,首先按照公式计算:∑(ai×Wi)(mod

11),其中,i表示号码字符从右至左包括校验码在内的位置序号;

a[i]表示第i位置上的号码字符值;

W[i]示第i位置上的加权因子,其数值依据公式

W[i]

=

2^(i-1)

mod

(11)计算得出。

则,设R=∑(a[i]×W[i])(mod

11)

=

2,同时R的值【0

1

2

3

4

5

6

7

8

9

10】对应取值为【1

X

9

8

7

6

5

4

3

2】。

计算结果为2的校验码为X,所以该人员的公民身份号码应该为

34052419800101001X。

扩展资料:

身份证号码的结构和形式:

1、号码的结构:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

2、地址码:表示编码对象常住户口所在县(县级市、旗、区)的行政区划代码,按GB/T2260的规定执行。

3、出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

4、顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

5、校验码:根据前面十七位数字码,按照ISO

7064:1983.MOD

11-2校验码计算出来的检验码。

参考资料来源:百度百科-身份证号码

参考资料来源:百度百科-身份证校验位

php 身份证 正则 检测是否有效怎么写?

你的正则表达式的规则错了。。当然不能执行啦

这是规则。如果你只是拿来主义,就无视吧。

代码长篇大论,是对你负责;说真的,百度没几个愿意自己写那么多字的人。我第二程序是自己写的,试验过了。可以自动把身份证升级到18位,然后验证。

正则表达式其实是来自数学的概念,后来加入了编程语言。正则表达式验证身份证简单,但是有缺点,你的要求是:验证出身年月日,很可惜,正则没办法验证的太完善。也就是说只要符合规则就是正确(比如19940939之类的出生年月。。。),所以写程序就是为了完善它。话说多了= =不采纳也没办法。我自认为我比楼上的好多了。

?php

$s15="/^[0-9]{15}$/";

//15位正则表达式

$s18="/^[0-9]{6}[1]{1}[9]{1}[0-9]{2}[0-1]{1}[0-9]{1}[0-3]{1}[0-9]{1}[0-9]{3}[0-9X]{1}$/";

//18位正则表达式

$sid="18位或者15位身份证";

if(preg_match($s15,$sid) or preg_match($s18,$sid))

//如果满足这两个条件的其中一个,输出echo

echo 'ok';

else

echo 'no';

?

简单不好用,我花了一个小时写了一个15位转18位然后自动验证的函数:

?php

function check($sid)

{

if(strlen($sid)== 15)

//如果是15身份证,进入自动转换程序,把15位升级到18位

{

$wi=array('7','9','10','5','8','4','2','1','6','3','7','9','10','5','8','4','2','1');

$sid=substr_replace($sid,19,6,0);

$count=array();

for($i=0;$i18;++$i)

{

@$count[$i]=$sid[$i]*$wi[$i];

}

$sum=array_sum($count)%11;

$zuihou=array('1','0','X','9','8','7','6','5','4','3','2');

$sid=substr_replace($sid,$zuihou[$sum],17,0);

//这个sid是18位的。= = 不信你拿自己的身份证(15位)放过来试验,肯定没错。

}

$wi18=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);

$sum2=array();

for($j=0;$j17;$j++)

{

$sum2[$j]=$sid[$j]*$wi18[$j];

}

$sum2=array_sum($sum2)%11;

$yz=array('1','0','X','9','8','7','6','5','4','3','2');

if($yz[$sum2] == $sid[17])

//如果最后一位和验证号一样,则返回真

return true;

else

return false;

}

$sid="18位或者15位身份证";

if(check($sid))

echo '是正确的身份证';

else

echo '身份证不正确';

?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。