精华内容
下载资源
问答
  • if(C('LAYOUT_ON')) { echo '{__NOLAYOUT__}'; } ?> 跳转中 .buffer { background-color: black; height: 100%; width: 60%;
    <?php
        if(C('LAYOUT_ON')) {
            echo '{__NOLAYOUT__}';
        }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>跳转中</title>
        <style>
            .buffer {
                background-color: black;
                height: 100%;
                width: 60%;
                margin: auto;
                filter: alpha(Opacity=60);
                -moz-opacity: 0.6;
                opacity: 0.85;
                border-radius: 7px;
            }
    
            .buffer_tip {
                color: wheat;
                font-size: 30px;
                display: block;
                padding-top: 10px;
                text-align: center;
            }
    
            .spinner {
                margin: 16px auto 57px;
                width: 32px;
                height: 32px;
                position: relative;
            }
    
            .cube1, .cube2 {
                background-color: #67CF22;
                width: 30px;
                height: 30px;
                position: absolute;
                top: 0;
                left: 0;
    
                -webkit-animation: cubemove 1.8s infinite ease-in-out;
                animation: cubemove 1.8s infinite ease-in-out;
            }
    
            .cube2 {
                -webkit-animation-delay: -0.9s;
                animation-delay: -0.9s;
            }
    
            @-webkit-keyframes cubemove {
                25% {
                    -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5)
                }
                50% {
                    -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg)
                }
                75% {
                    -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5)
                }
                100% {
                    -webkit-transform: rotate(-360deg)
                }
            }
    
            @keyframes cubemove {
                25% {
                    transform: translateX(42px) rotate(-90deg) scale(0.5);
                    -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
                }
                50% {
                    transform: translateX(42px) translateY(42px) rotate(-179deg);
                    -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
                }
                50.1% {
                    transform: translateX(42px) translateY(42px) rotate(-180deg);
                    -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
                }
                75% {
                    transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
                    -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
                }
                100% {
                    transform: rotate(-360deg);
                    -webkit-transform: rotate(-360deg);
                }
            }
    
            #href {
                color: wheat;
                font-size: 20px;
            }
    
            a:link {
                text-decoration: none;
            }
        </style>
    </head>
    <body>
    
    <div class='buffer' id='buffer'>
            <span class='buffer_tip' id='buffer_tip'>
            <php>
                if(isset($message)) {
                echo $message;
                }else{
                if(!empty($error)) {
                echo $error;
                }else{
                echo '操作出现错误';
                }
                }
            </php>
            <a id="href" href="<?php echo($jumpUrl); ?>">(<b id="wait"><?php echo($waitSecond); ?></b>s)</a>
            </span>
        <div class="spinner">
            <div class="cube1"></div>
            <div class="cube2"></div>
        </div>
    </div>
    
    <script type="text/javascript">
        (function () {
            var wait = document.getElementById('wait'), href = document.getElementById('href').href;
            var interval = setInterval(function () {
                var time = --wait.innerHTML;
                if (time <= 0) {
                    location.href = href;
                    clearInterval(interval);
                }
                ;
            }, 1000);
        })();
    </script>
    </body>
    </html>
    转载于  http://blog.csdn.net/u013288190/article/details/54908718

    展开全文
  • <include file="snippet:drawer" menu="我的"/>...这样就可以引入文件 www/Template/snippet/drawer.html 参数 [menu] 替换 <div id="drawer" class="l-drawer v-transfer-dom" styl...

    www/Template/User/person.html

     <include file="snippet:drawer" menu="我的"/>

    这样就可以引入文件

    www/Template/snippet/drawer.html

    参数  [menu] 替换

    <div id="drawer" class="l-drawer v-transfer-dom" style="height:0;">
        <div class="menu">
            <div class="top-info">
                <div class="info-img"></div>
                <p>¥0.00</p>
                <div class="recharge-content">存/取款</div>
    
            </div>
            <div class="list">
                <div class="vue-pull-to-wrapper">
                    <div class="scroll-container">
                        <ul class="drawer-list">
                            <li>
                                <a href="#">
                                    <img src="__PUBLIC__/img/list/dollar.png" alt="今日输赢">
                                    <div class="item">
                                        <p>今日输赢</p>
                                        <p class="text">0.00</p>
                                    </div>
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                    <img src="__PUBLIC__/img/list/shopping_cart.png" alt="未结算">
                                    <div class="item">
                                        <p>未结算</p>
                                        <p class="text">0.00</p>
                                    </div>
                                </a>
                            </li>
                        </ul>
                        <ul class="drawer-list">
                            <li>
                                <a href="#">
                                    <img src="__PUBLIC__/img/list/medal.png" alt="排行榜">
                                    <div class="item">排行榜</div>
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                    <img src="__PUBLIC__/img/list/clothes.png" alt="主题皮肤">
                                    <div class="item">主题皮肤</div>
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                    <img src="__PUBLIC__/img/cards/06_kefu.png" alt="客服">
                                    <div class="item">联系客服</div>
                                </a>
                            </li>
                            <li>
                                <a href="#">
                                    <img src="__PUBLIC__/img/list/power_off.png" alt="退出">
                                    <div class="item">退出</div>
                                </a>
                            </li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
        <div class="mask" style="display:none;" onclick="foldDrawer(this)"></div>
    </div>
    
    <!--页面顶部 我的-->
    <header class="nav v-transfer-dom">
        <div class="nav-item"></div>
        <div class="title">[menu]</div>
        <div class="nav-item">
            <div class="right-slot">
                <a class="drawer" onclick="unfoldDrawer(this)" href="javascript:;"><img src="__PUBLIC__/img/breadcrumb.png" /></a>
            </div>
        </div>
    </header>
    <script>
      var drawer = document.getElementById("drawer");
    
      function foldDrawer(o) {
        o.style.display = "none";
        // o.parentNode.style.height = 0;
        drawer.style.height = "0";
      }
      function unfoldDrawer(o) {
        drawer.querySelector(".mask").style.display = "block";
        drawer.style.height = "100%";
        drawer.querySelector(".menu").style.width = "50%";
      }
    </script>

     

    展开全文
  • Thinkphp5 文件包含漏洞

    2021-03-09 15:38:22
    本次漏洞存在于 ThinkPHP 模板引擎中,在加载模版解析变量时存在变量覆盖问题,而且程序没有对数据进行很好的过滤,最终导致 文件包含漏洞 的产生。漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=...

    前言

    本次漏洞存在于 ThinkPHP 模板引擎中,在加载模版解析变量时存在变量覆盖问题,而且程序没有对数据进行很好的过滤,最终导致 文件包含漏洞 的产生。漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10。

    创建:

    composer create-project topthink/think=5.0.18 thinkphp5.0.18
        "require": {
            "php": ">=5.4.0",
            "topthink/framework": "5.0.18"
        },
    composer update
    

    index控制器这样写:

    <?php
    namespace app\index\controller;
    use think\Controller;
    class Index extends Controller
    {
        public function index()
        {
            $this->assign(request()->get());
            return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
        }
    }
    

    然后创建一个模板,创建 application/index/view/index/index.html 文件,内容任意,作为这个index控制器的index方法的模板。

    分析

    在这里插入图片描述
    get方法就不跟进了,用处就是得到get传参,然后会在最后调用filterExp()方法进行过滤:

    public function filterExp(&$value)
    {
        // 过滤查询特殊字符
        if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOT EXISTS|NOTEXISTS|EXISTS|NOT NULL|NOTNULL|NULL|BETWEEN TIME|NOT BETWEEN TIME|NOTBETWEEN TIME|NOTIN|NOT IN|IN)$/i', $value)) {
            $value .= ' ';
        }
        // TODO 其他安全过滤
    }
    

    这些针对SQL注入的过滤和本文就无关了。跟进一下assign()方法:
    在这里插入图片描述
    再跟进$this->view->assign()
    在这里插入图片描述
    只是单纯的把get传的参数赋值一下罢了。
    再跟进之后的fetch()方法,又是一层套。。。继续跟进:
    在这里插入图片描述

    /**
     * 解析和获取模板内容 用于输出
     * @param string    $template 模板文件名或者内容
     * @param array     $vars     模板输出变量
     * @param array     $replace 替换内容
     * @param array     $config     模板参数
     * @param bool      $renderContent     是否渲染内容
     * @return string
     * @throws Exception
     */
    public function fetch($template = '', $vars = [], $replace = [], $config = [], $renderContent = false)
    {
        // 模板变量
        $vars = array_merge(self::$var, $this->data, $vars);
    
        // 页面缓存
        ob_start();
        ob_implicit_flush(0);
    
        // 渲染输出
        try {
            $method = $renderContent ? 'display' : 'fetch';
            // 允许用户自定义模板的字符串替换
            $replace = array_merge($this->replace, $replace, (array) $this->engine->config('tpl_replace_string'));
            $this->engine->config('tpl_replace_string', $replace);
            $this->engine->$method($template, $vars, $config);
            .............
            ................
            ............
                
    

    $vars这里合并数组,至此$vars就是我们get传的参数。
    $method是fetch。
    跟进这个$this->engine->$method($template, $vars, $config);

        /**
         * 渲染模板文件
         * @access public
         * @param string    $template 模板文件
         * @param array     $data 模板变量
         * @param array     $config 模板参数
         * @return void
         */
        public function fetch($template, $data = [], $config = [])
        {
            if ('' == pathinfo($template, PATHINFO_EXTENSION)) {
                // 获取模板文件名
                $template = $this->parseTemplate($template);
            }
            // 模板不存在 抛出异常
            if (!is_file($template)) {
                throw new TemplateNotFoundException('template not exists:' . $template, $template);
            }
            // 记录视图信息
            App::$debug && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export(array_keys($data), true) . ' ]', 'info');
            $this->template->fetch($template, $data, $config);
        }
    

    至此为止$template仍然是空字符串,$data是get传参。parseTemplate()函数获取模板文件名,得到了默认文件名,即我这里的文件路径:D:\phpstudy_pro\WWW\thinkphp5.0.18\public/../application/index\view\index\index.html
    之后日志记录,再跟进一个fetch()方法,又是一层套娃:

        /**
         * 渲染模板文件
         * @access public
         * @param string    $template 模板文件
         * @param array     $vars 模板变量
         * @param array     $config 模板参数
         * @return void
         */
        public function fetch($template, $vars = [], $config = [])
        {
            if ($vars) {
                $this->data = $vars;
            }
            if ($config) {
                $this->config($config);
            }
            if (!empty($this->config['cache_id']) && $this->config['display_cache']) {
                // 读取渲染缓存
                $cacheContent = Cache::get($this->config['cache_id']);
                if (false !== $cacheContent) {
                    echo $cacheContent;
                    return;
                }
            }
            $template = $this->parseTemplateFile($template);
            if ($template) {
                $cacheFile = $this->config['cache_path'] . $this->config['cache_prefix'] . md5($this->config['layout_name'] . $template) . '.' . ltrim($this->config['cache_suffix'], '.');
                if (!$this->checkCache($cacheFile)) {
                    // 缓存无效 重新模板编译
                    $content = file_get_contents($template);
                    $this->compiler($content, $cacheFile);
                }
                // 页面缓存
                ob_start();
                ob_implicit_flush(0);
                // 读取编译存储
                $this->storage->read($cacheFile, $this->data);
                // 获取并清空缓存
                $content = ob_get_clean();
                if (!empty($this->config['cache_id']) && $this->config['display_cache']) {
                    // 缓存页面输出
                    Cache::set($this->config['cache_id'], $content, $this->config['cache_time']);
                }
                echo $content;
            }
        }
    

    前面的代码基本都if进不去,parseTemplateFile这这里的作用就是记录下文件的时间。
    之后进入这里:

                $this->storage->read($cacheFile, $this->data);
    

    跟进去,最关键的代码来了:
    在这里插入图片描述
    if肯定可以满足,然后extract($vars, EXTR_OVERWRITE);。在EXTR_OVERWRITE标记的情况下,如果有冲突,覆盖已有的变量。
    然后会include $cacheFile。因此思路非常清晰,覆盖掉$cacheFile变量,然后实现文件包含。

    往public目录下面写一个图片马,就当是模拟后期生产环境中成功上传文件了或者上传头像了等,然后变量覆盖,进行包含:

    ?cacheFile=1.jpg
    

    在这里插入图片描述
    成功实现文件包含。

    修复

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    判断get传参里是否有cacheFile键,有的话就删掉,也删掉_think_cacheFile键,然后文件包含。

    展开全文
  • 貌似thinkphp解析,tpl文件中的一些元素。 js文件中的ajax function ajaxCheckTel(tel,id){ var res = ''; $.ajax({ type:post, url:ajaxurl, // 地址解析有误,js文件中的U方法不会被thinkphp解析 data:todo=...
  • thinkphp文件上传

    千次阅读 2019-03-10 22:46:03
    最近因在项目遇到thinkphp文件上传不了,查到了下面这篇文章,自己亲测有效,故转发此文。 1、先在Lib/Action目录下新建 UpLoadAction.class.php,内容如下: &lt;?php class UpLoadAction extends Action { ...

    最近因在项目遇到thinkphp大文件上传不了,查到了下面这篇文章,自己亲测有效,故转发此文。

    1、先在Lib/Action目录下新建 UpLoadAction.class.php,内容如下:

    <?php
    class UpLoadAction extends Action {
    	public function index()
    	{
    		$this->display();
    	}
     
    	Public function upload(){
    		import('ORG.Net.UploadFile');
    		$upload = new UploadFile();// 实例化上传类
    		$upload->maxSize  = 3145728000 ;// 设置附件上传大小
    		$upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg', 'VOB', 'avi');// 设置附件上传类型
    		$upload->savePath =  './Public/Uploads/';// 设置附件上传目录
    		if(!$upload->upload()) {// 上传错误提示错误信息
    			$this->error($upload->getErrorMsg());
    		}else{// 上传成功 获取上传文件信息
    			$info =  $upload->getUploadFileInfo();
    		}
    		
    		print_r($info);
    		 
    		// 保存表单数据 包括附件数据
    		//$User = M("User"); // 实例化User对象
    		//$User->create(); // 创建数据对象
    		//$User->photo = $info[0]['savename']; // 保存上传的照片根据需要自行组装
    		//$User->add(); // 写入用户数据到数据库
    		//$this->success('数据保存成功!');
    	}
    }
    ?>
    

    这里没有什么特别,直接复制thinkphp官方文档中的代码即可,我注释掉了数据库部分。

    2、在Tpl目录中新建UpLoad文件夹,在其中新建index.html,内容如下:

    <form action="upload" method="post" enctype="multipart/form-data">
    <input type="file"  name="photo1"/>
    <input type="submit" value="提交"/>
    </form>
    

    此处主要注意 enctype=“multipart/form-data” 这一句,如果不正确或者未添加,会提示你没有选择文件。如果是直接从官方文档中拷贝下来的话,一定要注意双引号是否正确,我当时就是直接拷贝过来后由于是汉语双引号,相当于没有添加,导致一直提示没有选择文件。

    完成了这两步,在浏览器中输入你的跟路径再加UpLoad/index就可以访问到上传页面了。

    当然,以上这些只能上传很小的文件,要实现大文件的上传,还需要修改一些配置:

    1、首先修改Php.ini

    max_execution_time = 30 ,这个是每个脚本运行的最长时间,单位秒,我修改为:max_execution_time = 1800(时间自己定)
    max_input_time = 60,这是每个脚本可以消耗的时间,单位也是秒,我修改为:max_input_time = 300
    memory_limit = 128M,这个是脚本运行最大消耗的内存,根据你的需求更改数值,这里我修改为:memory_limit = 256M
    post_max_size = 8M,表单提交最大数据为 8M,此项不是限制上传单个文件的大小,而是针对整个表单的提交数据进行限制的。限制范围包括表单提交的所有内容.例如:发表贴子时,贴子标题,内容,附件等…这里我修改为:post_max_size = 200M
    upload_max_filesize = 2M ,上载文件的最大许可大小 ,这里我修改为:upload_max_filesize = 100M
    2、修改Apahce目录下的httpd.conf
    添加:LimitRequestBody 104857600
    即100M=10010241024 (当然这个数字可以自己定)
    3、重新启动apache

    好了,现在再选择100M以内的大文件也是可以上传的。

    作者:xue251248603
    来源:CSDN
    原文:https://blog.csdn.net/xue251248603/article/details/38413653
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 本文实例讲述了ThinkPHP实现动态包含文件的方法。分享给大家供大家参考。具体分析如下:问题描述:在做项目的时候遇到问题,也是很常见的问题,一般主页包含头部和脚步,为了方便管理,这些都需要使用包含文件来实现,...
  • thinkphp怎么引入css文件1. 首先在配置文件中找到view_replace_str;2. 接着将它的值指向public/static目录;3. 然后将css文件放入该目录下;4. 最后通过__static__/main.css路径引入css即可。1、配置 view_replace_...
  • 取自ThinkPHP文件缓存类代码,这里就不多废话了,小伙伴们自己看注释吧。 <?php /** * @desc 文件缓存 */ class Cache{ const C_FILE = '/Runtime/'; private $dir = ''; const EXT = '.tpl'; private...
  • ThinkPHP课程目标1、关于mvc和tp的简介2、快速入门3、学习tp中的各个组件(M、 V、 C)控制器模型视图4、实用项关于MVC和T P的简介一、什么是框架框架 即fr a mew ork。其实就是某种应用的半成品就是一组组件...
  • Thinkphp5.1 文件引入1、视图文件中引入其他的视图文件文件目录如下图:需要实现在index.html中引入public文件夹下面的四个html模板文件,index.html引入代码如下:{include file="/public/_meta"}{include file="/...
  • ThinkPHP5.1 模板替换字符串 踩坑 ...说起来惭愧,以前没有接触过ThinkPHP3.2及相关知识,刚一上手ThinkPHP5.1就感觉头沉脚清,这里要说的是再简单不过的模板字符串替换:tpl_replace_string的填坑记。 tpl_r...
  • 一般而言,网页传统方式的导入外部JS和CSS等资源文件的方法是直接在模板文件使用: [removed] <link rel="stylesheet" type="text/css" href="/App/Tpl/default/Public/css/style.css" /> ThinkPHP的模板...
  • THINKPHP作为PHP脚本语言构建WEB程序常见以及必须涉及的框架之一,学习TP框架和PHP实际应用直接相关。下面小菌分享一下TP的框架目录供学习者参考。project 应用部署目录├─application 应用目录(可设置)│ ├─...
  • thinkphp6 异常处理

    2021-07-10 10:00:00
    <?... //如果想更改异常页面的样式、布局之类的,可以修改这个页面: vendor/topthink/framework/src/tpl/think_... // 异常页面的模板文件 'exception_tmpl' => app()->getThinkPath() . 'tpl/think_exceptio
  • ThinkPHP入门

    2013-03-21 10:35:35
    获取自己所需要的thinkPHP版本 解压,ThinkPHP放置在自己的项目中,并在自己的项目文件夹下编辑index.php(ps:项目文件夹名是MagicCube)  1   2 // 定义项目名称  3 define( 'APP_NAME', '...
  • 本文实例讲述了ThinkPHP实现动态包含文件的方法。分享给大家供大家参考。具体分析如下:问题描述:在做项目的时候遇到问题,也是很常见的问题,一般主页包含头部和脚步,为了方便管理,这些都需要使用包含文件来实现,...
  • &lt;!DOCTYPE html&gt; &lt;html lang="en" xmlns="http://www.w3.org/1999/html"&gt; &lt;head&gt; &lt;meta charset="UTF-8".../tit
  • ThinkPHP文件缓存类代码 ThinkPHP ?php /** * @desc 文件缓存 * @edit http://www.lai18.com */ class Cache{ const C_FILE = '/Runtime/'; private $dir = ''; const EXT = '.tpl'; private $filename = ''; public...
  • thinkphp 实现模板在同一个目录下thinkphp 默认模板目录结构是|-Tpl|----模块名|--------操作名.html|--------操作名.html|----模块名|--------操作名.html|--------操作名.html现在如果想实现这样的结构:|-Tpl|---...
  • 前端独立之前的目录thinkphp默认的View模板文件都是在/Application各个模块下的,css、js之类的资源文件是放在/Public目录下,大致是这个样子的:ThinkphpSample├─Application 项目逻辑目录│ ├─Common 公共模块...
  • Unable to load template file 'rj\ThinkPHP/Tpl/dispatch_jump.tpl'----thinkphp3.2.3 1.报错原因:将thinkphp默认模板引擎改为smarty模板引擎,导致调用success()和error()方法失败。 2.解决方案一: 找到...
  • ThinkPHP5.1 文件引入路径问题

    千次阅读 2018-06-12 14:47:49
    Thinkphp5.1 文件引入 1、视图文件中引入其他的视图文件 文件目录如下图: 需要实现在index.html中引入public文件夹下面的四个html模板文件,index.html引入代码如下: {include file=&quot;/public/_...
  • 本文实例讲述了Thinkphp模板没有解析直接原样输出的解决方法。分享给大家供大家参考。具体如下: 一、问题: 最近在学习thinkphp模板了,但是发现模板页原样出来了,经过一番艰苦搜索终于找到解决方案。 二、解决...
  • 默认的模板路径为TP目录下的 ThinkPHP/Tpl/dispatch_jump.tpl文件。修改配置文件在应用目录下的/Common/Conf/config.php中添加/* 错误页面模板 */ 'TMPL_ACTION_ERROR' => 'Public/dispatch_jump', // 默认错误跳转...
  • 如果32313133353236313431303231363533e59b9ee7ad9431333337613134您使用的是Unix/Linux主机,请修改该文件的权限为777。如果您使用的是Windows主机,请联系管理员,将此文件设为可写');}if(!is_wri...
  • thinkphp5.1模板中获取资源文件路径

    千次阅读 2018-09-15 14:48:42
    thinkphp5.1月thinkPHP5.0不同没有默认设置任何模板替换变量,如果需要使用模板替换,需要在template.php配置文件中添加如下: 'tpl_replace_string' =&gt; [ '__STATIC__'=&gt;$_SERVER['REQUEST_SCHEME...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,759
精华内容 1,103
关键字:

tpl文件thinkphp