php magic_quotes_gpc开关的例子

 更新时间:2016年11月25日 15:33  点击:1435
magic_quotes_gpc是一个用来过滤用户的数据了双引号或单引号数据进行安全过程了,今天我们来看一些小编整理的php magic_quotes_gpc开关的例子,希望能够帮助到各位.


如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞。在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠。

如何禁用 magic_quotes_gpc 和safe_mode
1,用 php.ini 配置文件全局禁用

magic_quotes_gpc = Off
safe_mode = Off

2,使用 .htaccess 文件禁用(对于虚拟主机)

php_flag magic_quotes_gpc Off
php_flag safe_mode Off

禁用了这两个东东后,安全问题就更加不能忽视了。在数据入库前一定要addslashes ,出库后要记得stripslashes 。

但是,上面的方法只适用于magic_quotes_gpc=Off的情况。作为一个开发者,你不知道每个用户的magic_quotes_gpc是On
还是Off,如果把全部的数据都用上addslashes(),那不是“滥杀无辜”了?假如magic_quotes_gpc=On,并且又用了addslashes()函数,那让我们来看看:

php

//如果从表单提交一个变量$_POST['message'],内容为 Tom's book
//这此加入连接MySQL数据库的代码,自己写吧
//在$_POST['message']的敏感字符前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

//由于magic_quotes_gpc=On,所以又一次在敏感字符前加反斜杠
$sql = "Insert INTO msg_table VALUE('$_POST[message]');";

//发送请求,把内容保存到数据库内
$query = mysql_query($sql);

//如果你再从数据库内提取这个记录并输出,就会看到 Tom\\'s book
?>

这样的话,在magic_quotes_gpc=On的环境里,所有输入的单引号(')都会变成(\\')……
其实我们可以用get_magic_quotes_gpc()函数轻易地解决这个问题。当magic_quotes_gpc=On时,该函数返回TRUE;当magic_quotes_gpc=Off时,返回FALSE。至此,肯定已经有不少人意识到:问题已经解决。请看代码:
php

//如果magic_quotes_gpc=Off,那就为提单提交的$_POST['message']里的敏感字符加反斜杠
//magic_quotes_gpc=On的情况下,则不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

其实说到这里,问题已经解决。下面再说一个小技巧。
有时表单提交的变量不止一个,可能有十几个,几十个。那么一次一次地复制/粘帖addslashes(),是否麻烦了一点?由于从表单或URL获取的数据都是以数组形式出现的,如$_POST、$_GET)那就自定义一个可以“横扫千军”的函数:

php

function quotes($content)
{
//如果magic_quotes_gpc=Off,那么就开始处理
if (!get_magic_quotes_gpc()) {
//判断$content是否为数组
if (is_array($content)) {
//如果$content是数组,那么就处理它的每一个单无
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是数组,那么就仅处理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那么就不处理
}
//返回$content
return $content;
}
?>


看了下phpwind和 discuz的源码 ,发现phpwind就是直接用的addslashes和stripslashes 。而dz则是自己定义了两个函数:

function daddslashes($string, $force = 0)
    {
    !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
    if(!MAGIC_QUOTES_GPC || $force)
    {
        if(is_array($string))
        {
            foreach($string as $key => $val)
            {
                $string[$key] = daddslashes($val, $force);
            }
        } else
        {
            $string = addslashes($string);
        }
    }
    return $string;
    }
   
        function dstripslashes($string)
        {
        if(is_array($string))
        {
            foreach($string as $key => $val)
            {
                $string[$key] = dstripslashes($val);
            }
        }
        else
        {
            $string = stripslashes($string);
        }
        return $string;
        }
dz的这两个函数的在原函数的基础上扩充了对数组数据的支持,用起来更方便。不过dz的这两个函数不够简洁,这里我给出两个简洁点的:


function addslashes_deep($string)
  {
    $string = is_array($string)?array_map('addslashes_deep', $string):addslashes($string);
    return $string; 
  }
 
 
    function stripslashes_deep($string)
  {
    $string = is_array($string)?array_map('stripslashes_deep', $string):stripslashes($string);
    return $string; 
  }

在数据入库前和出库后都要记得:


//入库前
if(!get_magic_quotes_gpc())
{
$_GET=addslashes_deep($_GET);
$_POST=addslashes_deep($_POST);
$_REQUEST=addslashes_deep($_REQUEST);
//其它要处理的变量.......
}

//出库后
if(get_magic_quotes_gpc())
{
$_GET=stripslashes_deep($_GET);
$_POST=stripslashes_deep($_POST);
$_REQUEST=stripslashes_deep($_REQUEST);
//其它要处理的变量.......
}

微信开发最近要用到的一个功能,其实就是一个非常的简单的用户输入然后自动搜索数据库并进行一个数据回复了,这个与官方没多大的问题,但小编就微信Token验证失败折腾了许多,下面解决了给各位分析一下。

1.Token验证失败

这个就是要检查配置文件了,最基本的就是

define("TOKEN", "weixin");  weixin 是你的微信开发后台的ID

微信开发Token验证失败或请求URL超时问题解决办法
2.请求URL超时

这个没什么办法多提交几次了,这个还有就是服务器安装了安全狗之类的软件把微信IP给拦截了,可以检查一下。

3.官方下载一个wechatCallbackapiTest类然后进行一下操作即可

 代码如下 复制代码

define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

wechatCallbackapiTest类就代码如下

 代码如下 复制代码

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        <FuncFlag>0</FuncFlag>
                        </xml>";
            if($keyword != " " || !empty( $keyword ) )
            {
    msgType = "text";
    //$contentStr .= date("Y-m-d H:i:s",time());
    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    echo $resultStr;
            }
        }else{
            echo "";
            exit;
        }
    }
}

