PHP中使用crypt()实现用户身份验证的代码

了解crypt()

  只要有一点使用非Windows平台经验的读者都可能对crypt()相当熟悉,这一函数完成被称作单向加密的功能,它可以加密一些明码,但不能反过来将密码重新转换为原来的明码。crypt()函数定义如下。

  string crypt (string input_string [, string salt])

  其中,input_string参数是需要加密的明文字符串,第二个可选的salt是一个位字串,能够影响加密的暗码,进一步排除被破解的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果系统使用的是MD5(参考下一节内容),PHP则会使用一个12个字符的干扰串。可以通过执行下面的命令发现系统将要使用的干扰串的长度。

  print "My system salt size is: ". CRYPT_SALT_LENGTH;

  crypt()支持4种加密算法,表19.1显示了其支持的算法和相应的salt参数的长度。

  表crypt()支持四种加密算法

















算法 Salt长度
CRYPT_STD_DES 2-character (Default)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$

从表面上看,crypt()的函数似乎没有什么用处,但该函数的确被广泛用来保证系统密码的完整性。因为,单向加密的口令即使落入第三方的手里,由于不能被还原为明文,也没有什么大用处。
  用crypt()实现用户身份验证
  上一部分简单介绍了crypt()函数的功能,下面利用其来实现用户的身份验证,其所要实现的目标同19.2.3节所介绍的一致。


代码如下:

<!--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);
?>

示例与上一节所介绍的使用XOR加密算法来保护用户信息非常类似,其核心部分在于第16、17行使用crypt()函数获取加密后的密码,而通过在第25行比较数据库中的密码和加密后的密码是否相等来检查用户是否合法。

  下面,通过一个实例来看一下加密后的密码会变成什么样子。

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

  12tir.zIbWQ3c

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

时间: 2012-09-03

php验证用户名是否以字母开头与验证密码实例

