php中session放cookie优缺点分析

 更新时间:2016年11月25日 15:42  点击:2146
现在有很多朋友在做网站安全验证时会把session存放在cookie中,这样我们就对一些数据进行加密处理,那么他们这样做的优缺点是什么及有那些安全问题呢?下面我们一起来对比一下。

这篇文章不是讨论session,也不是cookie,现在很多网站都是讲session放cookie中,叫做cookie based session,下面就来讨论下cookie based session的优缺点:

优点:

1.减轻服务器压力,如PHP session默认是文件存储格式的,这样就会较少磁盘压力,不会给磁盘造成较多的碎片。
2.你在做集群的时候,是不是要做session同步的问题,cookie based session后就免去了。

缺点:

1.同一个用户,可能在多个地方登录,你也无从判断谁是真实有效用户。
2.session记录在cookie放本地,可能被hacer获取,通过anehta可以将cookie持久化,使登录状态永久有效,当然你可以再记录cookie的时候记录时间戳,在服务器端验证有效期。
个人建议:
从安全性上来说只要处理得当,session和cookie相差无几,另外还要考虑cookie的存储量,一些重要信息如用户信息或权限信息最好不要放cookie

session和cookie谁更安全

就个人而言,我觉得session更安全一点,我以下几点看法。

1,如果session和cookie一样安全的话,二者就没有并要同时存在了,只要cookie就好了,让客户端来分提服务器的负担,并且对于用户来说又是透明的。何乐而不为呢。

2,session的sessionID是放在cookie里,要想功破session的话,第一要功破cookie。功破cookie后,你要得到 sessionID,sessionID是要有人登录,或者启动session_start才会有,你不知道什么时候会有人登录。第二,sessionID是加密的,第二次session_start的时候,前一次的sessionID就没有用了,session过期时sessionid也会失效,想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着消失了,而真正的cookie存在于客户端硬盘上的一个文本文件,谁安全很显然了。

php生成二维码一般都是使用用一些插件来实现了,下面我们利用phpqrcode来给各位朋友实现生成二维码的同时现加一个水印logo上去,下面看例子。

给手机app作一个二维码的接口,要求支持iso,android,win8手机,找了第三个方工具phpqrcode。

1,下载地址

源码下载:https://github.com/t0k4rt/phpqrcode


2,加水印图片,片段代码

 代码如下 复制代码

    $logo = 'logo.png';

    if(is_file($logo))
    {
        $QR = imagecreatefromstring(file_get_contents($filename));
        $logo = imagecreatefromstring(file_get_contents($logo));
        $QR_width = imagesx($QR);
        $QR_height = imagesy($QR);
        $logo_width = imagesx($logo);
        $logo_height = imagesy($logo);
        $logo_qr_width = $QR_width / 5;
        $scale = $logo_width / $logo_qr_width;
        $logo_qr_height = $logo_height / $scale;
        $from_width = ($QR_width - $logo_qr_width) / 2;
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
        imagepng($QR,$filename);
    }

 

闲来蛋疼,看了几个短网址API服务,于是把它们整理出来,方便以后使用。目前,提供靠谱的短网址API接口的公司不多(谷歌、百度、新浪微博、网易等),而像腾讯微博、淘宝这几个巨头的短网址服务都是仅供内部使用。

1 谷歌、百度、网易、新浪短网址服务的API比较

百度短网址API接口完全对外开放,用户不需申请其开放平台的APPKEY,也不用采用OAuth的协议,因此相对简单方便;谷歌的短网址API接口有两种形式,一种类似于百度无需进行繁复的OAuth认证,不过限制比多;另一种是采用GAE平台OAuth2.0的认证方式,限制较少。新浪微博的短网址API接口服务也类似于谷歌,第一种只需要取得新浪微博开放平台的APPKEY即可使用,第二种是采用OAuth2.0认证的方式。网易只提供类似于新浪微博提供的第二种API接口调用方式,即需要申请APPKEY,不过申请非常容易通过,这点不同于新浪微博。值得一提的是,经博主测试,网易的短网址API接口貌似有bug。最终三个接口的测试效果如下图所示:

百度网易新浪微博短网址API接口
2 PHP实现百度短网址API接口调用

百度短网址的API接口封装不是很好,需要针对长网址转短网址和短网址转长网址请求不同的页面(create.php和query.php),另外官方的示例程序也有错误。

   

 代码如下 复制代码
