說說TP5.0.x命令是如何執行filter的!

2022-01-27 19:01:10

下面教學欄目將給大家介紹Thinkphp5.0.x命令怎麼執行filter,希望對需要的朋友有所幫助!

Thinkphp5.0.x命令執行

同樣是利用call_user_func()進行命令執行,在Request類的函數filterValue中執行【推薦:】

首先搜尋哪些函數呼叫了filterValue:

在Request類中的cookie()和input()函數中呼叫了filterValue()

搜尋cookie函數呼叫情況,未發現結果;搜尋input呼叫情況:

從run函數跟進:

Step1

$request = is_null($request) ? Request::instance() : $request;

會執行request的建構函式,此時已經通過建構函式中file_get_contents(‘php://input’)獲取到了POST的內容並賦值給$request->input變數

Step2

$dispatch = self::routeCheck($request, $config);

在routeCheck中會進入Route類的check函數:

check函數呼叫了$request->method():

傳入引數預設值為false,會執行到elseif中獲取var_method => _method,下面會對獲取到的變數進行覆蓋,此時如果傳入__construct,$_POST獲取到post提交的資料,即可在construct函數中遍歷POST的陣列對request類中的成員進行覆蓋

以下利用過程需要:debug模式開啟

在run()中會呼叫param():

跟進param函數:

/**

* 獲取當前請求的引數

* @access public

* @param string|array $name 變數名

* @param mixed $default 預設值

* @param string|array $filter 過濾方法

* @return mixed

*/

首先進入if條件,跟進method方法

method()傳入引數為true:

執行下面語句:獲取原始請求型別$_SERVER['REQUEST_METHOD'],返回值為POST

返回到param中,$method=POST

因此會執行switch中的POST部分,進入post函數:

post函數:

/**

* 設定獲取POST引數

* @access public

* @param string $name 變數名

* @param mixed $default 預設值

* @param string|array $filter 過濾方法

* @return mixed

*/

傳入引數:

,然後複製給$content,然後對$_POST和是否json格式判斷,如果是json傳入還需要進行json_decode,否則直接使用$_POST的值

進入input方法:傳入引數為POST所獲取到的

Name為false,input返回data,post()直接返回

param()函數中:$vars = $this->post(false);

進入getFilter:

getFilter中$filter = $filter ?: $this->filter;獲取到$request類的filter變數值(之前在construct遍歷覆蓋的),並作為返回值給input函數

繼續執行array_walk_recursive($data, [$this, 'filterValue'], $filter);

array_walk_recursive() 函數對陣列中的每個元素應用使用者自定義函數。在函數中,陣列的鍵名和鍵值是引數

相當於$filters=system$data中的每一個變數作為$value傳入,當取到ccc=ipconfig時,system作為call_user_func第一個引數,ipconfig作為第二個,造成了命令執行。

執行結果:

以上就是說說TP5.0.x命令是如何執行filter的!的詳細內容,更多請關注TW511.COM其它相關文章!