php json转数组是一个非常方便实现的因为json存储的格式有规则的所以php也自带了函数了,我们只需要使用对应的函数就可以实现了,具体如下。

PHP中将数组转变成Json

强大的PHP已经提供了内置函数:json_encode() 和 json_decode()。很容易理解,json_encode()就是将PHP数组转换成Json。相反,json_decode()就是将Json转换成PHP数组。

例如:

 代码如下 复制代码

$array = array("name" => "Eric","age" => 23);  

echo json_encode($array);

程序将打印出 :  {“name”:”Eric”,”age”:23}

再看下面的例子:

 代码如下 复制代码

$array = array(0 => "Eric", 1 => 23);  

echo json_encode($array);

程序将打印出 :["Eric",23]

以上两个例子可以看出,如果PHP数组的键都是数字,那么json_encode()返回一个数组形式的Json,如果PHP数组的键全是字符串。那么json_encode()就会返回一个对象形式的Json。刚已经说过。两者在js中的调用是不同的。
事实上,只要在PHP数组的键中有一个字符串形式的键,那么json_encode()就会返回对象形式的Json。这是不正确的。因为,虽然在PHP代码中不会出现错误,但要是将这样的Json传给JS函数,JS会将此Json当做一个对象,而对象是不可能以数字作为属性名的。也就是说JS 不知道这是什么 : user.0.username  (中间是数字零)

例子。

 代码如下 复制代码

$json_arr = array('WebName'=>'PHP网站开发教程网','WebSite'=>'http://www.111cn.net');
$php_json = json_encode($json_arr);  //把php数组格式转换成 json 格式的数据
echo $php_json;
$php_json = json_decode($php_json);   //再把json格式的数据转换成php数组
print_r($php_json);


json数组

$json = '[{"id":"22","name":"33","descn":"44"}]';   //json格式的数组转换成 php的数组
$arr = (Array)json_decode($json);

 echo $arr[0]->id;  //用对象的方式访问

json转换数据后面参数要带ture

 代码如下 复制代码

