1. 程式人生 > >初識thinkphp(3)

初識thinkphp(3)

絕對路徑 inf wid 客戶端 pre 了吧 post coo 文件

這篇內容主要涉及請求相應內容。

該系列主要是個人筆記,且內容是連貫的,其中涉及到的自己寫的模塊或者方法在前面文章中有介紹咋來的,如果您看得雲裏霧裏,給您帶來不便,真的不好意思。

0x01:請求對象

技術分享圖片

官方的內容是為了安全和統一,而引用Request對象

學過編程語言的都不陌生面向對象程序設計,而我們的Request大概就是C++中說所的類的概念

我們在之前創建的demo模塊中的helloword控制器中創建操作req(),並在router路由中添加路由信息

 <?php
namespace app\demo\controller;

use think\Request;

class HelloWorld
{
public function helloworld()
{

return "Hello World";
}
public function hello($name=‘yayayayaya‘)
{
return "Hello thinkphp ". $name;
}
public function req()
{
$request = Request::instance();
echo ‘url : ‘ . $request->url() . ‘<br/>‘;
return ;
}
}

查看回顯:

技術分享圖片

這裏發現它返回的不是絕對路徑,而是走的我們之前設置好的路由的路徑

如果訪問它的絕對路徑

技術分享圖片

可以確定 Request中的url()方法返回的是輸入的url的路徑信息。

另一種方法,我們直接繼承Controllel類(估計這個類含有Request對象)

在類裏面用this指針訪問繼承下來的request對象的url()函數

這裏方便起見,我把自己寫的毫無用處的helloworld方法給刪了

<?php
namespace app\demo\controller;

use think\Controller;

class HelloWorld extends Controller
{
    
public function hello($name=‘yayayayaya‘) { return "Hello thinkphp ". $name; } public function req() { echo ‘url : ‘ . $this->request->url() . ‘<br/>‘; return ; } }

回顯效果同上~

官方建議方式是直接在參數中添加該對象,並且這裏不用賦初識值都行。

<?php
namespace app\demo\controller;

use think\Request; class HelloWorld { public function hello($name=‘yayayayaya‘) { return "Hello thinkphp ". $name; } public function req(Request $req) { echo ‘url : ‘ . $req->url() . ‘<br/>‘; return ; } }

回顯內容還是同上~

這裏我最開始認為這不和第一個方法相同嗎,我就直接把Request $req丟入req方法裏面,結果報錯。

仔細一想,helloworld類又沒有繼承Request是無法類裏面方法直接聲明的。而官方推薦方法在參數位置申明,是從外部調用的並不需要繼承。

這樣回頭來看,第一種方法即使通過作用域Request::來調用instance()這個類比像Java中的"new {類名}"之類的操作。

還提供了2種發法,了解能用就好了吧

這裏沒有用use 引入,直接調用助手函數來達到目的

<?php
namespace app\demo\controller;


class HelloWorld
{
    public function hello($name=‘yayayayaya‘)
    {
        return "Hello thinkphp ". $name;
    }
    public function req()
    {
        echo ‘url : ‘ . request()->url() . ‘<br/>‘;
        return ;
    }
}

這裏只要聲明下作用域為Request類就能訪問該類裏面的公有方法url()

<?php
namespace app\index\controller;

use think\facade\Request;

class Index
{
    public function hello($name = ‘World‘)
    {
        // 獲取當前URL地址 不含域名
        echo ‘url: ‘ . Request::url() . ‘<br/>‘;
        return ‘Hello,‘ . $name . ‘!‘;
    }
}

0x02:請求信息

在說這個內容的時候,我們需要了解下Request這個類是來存放$_GET$_POST$_REQUEST$_SESSION$_COOKIE$_FILES這些"數組"中的信息的,我們可以把它當做Request包含著這些"數組"的各個鍵值對的映射內容。

那麽在這裏我們就要來訪問,Request這個裏面所包含的鍵值對的信息。

我們用param方法來實現。

