ThinkPHP

基于workerman的实时推送

末鹿安然 提交于 2020-05-09 06:31:44
TCP/IP TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。 在应用层有: TCP包括FTP、HTTP、TELNET、SMTP等协议 UDP包括DNS、TFTP等协议 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。 长连接 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 http的长连接 HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。 什么时候用长连接,短连接? 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开

Thinkphp 5.1.7 parseData缺陷导致insert/update注入 分析

爱⌒轻易说出口 提交于 2020-05-08 10:26:56
[TOC] 环境搭建 $ composer create-project topthink/think thinkphp-5.1.7 修改composer.json 5.1.* => 5.1.7 $ composer update 分析 这个注入点与5.0.15的注入点位置都在parseData里,都是在解析set-data时直接将用户完全控制的data拼接到SQL语句中。 下面来看漏洞点,首先根据Github的commit记录进行定位 可以看到这里直接删除了default语句块,并直接删除了parseArrayData方法。 我们下面通过搭建5.1.7环境,来看一下被删掉的语句在原版本中会有怎样的影响。首先看一下控制器 这里获取一个username数组get变量,传给$username,然后作为字段'name'的值,插入test表。 我们先请求一条测试url: 127.0.0.1/thinkphp/thinkphp_5.1.7/public/index.php/index/index/sqli?username[0]=aaa&username[1]=bbb 可以看到此时$username的值为{"aaa","bbb"}。 下面在commit删除的部分下个断点,由于这个断点位于parseData()处,所以我们先从parseData开始跟。 可以看到,这里将$data解析成键值对

ThinkPHP<6.0 SQL注入代码审计分析

元气小坏坏 提交于 2020-05-08 09:25:19
版本过多只分析大版本和使用人数较多的版本目前使用人数最多的3.2.3。审计时也是发现多个版本未公开漏洞 测试环境: Mysql5.6/PHP5.5 首先明确的是在不使用PDO做参数绑定时ThinkPHP全版本都可能存在宽字节注入。 黑盒检测方法:输入于头字节大于7F测试数据例如: %88%5c%27%5eupdatexml(1,concat(0x7e,database()),3)%23 (%5e 后跟任意T-SQL语句) 白盒检测方法 全局搜索默认格式是否被设置GBK 'DEFAULT_CHARSET' => 'utf-8', // 默认输出编码 或者 mysql_query ("SET NAMES gbk"); Where方法 也是使用的最多的条件查询方法,支持查询条件预处理 1. $Model ->where(" id=%d and username='%s' and xx='%f' ", array ( $id , $username , $xx ))-> select(); 2. // 或者 3. $Model ->where(" id=%d and username='%s' and xx='%f' ", $id , $username , $xx )->select(); 而他的预处理实际上调用了addslashes() 方法 /* * * SQL指令安全过滤 *

使用phpexcel解析Excel数据表并存储到数据库中全过程_PHP_thinkphp_cmf

拈花ヽ惹草 提交于 2020-05-08 06:10:57
分享经验是为了让你少走弯路————华伟君 ##使用PHPExcel解析Excel数据表并存储到数据库中全过程 ###第一部分:thinkphp中实例化上传类获取from表单提交的文件(非thinkPHP用户可以忽略,直接看第二部分) ####HTML文件核心代码: <form action="{:U('Question/add_excel_post')}" enctype="multipart/form-data" method="post"> <input type="file" name="excel_file" class="input"> <button class="btn btn-primary" type="submit">上传</button> </form> ####PHP文件接收上传的核心代码: $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = 3145728 ;// 设置附件上传大小 $upload->exts = array('xls', 'xlsx');// 设置附件上传类型 $upload->rootPath = './'; // 设置附件上传根目录 $upload->savePath = 'Uploads/ExamPaper/'; // 设置附件上传(子)目录 $upload-

Laradock 使用中遇到的问题汇总

≯℡__Kan透↙ 提交于 2020-05-08 05:20:16
1、ErrorException] mkdir (): Permission denied 解决:权限不够,thinkphp5下,runtime 文件夹改777,文件所有者改为 laradock(进入workspace执行)。 2、thinkphp5 使用exit()函数,nginx返回500状态码 解决:runtime 文件夹改777 3、连接问题 在容器中执行时,MySQL连接的 Host 设置为 mysql,如果是外部客户端直接连接的话设置为常规地址。 redis等同理。 4、 win10构建workspace时,报错提示/tmp/sources.sh: not found git bash 中 切换到 laradock 目录 $ vi ./workspace/sources.sh $ :set ff=unix $ :wq https://github.com/laradock/laradock/pull/2388 5、NVM 慢的问题 在 env 文件中设置 WORKSPACE_NVM_NODEJS_ORG_MIRROR = https://npm.taobao.org/mirrors/node 这是设置 nvm 安装 nodejs 时从哪个镜像下载源文件的参数,设置后, nodejs 安装的飞快. https://segmentfault.com/a

thinkphp5的mkdir() Permission denied问题