<?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用百度短网址API接口
    *     * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function bdUrlAPI($type, $url){
    if($type)
    $baseurl = 'http://dwz.cn/create.php';
    else
    $baseurl = 'http://dwz.cn/query.php';
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$baseurl);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    if($type)
    $data=array('url'=>$url);
    else
    $data=array('tinyurl'=>$url);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if($arrResponse['status']!=0)
    {
    echo 'ErrorCode: ['.$arrResponse['status'].'] ErrorMsg: ['.iconv('UTF-8','GBK',$arrResponse['err_msg'])."]<br/>";
    return 0;
    }
    if($type)
    return $arrResponse['tinyurl'];
    else
    return $arrResponse['longurl'];
    }
    echo '<br/><br/>----------百度短网址API----------<br/><br/>';
    echo 'Long to Short: '.bdUrlAPI(1, 'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.bdUrlAPI(0, 'http://dwz.cn/evlhW').'<br/><br/>';
    ?>

3 PHP实现网易短网址API接口调用

网易短网址API接口

用户首先需要申请一个appkey,申请地址是http://126.am/,登录进去即可申请,并且很快得到审核。不过,经过测试发现一个bug:用接口生成的短网址无法通过API接口还原为之前的长网址,提示“NOT_MATCH”(对应的官方说明是:Key和短地址不匹配,无法还原)。但是如上图所示,如果在http://126.am/user.action的页面生成的短网址却能够通过API还原为原来的长网址。

   

 代码如下 复制代码
<?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用网易短网址API接口
    *    * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function wyUrlAPI($type,$url){
    if($type)
    $baseurl = 'http://126.am/api!shorten.action';
    else
    $baseurl = 'http://126.am/api!expand.action';
    /* 这是我申请的APPKEY,大家可以测试使用 */
    $key = '4f0c04771d4e40b4945afcfdc0337e3d';
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$baseurl);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    if($type)
    $data=array('longUrl'=>$url,'key'=>$key);
    else
    $data=array('shortUrl'=>$url,'key'=>$key);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if($arrResponse['status_code']!=200)
    {
    echo 'ErrorCode: ['.$arrResponse['status_code'].'] ErrorMsg: ['.iconv('UTF-8','GBK',$arrResponse['status_txt'])."]<br/>";
    return 0;
    }
    return $arrResponse['url'];
    }
    echo '<br/><br/>----------网易短网址API----------<br/><br/>';
    echo 'Long to Short: '.wyUrlAPI(1,'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.wyUrlAPI(0,'http://126.am/huangky').'
    ';
    echo 'Short to Long: '.wyUrlAPI(0,'126.am/XRYsJ2').'<br/><br/>';
    ?>

4 PHP实现新浪微博短网址API接口调用

同样,用户首先需要申请一个新浪微博开放平台的appkey,申请地址是http://open.t.sina.com.cn/,不过审核相对严格而且比较慢。新浪微博短网址API接口有两种实现方式,第一种是原始的OAuth1.0的验证方式,比较简单,无需申请token,第二种是OAuth2.0的验证方式,这个需要access_token(虽然官方文档http://t.cn/8FgFoL8说可以像第一种那样直接通过appkey验证,但是测试不成功)。因此下面的示例采用的是第一种方式,即直接通过appkey验证。

 代码如下 复制代码

 

    <?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用新浪短网址API接口
    *    * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function xlUrlAPI($type,$url){
    /* 这是我申请的APPKEY,大家可以测试使用 */
    $key = '1562966081';
    if($type)
    $baseurl = 'http://api.t.sina.com.cn/short_url/shorten.json?source='.$key.'&url_long='.$url;
    else
    $baseurl = 'http://api.t.sina.com.cn/short_url/expand.json?source='.$key.'&url_short='.$url;
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL,$baseurl);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if (isset($arrResponse->error) || !isset($arrResponse[0]['url_long']) || $arrResponse[0]['url_long'] == '')
    return 0;
    if($type)
    return $arrResponse[0]['url_short'];
    else
    return $arrResponse[0]['url_long'];
    }
    echo '<br/><br/>----------新浪短网址API----------<br/><br/>';
    echo 'Long to Short: '.xlUrlAPI(1,'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.xlUrlAPI(0,'http://t.cn/8FdW1rm').'<br/><br/>';
    ?>

5 后记

综上,百度的短网址API相对方便,而且限制较少;新浪和网易的API接口相对麻烦;网易的短网址API是唯一具备API请求统计功能的,但很容易受到“请求过于频繁而遭到REQUEST_LIMIT”。另外,对于任何API接口的调试工作,一定要使用其接口提供的错误信息,例如上面百度接口的$arrResponse['status']字段、网易的$arrResponse['status_code']字段。

原文转自:http://www.huangkeye.cn/web/php/839.html

 

PHP多线程编程中可以通过Thread,Worker的构造方法传递变量到线程,也可以通过线程的public属性或public方法实现,经研究发现都是通过serialize()和unserialize()实现传递,这样就会造成几个问题:

测试环境

OS: win7 64
PHP: 5.4.25 ts
pthreads: 0.1.0


1.性能问题

2.PDO等某些类型不能serialize所以就不能传递到线程。
这两个问题是能通过其他凡是解决的,解决方法仁者见仁智者见智。

另外,可以通过传递匿名函数到线程中,但是有个bug,匿名函数不能赋值给线程中的属性,导致传递的匿名函数只能在线程的构造方法中才能使用(call_user_fun*系列函数调用)。

Thread属性定义一定要注意必须在构造方法中初始化,否则必定为null。__construct()和run()里面的代码不在一个次元,如果属性不是PHP标量在run()中不能修改,例如构造方法中初始化一个对象,然后run()中修改对象属性不会生效。

正确写法:

 代码如下 复制代码

abstract class Task extends Thread {
 private $finished;
 public $terminated;
 protected $id;
 public $terminate;
 public function __construct($id) {
  $this->id = $id;
  $this->terminated = true;
  $this->finished = false;
  $this->terminate = false;
 }
}

错误写法:

 代码如下 复制代码

abstract class Task extends Thread {
 private $finished=false;
 public $terminated=false;
 protected $id;// www.111cn.net
 public $terminate=false;
 public function __construct($id) {
  $this->id = $id;
 }
}


这样也是错的,无论stdClass还是数组

 代码如下 复制代码
abstract class Task extends Thread {
 private $info;
 public function __construct($task) {
  $this->info = array();
  $this->info ['task'] = $task;
  $this->info ['finished'] = false;
  $this->info ['terminate'] = false;
  $this->info ['terminated'] = false;
  $this->info ['error'] = false;
  $this->info ['info'] = array ();
 }
}


后来研究又发现,复合类型的数据整体赋值貌似能起作用。

如果程序有很多回调函数在线程内部用的话就是找死啊。

 

初学php时就知道利用替换函数来替换指定的数字,但要替换指定位置我们需要简单处理一下才行,下面我介绍几个例子把指定位星号显示出来。

例子,用户名

 代码如下 复制代码

function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
{
    if($code == 'UTF-8')
    {
        $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
        preg_match_all($pa, $string, $t_string);

        if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen));
        return join('', array_slice($t_string[0], $start, $sublen));
    }
    else
    {
        $start = $start*2;
        $sublen = $sublen*2;
        $strlen = strlen($string);
        $tmpstr = '';www.111cn.Net

        for($i=0; $i< $strlen; $i++)
        {
            if($i>=$start && $i< ($start+$sublen))
            {
                if(ord(substr($string, $i, 1))>129)
                {
                    $tmpstr.= substr($string, $i, 2);
                }
                else
                {
                    $tmpstr.= substr($string, $i, 1);
                }
            }
            if(ord(substr($string, $i, 1))>129) $i++;
        }
        //if(strlen($tmpstr)< $strlen ) $tmpstr.= "...";
        return $tmpstr;
    }
}