$a = <<<EOD
{
    "scoreInfo": {
        "isB2cSeller": true,
        "noMark": false,
        "merchandisScore": "5.0",
        "merchandisTotal": 1,
        "width": 100
    },
    "rateListInfo": {
        "watershed": 100,
        "paginator": {
            "beginIndex": 1,
            "endIndex": 1,
            "firstPage": 1,
            "items": 1,
            "itemsPerPage": 8,
            "lastPage": 1,
            "length": 1,
            "offset": 0,
            "page": 1,
            "pages": 1
        },
        "rateList": [
            {
                "aliMallSeller": false,
                "anony": true,
                "auctionSku": "颜色分类:蓝+黑;尺码:36",
                "award": "",
                "b2CSeller": false,
                "dispalyRateLevel1": 0,
                "dispalyRateLevel2": 0,
                "dispalyRateSum": 0,
                "displayRatePic": "",
                "displayUserLink": "http://i.taobao.com/u/MTExNTE1Mjk5MQ==/tlive/taodan_list.htm?from=rate",
                "displayUserNick": "l***1",
                "displayUserNumId": 0,
                "displayUserRateLink": "http://rate.taobao.com/rate.htm?user_id=0&rater=1",
                "displayUserSeller": false,
                "fee dAppendedDO": null,
                "fromB2cMapping": false,
                "fromMall": false,
                "fromOnePai": false,
                "fromVirtualHurling": false,
                "gapDates": 0,
                "id": 63810867055,
                "rateContent": "卖家的服务态度真好,你家的鞋子更是超值,5分,还要在买别的款。",
                "rateDate": "2013.04.14 16:50:11",
                "rateResult": 1,
                "ratedUserNumId": 361988210,
                "reply": "",
                "shareInfo": null,
                "tag": "",
                "tradeClosingdate": null,
                "type": 0,
                "userVipLevel": 0
            }
        ],
        "showMore": 0
    },
    "babyRateJsonList": "uri: /detailRate.vm cacheTime: 2013-04-26 22:07:24 key: 9fb7a9a5d419da77465797ce1809367c cacheArea: 531 aliveTime: 14400 cacheType: PAGE_CACHE_PAGE_TYPE",
    "detailRate": "uri: /detailRate.vm cacheTime: 2013-04-26 22:07:24 key: 9fb7a9a5d419da77465797ce1809367c cacheArea: 531 aliveTime: 14400 cacheType: PAGE_CACHE_PAGE_TYPE"
}
EOD;
var_dump(json_decode($a,1));

在php中目录访问需要遍历了然后文件需要一个个打开进行访问操作了,下面我们来看一段php 替换目录下文件指定内容,具体如下
 代码如下 复制代码

/****************************
    * 获取目录下的所有文件
    * [$dir] 文件夹路径
    ****************************/
    function deepScanDir($dir) {
        $fileArr = array ();
        $dirArr = array ();
        $dir = rtrim($dir, '//');
        if (is_dir($dir)) {
            $dirHandle = opendir($dir);
            while (false !== ($fileName = readdir($dirHandle))) {
                $subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
                if (is_file($subFile)) {
                    $fileArr[] = $subFile;
                }
                elseif (is_dir($subFile) && str_replace('.', '', $fileName) != '') {
                    $dirArr[] = $subFile;
                    $arr = $this->deepScanDir($subFile);
                    $dirArr = array_merge($dirArr, $arr['dir']);
                    $fileArr = array_merge($fileArr, $arr['file']);
                }
            }
            closedir($dirHandle);
        }
        return array (
            'dir' => $dirArr,
            'file' => $fileArr
        );
    }

 

/*
    * 替换成APP中可用的路径,在web文件夹中
    */
    public function ok_web(){
        //查找字符
        $yuanlai = array(
            '"/resources/',
            '"/uploads/',
            '"/web/',
            'href="/"',
            '/web',
            'typedir+\'/\'+v.aid+"',
            'v.litpic',
        );
        //替换字符
        $tihuan = array(
            '"../resources/',
            '"../uploads/',
            '"',
            'href="../index.html"',
            '',
            'v.aid+"',
            '".."+v.litpic'
        );
        
        //查找的文件夹
        $dir = WEBROOT.'/app/web';
        //获取文件
        $dirs = $this->deepScanDir($dir);
        //文件字符串替换
        foreach($dirs['file'] as $file){
            $file = 'G:\hospital\hospital\admin/app/web\yiyuanzhuanjia.html';
            $txt = file_get_contents($file);
            $txt =  str_replace($yuanlai,$tihuan,$txt);
            file_put_contents($file,$txt);echo $txt;exit;
        }
      
    }

PHP抽象类和接口是什么意思它们两者有什么区别呢,在此小编来为各位介绍一篇关于PHP抽象类和接口的区别吧,具体的细节如下所示,希望文章能够帮助到各位朋友。

抽象类(abstract class)和接口(interface)是面向对象很重要的概念,他们很相似,都是定义要实现的方法,但又有不同的使用场景,PHP的抽象类和接口有什么区别,看下面的示例。

