如何用php和mysql创建一个安全的会话管理系统(create a secure session management system in php and mysql)

本指南将向您展示如何在mySQL数据库中安全地存储会话。我们还将对进入数据库的所有会话数据进行加密,这意味着如果有人试图侵入数据库,所有会话数据都将通过256位AES加密进行加密。...

方法1方法1/3:配置mysql数据库

  1. 1创建一个MySQL数据库。在本指南中,我们将创建一个名为“安全会话”的数据库。请参见如何在phpMyAdmin中创建-a-Database-in-phpMyAdmin。也可以使用下面的SQL代码为您创建一个。创建数据库代码:创建数据库“安全会话”;注意:有些托管服务不允许您通过phpMyAdmin创建数据库,请学习如何在cPanel中创建数据库。
  2. Image titled 2238751 1
  3. 2创建仅具有选择、插入和删除权限的用户。这意味着,如果我们的脚本中存在安全漏洞,黑客就无法从我们的数据库中删除表。如果你真的很偏执,为每个函数创建一个不同的用户。用户:“sec_用户”密码:“eKcGZr59zAa2BEWU”创建用户代码:创建用户“sec_用户”@“本地主机”,由“eKcGZr59zAa2BEWU”标识;在“安全会话”上授予选择、插入、更新和删除权限。*至“secu user”@“localhost”;注意:在自己的服务器上运行时,最好更改上面代码中的密码。(确保您也更改了PHP代码。)记住,它不需要是你能记住的密码,所以make尽可能复杂。这是一个随机密码生成器。
  4. Image titled 2238751 2
  5. 3创建一个名为“sessions”的MySQL表。下面的代码创建了一个包含4个字段(id、set_time、data、session_key)的表。创建“sessions”表:创建表`sessions`(`id`char(128)NOT NULL,`set_time`char(10)NOT NULL,`data`text NOT NULL,`session_key`char(128)NOT NULL,主键(`id`)ENGINE=InnoDB DEFAULT CHARSET=latin1;我们对已知长度的字段使用CHAR数据类型,因为字段“id”和“session_key”的长度始终为128个字符。在这里使用CHAR可以节省处理能力。
  6. Image titled 2238751 3

方法2方法2/3:创建会话。班php文件

  1. 1创建类。要开始一个新的课程,你需要输入下面的代码:new class:class session{
  2. Image titled 2238751 4
  3. 2创建构造函数。每次使用“会话”类创建对象的新实例时,都会调用此函数。你可以在这里阅读PHP _构造函数。这个函数设置我们的自定义会话处理程序,以便在实例化类(即,make/build/constructed)时可以使用它__构造函数:function _construct(){//设置自定义会话函数。会话_set _save _处理程序(数组($this,'open')、数组($this,'close')、数组($this,'read')、数组($this,'write')、数组($this,'destroy')、数组($this,'gc');//当使用对象作为保存处理程序时,此行可防止意外影响。注册_shutdown _函数('session write _close'))
  4. Image titled 2238751 5
  5. 3创建启动会话功能。每次启动新会话时都会调用此函数,请使用它而不是会话_start();。查看代码中的注释,了解每一行的作用。start_session函数:函数start_session($session_name,$secure){//确保会话cookie不能通过javascript访问。$httponly=true;//用于会话的哈希算法。(使用Hash_algos()获取可用哈希的列表。)$session_Hash='sha512';//如果(在_数组($session_Hash,Hash_algos())中){//设置has函数。ini_Set('session.hash_function',$session_hash);}/哈希的每个字符有多少位。//可能的值是'4'(0-9,a-f),'5'(0-9,a-v)和'6'(0-9,a-z,a-z,“-”,“,”)。ini_集合('session.hash_bits_per_character',5);//强制会话仅使用cookie,而不是URL变量。ini_set('会话。仅使用_cookies',1);//获取会话cookie参数$cookieParams=session_Get_cookie_params();//设置参数session_Set_cookie_params($cookieParams[“lifetime”],$cookieParams[“path”],$cookieParams[“domain”],$secure,$httponly);//更改会话名称session_name($session_name);//现在我们启动会话_start();/此行将重新生成会话并删除旧会话。//它还会在数据库中生成一个新的加密密钥。会话_重新生成_id(true);}
  6. Image titled 2238751 6
  7. 4创建开放功能。当我们启动一个新的会话时,PHP会话将调用这个函数,我们使用它来启动一个新的数据库连接。open function:function open(){$host='localhost';$user='sec_user';$pass='eKcGZr59zAa2BEWU';$name='secure_sessions';$mysqli=new mysqli($host,$user,$pass,$name);$this->db=$mysqli;return true;}
  8. Image titled 2238751 7
  9. 5创建关闭功能。当会话需要关闭时,将调用此函数。关闭函数:函数close(){$this->db->close();return true;}
  10. Image titled 2238751 8
  11. 6创建读取功能。当我们试图访问一个会话时,例如当我们使用echo$_session['something']时,PHP将调用这个函数;。因为在一个页面上可能会有许多对这个函数的调用,所以我们利用了预先准备好的语句,不仅是为了安全,也是为了性能。我们只需准备一次语句,就可以执行多次。我们还对数据库中加密的会话数据进行解密。我们在会话中使用256位AES加密。read function:function read($id){if(!isset($this->read_stmt)){$this->read_stmt=$this->db->prepare(“从id=?LIMIT 1)的会话中选择数据”)}$这个->阅读_stmt->绑定参数('s',$id)$这个->阅读_stmt->执行()$这个->阅读_stmt->存储结果()$这个->阅读_stmt->绑定结果($data)$这个->阅读_stmt->fetch()$key=$this->getkey($id)$数据=$this->解密($data,$key);返回$data;}
  12. Image titled 2238751 9
  13. 7创建写函数。当我们为会话赋值时,可以使用这个函数,例如$_session['something']='something';。该函数对插入数据库的所有数据进行加密。write函数:函数write($id,$data){//Get unique key$key=$this->getkey($id);//加密数据$data=$this->Encrypt($data,$key);$time=time();if(!isset($this->w_stmt)){$this->w_stmt=$this->db->prepare(“替换为会话(id,set_time,data,session key)值(?,,,,,,,?)”)$这个->w_stmt->绑定参数('siss',$id,$time,$data,$key)$这个->w_stmt->执行();返回true;}
  14. Image titled 2238751 10
  15. 8.创建销毁功能。该函数从数据库中删除会话,php在调用session__destroy()等函数时使用该函数;。destroy function:function destroy($id){if(!isset($this->delete_stmt)){$this->delete_stmt=$this->db->prepare(“从id=?”的会话中删除”)}$这个->删除_stmt->绑定参数('s',$id)$这个->删除_stmt->执行();返回true;}
  16. Image titled 2238751 11
  17. 9创建gc(垃圾收集器)函数。此函数是垃圾收集器函数,它被调用以删除旧会话。调用此函数的频率由两个配置指令session决定。gc_概率和会话。除数。gc()函数:函数gc($max){if(!isset($this->gc_stmt)){$this->gc_stmt=$this->db->prepare(“从设置时间的会话中删除”)$旧=时间()-$max$这个->gc_stmt->绑定参数('s',$old)$这个->gc_stmt->执行();返回true;}
  18. Image titled 2238751 12
  19. 10创建getKey函数。此函数用于从会话表中获取用于加密的唯一密钥。如果没有会话,它只返回一个新的随机密钥进行加密。getkey()函数:私有函数getkey($id){if(!isset($this->key_stmt)){$this->key_stmt=$this->db->prepare(“从id=?LIMIT 1)的会话中选择会话_key”);}$这个->关键时刻->绑定参数('s',$id)$这个->关键时刻->执行()$这个->关键时刻->存储结果();如果($this->key_stmt->num_rows==1){$this->key_stmt->bind_result($key);$this->key_stmt->fetch();return$key;}else{$random_key=hash('sha512',uniqid(mt_rand(1,mt_getrandmax()),true));返回$random_key;}
  20. Image titled 2238751 13
  21. 11创建加密和解密函数。这些函数对会话的数据进行加密,它们使用数据库中的加密密钥,每个会话的加密密钥不同。我们在加密中不直接使用该密钥,但我们使用它使密钥散列更加随机。encrypt()和decrypt()函数:私有函数encrypt($data,$key){$salt='cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $key=substr(散列('sha256',$salt.$key.$salt),0,32)$iv_size=mcrypt_get_iv_size(mcrypt_RIJNDAEL_256,mcrypt_MODE_ECB)$iv=mcrypt_create_iv($iv_大小,mcrypt_兰德)$encrypted=base64_encode(mcrypt_encrypt(mcrypt_RIJNDAEL_256,$key,$data,mcrypt_MODE_ECB,$iv));返回$encrypted;}私有函数decrypt($data,$key){$salt='cH!swe!retregu7w6bedrup7usuduh9thedhege*ewr4n39=E@rAsp7c-Ph@pH'; $key=substr(散列('sha256',$salt.$key.$salt),0,32)$iv_size=mcrypt_get_iv_size(mcrypt_RIJNDAEL_256,mcrypt_MODE_ECB)$iv=mcrypt_create_iv($iv_大小,mcrypt_兰德)$decrypted=mcrypt_decrypt(mcrypt_RIJNDAEL_256,$key,base64_decode($data),mcrypt_MODE_ECB,$iv)$decrypted=rtrim($decrypted,“\0”);返回$decrypted;}
  22. Image titled 2238751 14
  23. 12下课。在这里,我们只需在括号中结束类:end Class:}
  24. Image titled 2238751 15

方法3方法3/3:创建包含会话的页面

  1. 1使用自定义会话管理器的会话。以下是你将如何开始新的课程;你需要在你想访问会话的每个页面上都包含这个,用它代替会话_start();启动会话:require('session.class.php')$会话=新会话();//如果使用https$session->启动会话(“s”,错误)$_会话['something']=“A value.”;echo$_会话['something'];
  2. Image titled 2238751 16

提示

  • 发表于 2022-03-20 05:22
  • 阅读 ( 77 )
  • 分类:IT

你可能感兴趣的文章

如何用java连接mysql数据库

Java提供JDBC(Java数据库连接),作为JavaSDK(软件开发工具包)的一部分。使用这个API,很容易连接到关系数据库,并执行查询、**、更新和删除记录等常见操作。 ...

  • 发布于 2021-03-11 17:39
  • 阅读 ( 347 )

使用xampp在windows上免费托管和编辑网站

...如果您不想编辑原始代码,或者更愿意使用更熟悉的内容管理系统(CMS),WordPress也会在一个易于使用的ZIP文件中提供其出色的web设计资源!要在XAMPP上安装WordPress,请访问WordPress网站并下载官方应用程序。 ...

  • 发布于 2021-03-14 07:36
  • 阅读 ( 245 )

如何创建虚拟web开发环境和服务器

...合适的安装程序。 在本地目录树结构中,创建一个新文件夹来存放该框。(从属于您的用户配置文件的位置工作得很好,而系统目录中的位置通常不工作。) ...

  • 发布于 2021-03-15 21:34
  • 阅读 ( 242 )

如何用旧计算机构建linux网络服务器

... 如何用linux**自己的web服务器 ...

  • 发布于 2021-03-17 19:20
  • 阅读 ( 277 )

如何在raspberry pi上托管wordpress站点

...。这就是你所需要的所有服务一个HTML页面,静态或动态创建的PHP。 ...

  • 发布于 2021-03-21 11:33
  • 阅读 ( 252 )

如何设置自己的wamp服务器

...环境。WAMP服务器不需要访问Apache、MySQL和PHP服务器,而是创建一个本地环境。本地环境允许web开发人员离线继续工作,并在将特性推出到实时环境之前测试它们。(下面介绍如何创建虚拟web开发环境。) ...

  • 发布于 2021-03-23 15:33
  • 阅读 ( 275 )

什么是wordpress开发者?5种必备技能

WordPress被许多不同的公司用于内容管理系统。因此,对WordPress开发人员的需求越来越大。你甚至可能看过这些职位的招聘广告。 ...

  • 发布于 2021-03-26 19:49
  • 阅读 ( 470 )

如何使用ampps在pc上本地安装joomla

...据或使站点不可用的情况下出错。 您可以学习新的内容管理系统(CMS),如WordPress、Joomla和Drupal,而无需在web托管上花费任何资金。 软件解决方案包 在Windows和Mac操作系统上安装本地服务器在过去是一个痛苦而混乱的过程(Un...

  • 发布于 2021-04-10 10:15
  • 阅读 ( 293 )

如何把你家的ubuntu电脑变成lamp网络服务器

...多信息。 既然你有了自己的web服务器,为什么不学习如何用ThinkUp存档、搜索和查看你的Tweet统计数据呢?

  • 发布于 2021-04-13 01:58
  • 阅读 ( 264 )

sql语句(sql)和mysql数据库(mysql)的区别

...理关系数据库中的数据,而MySQL是一种开源的关系数据库管理系统,用于帮助管理关系数据库。 数据库是数据的集合。有各种类型的数据库。一种常见的数据库类型是关系数据库。SQL代表结构化查询语言,是对关系数据库中的数...

  • 发布于 2021-06-30 18:44
  • 阅读 ( 428 )
_Serenity
_Serenity

0 篇文章

相关推荐