示例

 代码如下 复制代码

$str = "如来神掌";
echo cut_str($str, 1, 0).'**'.cut_str($str, 1, -1);
//输出:如**掌

下面附两个IP地址与手机号星号显示

初学PHP,看到别人是通过合并和拆分数组进行这个操作!所以转过来!!

 代码如下 复制代码

<?php 

$ip =$_SERVER['REMOTE_ADDR'];

  $ip_arr= explode('.', $ip);

  $ip_arr[3]='*';

  $ip= implode('.', $ip_arr);

echo $ip;

?>

手机号的

 代码如下 复制代码

<?php
$haoma="15012345678";
echo preg_replace("/(d{3})d{5}/","$1*****",$haoma);
//150*****678
?>

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • JS使用cookie实现DIV提示框只显示一次的方法

    本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • MYSQL事务回滚的2个问题分析

    因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • vue项目中js-cookie的使用存储token操作

    这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
  • 详解C#中的session用法

    这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Python3使用Selenium获取session和token方法详解

    这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17
  • Mysql索引会失效的几种情况分析

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • python 爬取京东指定商品评论并进行情感分析

    本文主要讲述了利用Python网络爬虫对指定京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感分析,感兴趣的朋友可以了解下...2021-05-28
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • 编程新手必须掌握的:session与cookie的区别

    session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
  • python爬虫用request库处理cookie的实例讲解

    在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21
  • PHP中如何使用session实现保存用户登录信息

    session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
  • Vue使用axios引起的后台session不同操作

    这篇文章主要介绍了Vue使用axios引起的后台session不同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
  • Google会不会取消PR的理由分析

    Google是这样介绍PageRank的:   Google 出类拔萃的地方在于专注开发“完美的搜索引擎”,联合创始人拉里&middot;佩奇将这种搜索引擎定义为可“确解用户...2017-07-06
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25