PHP学习笔记之cookie和session验证
Cookie和Session算是网站登陆验证的常用手段了。不管论坛也好,微博也好,它们都依赖于cookie和session以完成各项工作。
这里就不具体介绍Cookie和Session的概念了,我们可以简单的把它们理解为临时钥匙,用于开启不同的网络资源。
下面开始介绍在PHP里如何操作Cookie和Session。
Cookie:
在PHP里,我们可以使用setcookie()函数来设置cookie。但特别注意,setcookie函数必须置于<html>标签之前。setcookie函数包含了一下几个参数:setcookie(name, value, expire, path, domain)。name参数是用来规定cookie的名称的,而value则是规定对应名称cookie的值,expire则是设定cookie有效期的。特别注意path和domain参数可选的。(path是规定cookie的服务器路径,而domain是规定cookie的所有域名)。
一般我们这样设置cookie
设置cookie
代码如下 | 复制代码 |
<?php
|
username就是我们cookie的名字了,而Ku_Andrew则是username的值,time()+3600就是一小时后该cookie过期。
现在我们用$_COOKIE来做一个实例
设置、读取cookie
代码如下 | 复制代码 |
<?php
|
如果想做出更复杂的判断,例如用户登陆等,我们可以在IF语句中的加入从数据库从检索出来的值。
Session:
与Cookie不同,Session是保存在服务器上的,同时Session会随着浏览器的关闭而自动灭亡,生命周期较短。在PHP上,我们使用session_start()函数来启动session;与设置cookie相同,我们必须在<html>标签之前使用这个函数。使用这个函数之后我们就可以开始设置我们的Session变量了。方法也是极为简单:用$_SESSION数组直接定义。完成了定义,在不使用的时候为了节约服务器资源,我们要关闭它。这时可以使用unset()函数或者session_destroy()函数;unset()是解除变量,session_destroy()则是彻底终结session。下面是代码片段。
Session设置、读取
代码如下 | 复制代码 |
<?php |
这是一个简单的网页计数器,通过设置pid来实现计数。第一次判断中,如果session为空,那么设置成一,并且读取session,反馈给用户。以后的每次访问,都会在原有session的基础上逐次加一反馈给用户。
开始觉得这玩意很简单,结果嘛惨不忍睹。用CodeIgniter的上传类来上传文件,一开始进展蛮顺利的,但发觉走到上传文件类型的时候就走不下去了。我明明添加了.torrent类型为可上传类型,结果无论我怎么传也传不上去,还提示我上传文件类型不对。汗森了,这可是货真价实的种子文件啊,难道CI只认可岛国的种子吗?
打开CI的上传类看代码,原来CI的UPLOAD是通过判断文件的来实现文件识别的。难怪,种子的MIME类型在一般浏览器上返回的都是二进制数据类型,看来只有自己动手改造一下了。
为了尽快完成项目,我直接从控制器(Controller)开始写代码。用$_FILE['file']['name']获取上传文件的文件名,然后用explode函数来获取后缀名,最后再调用CI的UPLOAD来上传文件。代码如下:
PHP代码
代码如下 | 复制代码 |
$config['upload_path'] = './uploads/'; $config['allowed_types'] = '*'; $config['max_size'] = '100'; $this->load->library('upload',$config); $this->load->helper('security'); $this->load->helper('date'); $this->load->helper('url'); $this->load->model('bt_model','',TRUE); $data['source_url'] = base_url().'source'; $data['base_url'] = base_url(); $file = $_FILES['upload_file']['name']; $file_1 = explode('.',$file); $file_2 = $file_1[count($file_1)-1]; if($file_2 <> 'torrent'){ echo '<script>alert("只能上传类型为torrent的种子文件");</script>'; echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>'; return; } $data['type'] = xss_clean($this->input->post('type')); $data['name'] = xss_clean($this->input->post('name')); $data['space'] = xss_clean($this->input->post('space')); $data['username'] = xss_clean($this->input->post('username')); $data['time'] = mdate('%Y-%m-%d %G:%i',gmt_to_local(time(),'UP8')); if($data['type'] == '' || $data['name'] == '' || $data['space'] == '' || $data['username'] == ''){ echo '<script>alert("信息填写不完整,请重新填写");</script>'; echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>'; return; } $this->upload->do_upload('upload_file'); echo $this->upload->display_errors(); $file = $this->upload->data(); $data['url'] = $data['base_url'].'uploads/'.$file['file_name']; $this->bt_model->insert($data); echo '<script>alert("上传成功");</script>'; echo '<script>window.location.href="'.$data['base_url'].'";</script>'; |
原理大致是这样的,获取上传文件的文件名,然后通过explode()函数来分割文件名以获取后缀,得到后缀之后与允许上传类型做比较,最后上传。
讲到上传,我又想到了原来那个特别流行的MIME上传漏洞。很简单,当网站判断上传文件类型时只判断MIME类型那么就会造成上传漏洞。因为上传时服务器得到的MIME类型是从客户端发过来的,也就是说MIME类型的值是可以被用户控制的,攻击者克构造虚假的MIME类型来上传webshell。
所以判断文件类型的时候还是检测文件后缀名吧,最好只给上传目录一个可读权限,关闭执行权限,这样比较靠谱。
接触PHP已经有一段时间了,今天写一篇关于PHP连接MYSQL数据库的文章,也算是自己对学习PHP与数据库的一点总结。
果文章出现错误,希望各位包涵、指出。
言归正传,对于PHP来讲,它是默认支持MYSQL的,也就是说我们不必再去手动设置ODBC来使用MYSQL了,我们所需要做的设置就是在php.ini中引入MYSQL插件。首先找到你的php.ini,编辑它,将extension = php_mysql.dll前的分号(“;”)去掉即可。这样,我们的php就可以使用MYSQL了。
接下来我们连接mysql,mysql_connect(servername:port,username,password)就是用于连接mysql的函数,其中servername:port参数就是数据库地址以及数据库端口(默认情况下port参数为3306);username即是登陆数据库所使用的用户名,password则是对应用户的密码。由于我的数据库就在本机上所以连接时我使用以下语句。
连接代码
$con = mysql_connect("localhost","root",""); //$con可理解为连接号
当然我们不能让mysql一直处于连接状态,对于小型应用来说或许这不算问题,但对于大型web应用来讲这是很浪费资源的,所以用完数据库连接之后我们要关掉它。这个任务我们交给mysql_close(连接号)来完成。
开启和关闭数据库连接
代码如下 | 复制代码 |
$con = mysql_connect("loaclhost","root",""); $con = mysql_close($con); |
弄明白了如何连接和断开数据库,接下来就是在mysql中创建数据库,这听起来很拗口,因为同一台mysql服务器中可以允许多个数据库的存在。这里我们有两种方法来建立数据库,法一使用mysql_create_db()函数,但不建议大家使用这种方法。
创建数据库
代码如下 | 复制代码 |
$con = mysql_connect("localhost","root",""); |
法二,我们直接采用mysql_query()函数来执行sql语句。Create DATABASE 就是用于创建数据库的sql语句,例如Create DATABASE test,就是创建一个名为test的数据库。
创建数据库
代码如下 | 复制代码 |
$con = mysql_connect("localhost","root","");
|
建完数据库,我们要向数据库中添加数据表。同样是采用mysql_query()函数来执行sql语句,但不同的是之前我们要使用mysql_select_db()函数来选择我们操作的数据库。
代码如下 | 复制代码 |
$con = mysql_connect("localhost","root",""); mysql_query("Create DATABASE guestbook",$con); mysql_select_db("guestbook",$con); mysql_query("Create TABLE users(username varchar(15), password varchar(15))"); mysql_close($con); /* 建表语句: Create TABLE 表明(字段名_1 字段数据类型_1,字段名_2 字段数据类型_2,......,字段名_n 字段数据类型_n) */ |
在数据库中建立好表、字段等数据数据关系之后,就差实实在在的数据了。同上,使用mysql_query()函数执行添加数据的sql语句,Insert INTO 表名 (字段名_1,字段名_2,......,字段名_n) VALUES (数据_1,数据_2,......,数据_n)。
代码如下 | 复制代码 |
|
现在,我们的数据库中已经有了数据,接下来我们使用select语句来进去查询。
代码如下 | 复制代码 |
$con = mysql_connect("localhost","root",""); mysql_query("Create DATABASE guestbook",$con); mysql_select_db("guestbook",$con); mysql_query("Create TABLE users(username varchar(15), password varchar(15))"); $select = mysql_query("select * from users"); while ($row = mysql_fetch_array($select);) { echo $row['username']; echo $row['password']; } mysql_close($con); |
这样,通过while循环我们就可以把users表中所有的数据全部查询出来,上面这样做不好重复利了,下面我们可以做成数据库连接类。
代码如下 | 复制代码 |
<?php class Database { function Database($dbHost = SERVER, $dbUser = USER, $userPassword = PASSWORD, $database = DATABASE) { /* SQL:Select() 返回为false无结果 */ function Select($table, $columns, $condition = 1) { /* SQL:GetRows() 返回查询的记录总数 */ function GetRows($table, $condition = 1) { /* SQL:Insert() */ function Insert($table, $columns, $values) { /* SQL:Update() */ function Update($table, $setings, $condition) { /* SQL:Delete */ function Delete($table, $condition) { /* Halt():error message */ function Halt($msg) { switch ($db->dbType) { |
php日期函数date里面有个参数w代表周几
w分别表示为: 0 周日 1 周一 2 周二 … 6 周六
所以我们判断今天是周几的话 直接:
代码如下 | 复制代码 |
$w = date('w'); //注意上面返回的都是 数字,0123456.所以如果要显示中文的星期,可以定义下面的数组就可以了。 $weekarray=array("日","一","二","三","四","五","六"); //0表示星期日 echo '周'.$weekarray[$w]; |
而判断某天是星期几 格式为
代码如下 | 复制代码 |
date(‘w’,unix时间毫秒) echo date('w',strtotime('2012-05-09 12:23:30')); |
sprintf函数
代码如下 | 复制代码 |
<?php |
输出结果:926926.07
php进一法取整
代码如下 | 复制代码 |
echo ceil(4.3); // 5 |
php舍去法,取整数
代码如下 | 复制代码 |
|
相关文章
- PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
PHP session_start()很慢问题分析与解决办法
本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25- 本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
PHP分布式框架如何使用Memcache同步SESSION教程
本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25- 什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
- 什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
- 这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
- 这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
Python3使用Selenium获取session和token方法详解
这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- 什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
- 当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
- session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
python爬虫用request库处理cookie的实例讲解
在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21- session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
- 这篇文章主要介绍了Vue使用axios引起的后台session不同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
- 本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
- 举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
- PHP的session功能,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。 1. 错误提示 引用 代...2016-11-25