<?php
namespace app\demo\controller;
use think\Request;

class HelloWorld
{
    public function hello($name=‘yayayayaya‘)
    {
        return "Hello thinkphp ". $name;
    }
    public function req(Request $req)
    {
        var_dump($req->param());
        return ;
    }
}

回顯:

技術分享圖片

我們這些請求都是get請求,我們傳幾個參數進去。

技術分享圖片

數組裏面有內容了。

也可以直接調用相應信息的"數組"的方法:

<?php
namespace app\demo\controller;
use think\Request;

class HelloWorld
{
    public function hello($name=‘yayayayaya‘)
    {
        return "Hello thinkphp ". $name;
    }
    public function req(Request $req)
    {
        var_dump($req->param());
        echo "<br>";
        var_dump($req->get());
        echo "<br>";
        var_dump($req->post());
        return ;
    }
}

回顯內容:

技術分享圖片

之前也說了,因為這個是GET所以這裏的post()方法被調用了內容也是空,我們試著用hackbar發點數據過去

技術分享圖片

POST裏面也有值了。

使用助手函數input也可以達到類似於以上效果

技術分享圖片

從官方手冊上戳一個表

技術分享圖片

這裏再介紹幾種Request的方法

method()請求方式,一般就是POST和GET顯示

type()資源類型html/php/jsp之類的

ip()訪問者ip

only([ 只有該鍵的信息被調用 ])

except([ 只有該鍵的信息不被調用 ])

技術分享圖片

這裏的方法我試著用了些,顯示結果就不貼圖了

還可以進行以下操作

技術分享圖片

還可以獲取當前模塊的信息

module()模塊名

controller()控制器名

action()操作名

routeinfo()路由信息(我試了,加了路由,為啥返回是空數組qwq)

dispatch()調度信息

0x03:響應對象

有傳給服務器的信息,那麽就有服務器傳給用戶的信息。而respond這個響應對象就是對這個個操作。

這裏是內容與thinkphp5無關,只是作者聯想到的內容:看到 respond和request,想到用wrieshark對pcap包過濾請求和響應方式的時候就有request.method和rospond.code之類的過濾條件,看到這裏對wrieshark也有了一些理解吧。

回到正題,thinkphp5會根據響應來判斷是ajax(js和xml)還是普通的通過default_return_type和default_ajax_return

我們可以瞧瞧這2個值的屬性,在application\config.php中

技術分享圖片

也就是說我們這裏說的respond響應的default_return_type大致可以理解成我們的return的內容。

下面添加一個新的操作(方法)

技術分享圖片

返回單個值是正常的。

技術分享圖片

返回數組會報錯。

修改下我們上面的defaul_return_type就正確的可以顯示了。

或者不修改配置文件,寫成這樣也是可以的。

技術分享圖片

然後我們還可以規定修改響應頭的參數,CTF中有些web題的信息大概可以通過這種方式加到響應頭裏去吧(笑)

技術分享圖片

我們再次訪問resp操作看看我們的響應頭

技術分享圖片

官方給出可以進行操作的樣式有這些。

技術分享圖片

頁面跳轉功能,在客戶端輸入正確的參數的時候我們給予相應正確的跳轉,反之我們給予錯誤的跳轉。

技術分享圖片

如果var是sijidou就跳轉之前寫的req()方法中,否則跳到寫的resp()方法中

這裏有個註意 use \traits\controller\Jump應放在類裏面,如果放在類外面,他會報錯

然後就是重定向了,這個重定向可以支持用use \traits\controller\Jump來調用,也可以使用助手函數redirect()來完成,這裏我們演示下使用use \traits\controller\Jump來調用,重定向到百度是可以實現的。

技術分享圖片

這裏我輸百度的url的時候,最先沒加http://頭,報錯說找不到www.baidu.com模塊,顯然,它是走的自身模塊去匹配,那麽要跳轉到不是我這個系統的網站,那麽要加上http://之類的請求頭。

初識thinkphp(3)