首先我要吐槽一个问题:为什么在博客园发布的文章总是被其他网站采集过去,而他们采集过去后,排名比博客园还好,比如这篇文章,我把标题复制到百度搜索,结果第一页的搜索结果全部都是采集我的,而我在博客园发布的这篇文章竟然直接没有收录,大哥们啊,搞清楚好吗,我这是原创文章。

如题,在有些项目中,我们需要把模板开放给第三方用户编辑,那么此时模板里面能使用php代码,将会是很重大的安全隐患。

那么如何禁止模板里面使用php代码呢?官方没有给出一个配置项,这是很遗憾的一件事情,没办法,那么我们只能自己修改代码禁止模板使用php了。

1、禁止模板使用<?php ?>标签,通过以下配置项完成

'TMPL_DENY_PHP'    =>    true,    //禁用原生php

2、禁止模板使用<php></php>标签

打开文件:ThinkPHP/Library/Think/Template/TagLib/Cx.class.php

注释大概21行的代码,意思就是注释php的解析标签,这样这个标签就会被原样输出,不会被解析:

3、禁止模板使用<if> 和 <elseif> 标签

由于if 标签和 elseif 标签里面可以使用函数,所以他们两个同样很危险。需要禁止

打开文件:ThinkPHP/Library/Think/Template/TagLib/Cx.class.php

注释大概24、25行代码:

4、禁止模板对变量使用函数,例如{:$addtime|date="Y-m-d",###}

像这样的函数用法,虽然方便,但是我们同样要禁止,否则还是存在安全隐患,因为可以把需要执行的函数写在|后面啊。

打开文件:ThinkPHP/Library/Think/Template.class.php

找到 parseVarFunction 函数,大概566行。按照我下面的图片一样注释

5、禁止语法 {:函数名或变量}

如{:phpinfo()}、等  在冒号后面可以写,任意变量,和任意函数,这个也很危险。同样需要屏蔽

①先自定义一个全局config 'TEMP_SAFE' => '1',

'TEMP_SAFE' => '1',    //不解析{:} 与 {$Think}

②打开文件:ThinkPHP\Library\Think\Template.class.php

来到大概479行,把如下代码:

if('$' == $flag && '.' != $flag2 && '(' != $flag2){ //解析模板变量 格式 {$varName}
return $this->parseVar($name);
}elseif('-' == $flag || '+'== $flag){ // 输出计算
return '<?php echo '.$flag.$name.';?>';
}elseif(':' == $flag){ // 输出某个函数的结果
return '<?php echo '.$name.';?>';
}elseif('~' == $flag){ // 执行某个函数
return '<?php '.$name.';?>';
}elseif(substr($tagStr,0,2)=='//' || (substr($tagStr,0,2)=='/*' && substr(rtrim($tagStr),-2)=='*/')){
//注释标签
return '';
}

替换成:

    $safe    = C('TEMP_SAFE');
if('$' == $flag && '.' != $flag2 && '(' != $flag2){ //解析模板变量 格式 {$varName}
return $this->parseVar($name);
}elseif(substr($tagStr,0,2)=='//' || (substr($tagStr,0,2)=='/*' && substr(rtrim($tagStr),-2)=='*/')){
//注释标签
return '';
}elseif($safe !='1'){
if('-' == $flag || '+'== $flag){ // 输出计算
return '<?php echo '.$flag.$name.';?>';
}elseif(':' == $flag){ // 输出某个函数的结果
return '<?php echo '.$name.';?>';
}elseif('~' == $flag){ // 执行某个函数
return '<?php '.$name.';?>';
}
}

6、应对$Think和|函数被解析

打开文件:ThinkPHP\Library\Think\Template.class.php

搜索代码:

if('Think.' == substr($var,0,6)){

改成

$safe    = C('TEMP_SAFE');
if('Think.' == substr($var,0,6) and $safe!='1'){

搜索:

if(count($varArray)>0)

改成:

if(count($varArray)>0 and $safe!='1')

打开文件:ThinkPHP\Library\Think\Template\TagLib.class.php

搜索:

if('Think.' == substr($name,0,6))

改成:

if('Think.' == substr($name,0,6) and C('TEMP_SAFE')!='1')

完成

Thinkphp模板开放给第三方编辑权限时,如何禁止模板使用php代码的更多相关文章

  1. EasyWeChat微信开放平台第三方平台接入

    EasyWeChat微信开放平台第三方平台接入 https://www.cnblogs.com/bainiu/p/8022729.html

  2. ThinkPHP vendor 方法导入第三方类库

    ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展 ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项 ...

  3. 《转》Unity3D研究院编辑器之创建Lua脚本模板

    Unity里能创建 c#脚本模板,但是如果我想创建Lua脚本模板怎么办呢?拓展一下编辑器吧. 设置一下Lua脚本的模板地址 :  Assets/Editor/Lua/Template/lua.lua ...

  4. 【模板下载】innosetup 制作.net安装包的模板

    NetworkComms网络通信框架序言 这个模板是在博客园和CodeProject上的代码修改而成的,感谢原作者 模板是2个 innosetup 制作.net 2.0 安装包的模板 innosetu ...

  5. 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

    https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ...

  6. html 事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

    看一个简单的例子: html: <head> <meta charset="UTF-8"> <title>Document</title& ...

  7. AngularJs 禁止模板缓存

    因为AngularJs的特性(or 浏览器本身的缓存?),angular默认的HTML模板加载都会被缓存起来.导致每次修改完模板之后都得经常需要清除浏览器的缓存来保证浏览器去获得最新的html模板,自 ...

  8. php微信开放平台--第三方网页微信扫码登录(OAuth2.0)

    第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提 ...

  9. 【小程序】基于.NET CORE2.1 的 微信开放平台 第三方平台开发 教程一 准备工作

    微信第三方平台概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认 ...

随机推荐

  1. [tmux] Zoom and resize to view a particular pane within tmux

    Sometimes you'll want to zoom in on a specific pane within a tmux window. We'll learn to use C-b z t ...

  2. 基于 Android NDK 的学习之旅-----HelloWorld

    Hello World作为所有编程语言的起始阶段,占据着无法改变的地位,所有中/英/法/德/美……版本的编程教材中,hello world总是作为第一个TEST记录于书本之中,所有的编程第一步就在于此 ...

  3. 王立平--TableLayout

    效果: <?xml version="1.0" encoding="utf-8"?>  <TableLayout xmlns:android= ...

  4. DesignPattern_Java:SingletonPattern

    单例模式 SingletonPattern Ensure a class has only one instance,and provide a global point of access to i ...

  5. Erlang中频繁发送远程消息要注意的问题

    http://avindev.iteye.com/blog/76373 注:这篇文章可能会有争议,欢迎提出意见 在Erlang中,如果要实现两个远程节点之间的通信,就需要通过网络来实现,对于消息发送, ...

  6. Mac下新安装的MySQL无法登陆root用户(安装时没有设置密码)

    1.也不知是何原因,新安装好的MySQL,如果尝试用mysql -u root -p登陆就会出现这样的错误,但是root用户根本就没有设置密码. $ cd /usr/local$ cd mysql $ ...

  7. 大型项目linux自动化版本发布脚本(shell)之tomcat、nginx服务脚本

    开发十年,就只剩下这套Java开发体系了 >>>   最近,又临近博主所负责的一个大型项目的发版了.之前有提到过,该项目涉及到30-40台服务器的发版.且项目客户规定发版需在晚上10 ...

  8. gradle命令学习

    概述 命令学习比较枯燥,全部是例子~ gradle版本 假设你的本地gradle已经安装配置完成.没有安装配置的,可以参考 gradle安装 C:\Users\yueling.DANGDANG> ...

  9. 苹果抛弃的芯片公司Imagination被中资49亿溢价收购

    原标题:中国资本Canyon Bridge出资5.5亿英镑收购Imagination芯片 来源:观察者网 对于一家手机硬件公司来说,被苹果看上可谓是“一夜之间,鸡犬升天”.但是如果被苹果抛弃了呢?那可 ...

  10. tomcat启动时自动加载一个类 MyServletContextListener

    目的: 我们知道在tomcat启动后,需要页面请求进行驱动来执行操作接而响应.我们希望在tomcat启动的时候能够自动运行一个后台线程,以处理我们需要的一些操作.因此需要tomcat启动时就自动加载一 ...