接口(Interface)—— 定义行为
抽象类(Abstract  Class) —— 实现行为
具体类(class)——执行行为


一.接口

接口定义了某种函数的规范,声明了所需的函数和常量,但是不能指定怎么实现。接口像是对具体类中方法的规范。

接口定义了发生某一行为需要的方法、方法名。然后允许具体的类来实现这些方法。。
注意:接口类不能定义类成员。定义的方法必须在实现的类中出现。

interface 接口名
{
function 方法1( );
function 方法2( );
}
//实现接口
class 类名 implements 接口名
{
 方法1( );
方法2( );
}

二.抽象类

抽象类是实例化的类,只能作为被其他类基层的基类。例如,可以写一个关于read的抽象类,然后电子阅读,纸质阅读来继承read抽象类。
abstract class 类名
{
各种方法
}

抽象类可以确保一致性,因为任何派生类都必须实现从该抽象类继承所有抽象方法,如果没有实现,那将产生错误。

应该用抽象类?还是 接口?
这是一个问题

** 如果要建一个类模型,这个模型将由一些紧密相关的对象采用,使用抽象类。如果模型将由不太相关的对象采用,用接口。
** 如果一个具体class将从多个来源继承行为,用接口。php类可以继承多个接口,但是不能继承多个抽象类。
** 如果所有的类都要共享一个公共的行为实现,用抽象类,并在其中实现该行为。。先用子类继承一个抽象类,继承后的子类能够实现原先的行为。。

摘: _______

事物的出现,总是有它出现的理由(需求)!
但是,事物的生存,需要有适应性(灵活)!
比如:长颈鹿,脖子长,这是个抽象的概念;
能吃草(是非肉食性动物的特征,接口)。

所以,当需要描述长颈鹿的时候,我们就可以用接口(非肉食性动物)和抽象(脖子长)的方法来定义它,
然后,具体是什么种类/或者颜色的长颈鹿,怎么个吃草法,这就是具体类了

PHP接口类

首先看接口,定一个接口类,interface class:


<?php
 
namespace frontend\models;
 
interface TestInterface
{
    public function cloud();
 
    public function sky();
 
    public static function color($color);
}

在PHP中,接口只能定义方法(或静态方法),但是不能实现具体的方法。在PhpStorm中如果写具体的方法会提示错误。接口比较严格的定义需要实现什么方法,只写要实现的方法就行了,不需要具体实现,或定义成员变量。

使用接口:

<?php
 
namespace frontend\models;
 
class Test implements TestInterface
{
    public function cloud()
    {
        echo 'Cloud....';
    }
 
    public function sky()
    {
 
    }
 
    public static function color($color){
 
    }
}
继承接口类,必须实现接口定义的每个方法,否则也会报错。这就是PHP的接口,严格定义实现哪些方法,并且必须在子类中都实现。

PHP抽象类

我们定义一个抽象类:


abstract class Testabstract
{
    public $abstract = 'abstract';
    abstract function hehe();
 
    public function hehe2()
    {
        echo 'hehe2';
    }
}

这里有两个方法,一个是用abstract修饰的,这样写表示该方法是子类必须实现的,而抽象类中只能定义不能具体实现。一个方法是普通的成员方法,而且有具体实现,子类也可以重写。


class ab extends Testabstract
{
    public function hehe()
    {
        echo 'hehe';
    }
}

子类继承抽象类,只需实现抽象类中定义的抽象方法。抽象类可以定义成员变量,而接口不行。

[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PC蓝牙通信C#代码实现

    这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • golang在GRPC中设置client的超时时间

    这篇文章主要介绍了golang在GRPC中设置client的超时时间,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-27
  • golang与php实现计算两个经纬度之间距离的方法

    这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
  • PHP如何使用cURL实现Get和Post请求

    这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
  • 谈谈PHP中相对路径的问题与绝对路径的使用

    经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
  • thinkPHP中多维数组的遍历方法

    这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
  • php构造方法中析构方法在继承中的表现

    这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
  • jQuery+PHP+MySQL实现无限级联下拉框效果

    这篇文章主要介绍了jQuery+PHP+MySQL实现无限级联效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-02-21
  • php图片添加文字水印实现代码

    这篇文章主要为大家详细介绍了php图片添加文字水印实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-03-17