本文实例讲述了php验证用户名是否以字母开头与验证密码的方法.分享给大家供大家参考.具体如下: 验证用户名是否以字母开头与验证密码只能为数字和字母的组合代码,三种常用验证函数:验证邮箱地址格式 ,验证密码只能为数字和字母的组合以及验证用户名是否以字母开头代码,这是用户注册时或提交表单时会用的. 复制代码 代码如下: function is_email($email)  {    if (preg_match("/[a-za-z0-9]+@[a-za-z0-9]+.[a-z]{2,4}/"

php用户注册页面利用js进行表单验证具体实例

复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">     <head>         <meta ht

PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)

前 言 直接上代码有点不厚道.于是按照天朝传统,整段描述吧....(本人语言表达能力有限,大家忍着看) 功 能 在网站注册用户时使用,主要为了无刷新异步验证用户输入的用户名或者Email是否已注册. 这功能大家肯定见过,大多数网站都有的,我一直对这个功能很感兴趣,所以这几天研究了下 jQuery + Ajax 整了一个功能不算完善,但足以应付普通使用的代码 (更牛的功能大家自己去发掘) 文 件 说 明 reg.php //为注册页面 check_user.php //为用户验证页面 (GET,P

php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证

本文实例讲述了php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证的方法.分享给大家供大家参考,具体如下: 在php中,可以使用Header函数做一些有趣的事情,用户验证就是其中一个很有意思的功能.具体用法: Header("WWW-Authenticate: Basic realm="USER LOGIN""); Header("HTTP/1.0 401 Unauthorized"); 在页首设计这两个Hea

注册页面之前先验证用户名是否存在的php代码

reg.php 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-e

php中filter函数验证、过滤用户输入的数据

PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 复制代码 代码如下: //除去html标签,或除去编码特殊字符 var_dump(filter_var("<html>中文ABC@#</html><script>abc</script><b>BBB</b><span>",FILTER_SANITIZE_STRING)); //url_encoded编码

PHP 常用的header头部定义汇总

header() 函数向客户端发送原始的 HTTP 报头. 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题): <?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 header('HTTP/1.1 301 Moved Permanently'); //设置地址被永久的重

php header函数的常用http头设置

//ok header('HTTP/1.1 200 OK'); //设置一个404头: header('HTTP/1.1 404 Not Found'); //设置地址被永久的重定向 header('HTTP/1.1 301 Moved Permanently'); //转到一个新地址 header('Location: http://www.example.org/'); //文件延迟转向: header('Refresh: 10; url=http://www.example.org/');

PHP学习笔记 用户注册模块用户类以及验证码类

所以,把第一章,可重用类的代码贴出来,便于以后查阅以及供给有需要的朋友. :User类,包括读取和设置数据库,以及保存更改交互 复制代码 代码如下: <?php class User{ private $uid; private $fields; public function __construct(){ $this->uid=null; $this->fields=array('username'=>'','password'=>'','emailAddr'=>''

PHP利用header跳转失效的解决方法

本文实例讲述了PHP利用header跳转失效的解决方法,分享给大家供大家参考.具体方法分析如下: 一.问题: 今天header(\"Location: $url\"),以往跳转总是可以的,今天却不动,只是输出结果,以往自己要确认检查,$url的值获取的是否正确,所以在前面加了echo $url:来调试用,结果就导致了header函数的无效. 二.解决方法: 在PHP中用header("location:test.php")进行跳转要注意以下几点: 1.locatio

php用户注册信息验证正则表达式

下面这个正则验证用户名的方法原则是这样的用户名必须是由字母带数字带定划线组成了,下面一起来看看例子吧. 1.检查用户名是否符合规定"两位以上的字母,数字,或者下划线",代码如下: /** * 检查用户名是否符合规定 * * @param STRING $username 要检查的用户名 * @return TRUE or FALSE */ function is_username($username) { $strlen = strlen($username); if (!preg_m

PHP中Header使用的HTTP协议及常用方法小结

本文实例总结了PHP中Header使用的HTTP协议及常用方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: <?PHP function https($num) { $http = array ( 100 => "HTTP/1.1 100 Continue", 101 => "HTTP/1.1 101 Switching Protocols", 200 => "HTTP/1.1 200 OK", 201 =

PHP中header用法小结

本文实例总结了PHP中header用法.分享给大家供大家参考,具体如下: PHP 中 header()函数的作用是给客户端发送头信息. 什么是头信息? 这里只作简单解释,详细的自己看http协议. 在 HTTP协议中,服务器端的回答(response)内容包括两部分:头信息(header) 和 体内容,这里的头信息不是HTML中的<head></head>部分,同样,体内容也不是<BODY>< /BODY>.头信息是用户看不见的,里面包含了很多项,包括:服务

jQuery中:header选择器用法实例

本文实例讲述了jQuery中header选择器用法.分享给大家供大家参考.具体分析如下: 此选择器能够匹配标题元素,即(h1-h6). 语法结构: 复制代码 代码如下: $(":header") 此选择器一般也要和其他选择器配合使用,比如类选择器和元素选择器等等.例如: 复制代码 代码如下: $(".qiantai:header").css("color","blue") 以上代码能够将类名为qiantai的标题元素中的字体颜

Angular中封装fancyBox(图片预览)遇到问题小结

首先在官网下载最新版的fancyBox(一定要去最新网站,以前依赖的jquery版本偏低),附上链接: http://fancyapps.com/fancybox/3/ 然后在项目中引用jquery,然后在引用jquery.fancybox.min.css和jquery.fancybox.min.js. 如果需要动画和鼠标滚轮滚动效果还可以引入他提供的相关工具文件. 1.你可以通过链接.css和.js在你的html文件来安装fancyBox .确保您也加载了jQuery库.以下是用作示例的基本H

探讨php中header的用法详解

 header() is used to send raw HTTP headers. See the HTTP/1.1 specification for more information on HTTP headers. 范例一: 复制代码 代码如下: <?PHPHeader("Location: http://www.jb51.net";); exit;//在每个重定向之后都必须加上"exit",避免发生错误后,继续执行.?> 复制代码 代码如下:

Node.js中Request模块处理HTTP协议请求的基本使用教程

这里来介绍一个Node.js的模块--request.有了这个模块,http请求变的超简单. Request使用超简单,同时支持https和重定向. var request = require('request'); request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // 打印goo

php中header设置常见文件类型的content-type

在PHP中可以通过header函数来发送头信息,还可以设置文件的content-type,下面整理了一些常见文件类型对于的content-type值. //date 2015-06-22 //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/atom+xml'); //CSS header('Content-type: text/css'); //Java

PHP中header和session_start前不能有输出原因分析

在http传输文本中,规定必须 header和content顺序必须是:header在前content在后,并且header的格式必须满足"keyword: value\n"这种格式. 1.在header输出之前有输出内容的话,就会造成对header的错误理解(尽管现在已经能容错了),例如不是满足"keyword: value\n"的格式还好,直接错误了,但是满足"keyword: value\n"这个格式以后,客户端是否安装错误理解,还是按照正

PHP中header函数的用法及其注意事项详解

void header ( string $string [, bool $replace = true [, int $http_response_code ]] ) : Send a raw HTTP header 下面有一些使用header的几种用法: 1.使用header函数进行跳转页面: header('Location:'.$url); 其中$url就是将要跳转的url了. 这种用法的注意事项有以下几点: •Location和":"之间不能有空格,否则会出现错误(注释:我刚

php中header跳转使用include包含解决参数丢失问题

有同事反映,最近上线的几款游戏海外注册载入不了样式文件,需要紧急修复. 注册程序统一走单一入口,核心判断是checkip处,只需要在未实名认证的模板程序处做一个game_id的判断即可.因为太过肯定.急于下班的心理,再加上大家催促的紧张,一下子就蒙了,犯了两个错误:一是game_id的判断位置提前了,导致后面的很多变量没有传到目的页面:二是没有理解header跳转和include包含的涵义,直接用了header做跳转. header跳转后的页面,不能继承上一页的变量等元素,举例说明: a.php