可紊 提交于 2020-05-08 04:42:30
最近一直在用tp5写项目,在此遇到的问题也比较多。今天来谈谈“mkdir() Permission denied”错误。 你如果不仅仅写代码,还得部署到线上,那么这个tp5的这个错误,你有很大概率会遇见它。 因为这跟文件的权限有关系,特别是自动生成的文件或者目录类的权限,linux服务器出于安全因素对于用户的权限有着严格的控制。 对于tp框架而言,自动生成的文件或者目录应该是runtime目录,所以在线部署代码的时候,开放此类目录的权限。 所以解决mkdir() premission denied 的问题最直接的方式,把runtime权限放开,让所有用户都可以创建它。 chmod -R 777 runtime 在liunx中进入项目目录执行以上命令,就能解决这个问题,简单,高效。 如果你对文件的安全要求比较苛刻,那么以上的答案并不能令你满意,简单,高效的方法背后一般需要牺牲一些安全因素为代价。 但以下提供的方法或许是一个不错的选择。 更改runtime目录的所有者,也就是runtime这个目录权限只针对所有者开放。 以我的项目为例,服务器是nginx,nginx中设置的访问用户为www用户,那么我只需要把runtime目录有root用户改为www用户就能解决此问题。 ps aux |grep nginx //查看当前的nginx进程,能够找到nginx用户是哪个(可能是www

Thinkphp5.0 的视图view的比较标签

佐手、 提交于 2020-05-07 11:00:56
Thinkphp5.0 的视图view的比较标签 {eq name="a" value="10"} < p > 相等 </ p > {else/} < p > 不相等 </ p > {/eq} {equal name="a" value="10"} < p > 相等 </ p > {else/} < p > 不相等 </ p > {/equal} {neq name="a" value="10"} < p > 不相等 </ p > {else/} < p > 相等 </ p > {/neq} {notequal name="a" value="10"} < p > 不相等 </ p > {else/} < p > 相等 </ p > {/notequal} {egt name="a" value="10"} < p > 大于等于 </ p > {else/} < p > 小于 </ p > {/egt} !!!如果需要在模板中使用两个变量进行比较,value的值需要使用$符号: $b可以使用双引号,也可以使用单引号。 {eq name="a" value="$b"} < p > 变量a和变量b相等 </ p > {else/} < p > 变量a和变量b不相等 </ p > {/eq} 条件判断标签: switch标签: {switch name='user_level'}

Thinkphp5.0 视图view取值

折月煮酒 提交于 2020-05-07 11:00:34
Thinkphp5.0 视图view取值 <!-- 获取控制器传递的变量 --> <li>{ $age }</li> <!-- 获取服务器的信息 --> <li>{ $Think .server.HTTP_HOST}</li> <!-- 获取env环境变量 --> <li>{ $Think .env.PHP_STATUS}</li> <!-- 获取session --> <li>{ $Think .session.username}</li> <!-- 获取cookie --> <li>{ $Think .cookie.username}</li> <!-- 获取参数 --> <li>{ $Think .request.id}</li> <li>{ $Think .get.id}</li> <li>{ $Think .post.id}</li> <!-- 获取常量 --> <li>{ $Think . const .APP_PATH}</li> <li>{ $Think .APP_PATH}</li> <li>__STATIC__</li> <li>__CSS__</li> <li>__JS__</li> <li>__URL__</li> <li>__ROOT__</li> 模板中使用函数: <!-- 使用md5函数 --> <li>ID : { $id | md5 }</li>

ThinkPHP5.0-模板定位

让人想犯罪 __ 提交于 2020-05-07 09:04:42
模板文件定义 每个模块的模板文件是独立的,为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是: 视图目录/控制器名(小写)/操作名(小写)+模板后缀 默认的视图目录是 模块的view目录 ,框架的默认视图文件后缀是 .html 。 模板渲染规则 模板渲染使用 \think\View 类的 fetch 方法,渲染规则为: 模块@控制器/操作 模板文件目录默认位于模块的view目录下面,视图类的fetch方法中的模板文件的定位规则如下: 如果调用没有任何参数的fetch方法: return $view - > fetch ( ) ; 则按照系统的默认规则定位模板文件到: [模板文件目录]/当前控制器名(小写+下划线)/当前操作名(小写).html 如果(指定操作)调用: return $view - > fetch ( 'add' ) ; 则定位模板文件为: [模板文件目录]/当前控制器名(小写+下划线)/add.html 如果调用控制器的某个模板文件使用: return $view - > fetch ( 'user/add' ) ; 则定位模板文件为: [模板文件目录]/user/add.html 跨模块调用模板 return $view - > fetch ( 'admin@user/add' ) ; 全路径模板调用: return

Thinkphp5 模型里别名alias不生效bug【已解决】

让人想犯罪 __ 提交于 2020-05-07 09:04:28
使用很长一段时间的Thinkphp5.0,一直被一个问题困扰,就是模型里面数据查询无法使用别名,除非使用DB类 但是模型里面一般是直接使用 $this 或 静态方法 self 例如写一个 Join 查询 当前表取别名为t,查看当前Sql 可以看到别名没有起作用,经过我再三翻找源码,定位的位置是 \thinkphp\library\think\db\Query.php 尝试过,Db::name 与 self 都是这个分支 而 self 的表名是未转化的,转化一下就行,添加代码 if (false !== strpos($table, '__')) { $table = $this->parseSqlTable($table); } 添加完成后截图 解决完成 来源: oschina 链接: https://my.oschina.net/u/2966154/blog/1926295