楼兰's Blog - 每一个漏洞都是一个故事,都应给予相应的尊重

ThinkPHP3.2.3 模糊搜索分页功能实现

ThinkPHP3.2.3的分页类页面跳转时支持携带参数

ThinkPHPLibraryThinkPage.class.php

clipboard.png

但是分页类在传入参数时只支持数组条件且只能是普通查询

因为分页类内部调用了U函数来拼装URL,但是U函数不支持参数是多重数组的形式

clipboard.png

因此考虑区分传入分页类、传入数据库的参数数组

clipboard1.png

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {

    public function index(){

        # ThinkPHP自帶的分页类传参时只接受字符串类型,因此当参数是数组类型时创建两个数字来传参
        # ThinkPHP的分页类通过在URL中传参来实现查询分页

        # page_search用作Page类传参使用
        $page_search = array();
        # sql_search用作数据库查询时使用的条件
        $sql_search = array();
        foreach (I('param.') as $key => $value) {
            if (empty($value)) {
                continue;
            }
            # 公司名使用模糊搜索
            if ($key == 'company_name') {
                $page_search['company_name'] = $value;
                $sql_search['company_name'] = array('like', '%'.$value.'%');
            # 其他参数使用全匹配
            }else{                
                $page_search[$key] = $value;
                $sql_search[$key] = $value;
            }
        }

        $Company = M('corp_info');
        $count = $Company -> where($sql_search) -> count();
        $pagesize = 10;
        # Page类使用page_search来保证分页跳转时需要的参数
        $Page = new \Think\Page($count, $pagesize, $page_search);
        $show = $Page -> show();

        $all_company_info = $Company
                            -> where($sql_search)
                            -> limit($Page->firstRow.','.$Page->listRows)
                            -> select();
        $this -> assign('all_company_info', $all_company_info);
        $this -> assign('page', $show);
        $this -> display();
    }
}

clipboard2.png

GDB学习笔记

编译

hello.c

#include <stdio.h>

void main(int argc, char *argv[]){

    if(argc > 1){
        printf("First argv: %s\n",argv[1]);
    }else{
        printf("No argv!\n"icon_question.gif;
    }
}

编译

gcc -g hello.c -o hello.o

进入调试

gdb hello.o

帮助命令

help [命令]

启动程序

run [命令行参数]

Snipaste_2020-08-24_11-00-44.png

GDB支持命令的缩略形式,还支持TAB键快速补齐

Snipaste_2020-08-24_11-50-44.png

也可以使用start命令启动程序,会自动执行到main函数

start [命令行参数]

Snipaste_2020-08-23_01-14-46

设置断点

可以指定函数、指定行数设置断点

break [file:]function
    Set a breakpoint at function (in file).

Snipaste_2020-08-24_11-17-53.png

查看所有断点

info break

删除断点(通过指定源代码行数),若指定函数名,则删除该函数所有断点

clear 源代码行数/函数名

删除断点(通过指定断点编号),若不指定编号,则删除所有断点

delete [断点编号]

禁用断点

disable 断点编号

启动断点

enable 断点编号

Snipaste_2020-08-24_15-55-56.png

单步执行

step 相当于其他调式程序中的step into/步进

遇到子函数时会进入子函数继续单步执行

next 相当于其他调试程序中的step over/跨越

遇到子函数时会当作一个整体,直接返回子函数的执行结果

finish 相当于其他调试程序中的step out/步出

直接执行完当前函数,返回到上层函数调用处

查看变量

print 变量名/表达式

Snipaste_2020-08-24_15-21-18.png

支持以不同的形式进行输出

Snipaste_2020-08-24_15-47-27

display 变量名/表达式

使用display命令设置变量名/表达式后,每次程序暂停都会自动打印该变量/表达式的值

Snipaste_2020-08-24_15-35-58

可以使用info display查看所有设置的变量/表达式

可以使用undisplay 编号删除设置的变量/表达式

Snipaste_2020-08-24_15-38-03

查看变量的内存地址

print &变量

监控变量

watch 变量名/表达式

设置完待监控的变量后

执行continue(c)命令后,程序会一直运行到该变量值发生改变

Snipaste_2020-08-24_15-04-58

可视化页面

ctrl+x a

按住ctrl+x,然后松开ctrl,然后a

或者ctrl+x 1

Snipaste_2020-08-23_01-24-23

同时打开反汇编窗口

ctrl+x 2

按住ctrl+x,然后松开ctrl,然后1

Snipaste_2020-08-24_18-17-03

执行Python代码

通过python命令进入shell,通过end命令退出shell

Snipaste_2020-08-24_09-58-28

也可以不进入python shell直接执行python代码

Snipaste_2020-08-24_10-07-01

需要留意的是,自带一个gdb模块

Snipaste_2020-08-24_10-09-58

利用gdb模块,查看所有断点

python print(gdb.breakpoints)

Snipaste_2020-08-24_10-13-59

其他

查看当前行数附近行或者指定函数

默认显示10行

list

Snipaste_2020-08-23_01-19-13.png

搜索关键字

search

参考文章

Give me 15 minutes & I'll change your view of GDB

GDB Text User Interface

1小时玩转Linux gdb命令

惨~

刚刚在清除垃圾评论的时候一不小心把所有评论都删除了。。尴尬

还有,Paper中的一些图片放在了国外的服务器,被墙了,所以需要扶墙。。