Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产亚洲精品中文带字幕21页,免费一级毛片,欧美日韩顶级毛片www免费看

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          「ThinkPHP5開發連載十三」頁面跳轉

          「ThinkPHP5開發連載十三」頁面跳轉

          一篇文章講解“空操作+空控制器”,本篇文章講解“頁面跳轉”。


          在應用開發中,經常會遇到一些帶有提示信息的跳轉頁面,例如操作成功或者操作錯誤頁面,并且自動跳轉到另外一個目標頁面。系統的\think\Controller類內置了兩個跳轉方法success和error,用于頁面跳轉提示。


          1. 使用

          使用方法較為簡單,不具體舉例,直接進行測試使用。

          瀏覽器訪問:

          將$flg的值設為0,程序走else錯誤提示,瀏覽器重新訪問:

          注意:

          1. 跳轉地址是可選的,success方法的默認跳轉地址是$_SERVER["HTTP_REFERER"],error方法的默認跳轉地址是javascript:history.back(-1);。

          2. 默認的等待時間都是3秒。

          3. 當不繼承控制器類使用success或error方法時,需要導入跳轉類的命名空間“use traits\controller\Jump”。


          2. 跳轉模板

          1)跳轉模板位置

          success和error方法都可以對應的模板,默認的設置是兩個方法對應的模板都是:

          這是官方給的跳轉模板,可以修改此模板,但一般不做修改。如果需要重新定義跳轉模板,可以自定義。

          2)自定義跳轉模板

          ①配置項

          ②修改配置項

          修改跳轉模板的配置項,設置為項目內的模板。

          注意:

          1. 完整路徑為:

          'dispatch_success_tmpl'=> APP_PATH . 'index' . DS .'view/public/success.html',

          2. 寫完整路徑,可定位到任何位置。

          ③新建success與error模板

          ④瀏覽器訪問

          模板文件可以使用模板標簽,并且可以使用下面的模板變量:


          3. 小版本錯誤

          對于success與error,官方給出了一項注意點:

          error方法會自動判斷當前請求是否屬于Ajax請求,如果屬于Ajax請求則會自動轉換為default_ajax_return配置的格式返回信息。success在Ajax請求下不返回信息,需要開發者自行處理。

          針對以上的注意,我們測試一下是否正確,此時使用的ThinkPHP版本為5.0.12。ThinkPHP版本號在thinkphp/base.php中。

          測試步驟:

          ①在Index控制器中新建testBug方法,主要用來展示html頁面。

          ②新建testbug.html模板,模板中要有ajax。

          模板位置:application/index/view/index/testbug.html

          ③在Index控制器中新建fanHui方法,此方法進行success和error的返回。

          ④瀏覽器訪問testBug方法,點擊“調用”按鈕。

          調整if判斷的年齡,讓其走else的error。

          注意:

          1. 經測試5.0.12版本,ajax請求時,success與error方法均返回信息,返回數據格式與default_ajax_return配置項設定相同。

          2. 官方給出success在ajax請求時不返回信息,是個bug。

          ThinkPHP5連載為卓象程序員原創,轉載請聯系卓象程序員

          關注卓象程序員,定期發布技術文章

          下一篇講解“重定向”

          洞簡述

          盡管ThinkPHP 5.0.x框架采用了參數化查詢方式,來操作數據庫,但是在 insert 和 update 方法中,傳入的參數可控,且無嚴格過濾,最終導致本次SQL注入漏洞發生。

          ThinkPHP基礎知識

          在進行漏洞分析之前,我們需要了解一下ThinkPHP基礎知識,這里僅介紹對本次漏洞分析有幫助的部分。

          ThinkPHP5.0的 目錄結構

          thinkphp 應用部署目錄

          ├─application 應用目錄(可設置)

          │ ├─common 公共模塊目錄(可更改)

          │ ├─index 模塊目錄(可更改)

          │ │ ├─config.php 模塊配置文件

          │ │ ├─common.php 模塊函數文件

          │ │ ├─controller 控制器目錄

          │ │ ├─model 模型目錄

          │ │ ├─view 視圖目錄

          │ │ └─ ... 更多類庫目錄

          │ ├─command.php 命令行工具配置文件

          │ ├─common.php 應用公共(函數)文件

          │ ├─config.php 應用(公共)配置文件

          │ ├─database.php 數據庫配置文件

          │ ├─tags.php 應用行為擴展定義文件

          │ └─route.php 路由配置文件

          ├─extend 擴展類庫目錄(可定義)

          ├─public WEB 部署目錄(對外訪問目錄)

          │ ├─static 靜態資源存放目錄(css,js,image)

          │ ├─index.php 應用入口文件

          │ ├─router.php 快速測試文件

          │ └─.htaccess 用于 apache 的重寫

          ├─runtime 應用的運行時目錄(可寫,可設置)

          ├─vendor 第三方類庫目錄(Composer)

          ├─thinkphp 框架系統目錄

          │ ├─lang 語言包目錄

          │ ├─library 框架核心類庫目錄

          │ │ ├─think Think 類庫包目錄

          │ │ └─traits 系統 Traits 目錄

          │ ├─tpl 系統模板目錄

          │ ├─.htaccess 用于 apache 的重寫

          │ ├─.travis.yml CI 定義文件

          │ ├─base.php 基礎定義文件

          │ ├─composer.json composer 定義文件

          │ ├─console.php 控制臺入口文件

          │ ├─convention.php 慣例配置文件

          │ ├─helper.php 助手函數文件(可選)

          │ ├─LICENSE.txt 授權說明文件

          │ ├─phpunit.xml 單元測試配置文件

          │ ├─README.md README 文件

          │ └─start.php 框架引導文件

          ├─build.php 自動生成定義文件(參考)

          ├─composer.json composer 定義文件

          ├─LICENSE.txt 授權說明文件

          ├─README.md README 文件

          ├─think 命令行入口文件

          我們本次的 payload 為:http://localhost/thinkphp/public/index.php/index/index/index?name[0]=inc&name[1]=updatexml(1,concat(0x7,user(),0x7e),1)&name[2]=1 ,解釋如下:

          http://localhost/thinkphp/ public/ index.php/ index/ index/ index 域名 網站目錄 對外訪問目錄 入口文件 前臺 控制器 方法名
          

          變量獲取

          	$name=input("get.name/a");
          input()為TP框架的助手函數,get.name/a 表示獲取get傳入的name變量,并將其強制轉換為數組類型
          

          數據庫查詢

          	Db::table("users")->where(["id"=>1])->insert(["username"=>$name]);
          TP框架采用的是PDO方式對數據庫進行查詢
          

          環境搭建

          在了解了基本知識后,我們可以開始搭建環境。這里我們使用ThinkPHP 5.0.14版本來進行實驗,下載地址:http://www.thinkphp.cn/download/1107.html

          我們先安裝好phpstudy,然后將下載好的ThinkPHP 5.0.14解壓至phpstudy的網站根目錄下,安裝ThinkPHP 5.0.14需要Mbstring、PDO、Curl三個插件,php版本這里用5.6。

          接著我們需要配置連接數據庫的文件,并開啟thinkphp的調試功能。在此之前,你需要先在數據庫中創建用于測試的數據,例如這里我用thinkphp作為數據庫名,那么就在mysql命令行下執行create database thinkphp; 然后在建立一個users表,列名有id,username,password,執行create table users(id int auto_increment primary key,username varchar(20),password varchar(30)); 即可,最后我們往表中插入測試數據,命令行執行insert into users(id,username,password) values(1,"test","thinkphp"); 這樣就算測試數據創建成功了。

          配置連接數據庫的文件,并開啟thinkphp的調試功能,如下圖:

          最后修改文件 application\index\controller\Index.php 的內容,如下:

          <?php
          namespace app\index\controller;
          use think\Db;
          class Index
          {
           public function index()
           {
           $name=input("get.name/a");
           Db::table("users")->where(["id"=>1])->insert(["username"=>$name]);
           return "ThinkPHP SQL Test.";
           }
          }
          

          修改好后,訪問我們的payload就可以觸發漏洞了

          漏洞分析

          首先,我們知道 insert 方法存在漏洞,那就查看 insert 方法的具體實現。該方法位于 thinkphp\library\think\db\Builder.php 文件中,我們可以看到在函數開頭調用了 parseData 方法,并將 $data 作為參數傳入, $data 的值是我們通過 get方式傳入的一個數組類型的數據,如下圖:

          我們跟進 parseData 方法,該方法也在 thinkphp\library\think\db\Builder.php 文件中。可以看到,在結尾處有個switch語句,而且進入該語句后,會跳到case 'inc'的地方,這里關鍵就是看看 $this->parseKey 是否有對 $val[1] 變量進行過濾了,因為 $val[1] 變量就是我們payload中的updatexml(1,concat(0x7,user(),0x7e),1) ,如下圖:

          繼續跟進 parseKey 方法,會發現直接將傳入的 $key 返回了,沒有進行任何過濾。

          我們再回到最開始的 insert 方法,加上調試語句,看看此時的sql語句變成了什么樣子,如下圖:

          另一處update函數的注入與這個insert是類似的,這里就不在贅述。

          總結

          筆者也是第一次審計Thinkphp框架,在審計這套框架前還找了網絡上的視頻快速入門了下,再結合Thinkphp5.0手冊,完成此次漏洞的審計。當然,文章有不當之處,還希望大家斧正。

          一篇文章講解“模型-事件”,本篇文章講解“模板-變量輸出一”。


          變量輸出

          在模板中輸出變量的方法很簡單。

          1. 變量輸出的基本用法

          ①新建Index控制器,并新建index方法,為模板變量賦值

          ②在index控制器的index模板中輸出變量

          預覽:

          注意:

          1. 注意模板標簽的{和$之間不能有任何的空格,否則標簽無效。

          2. 模板標簽的變量輸出根據變量類型有所區別。


          2. 輸出數組

          字符串輸出時直接使用變量名,當輸出數組時,有兩種方法。

          ①在Index控制器中新建outarr方法

          ②在index.html模板中輸出數組變量

          預覽:

          注意:

          1. 當我們要輸出多維數組的時候,往往要采用第二種方式。


          3. 輸出對象

          ①在Index控制器中新建outobj方法

          ②在index.html模板中輸出對象

          預覽:

          注意:

          1. 也可以直接調用對象的常量或者方法

          常量:{$data::CONST_NAME}

          方法:{$data->fun()}


          使用默認值

          1. 變量輸出使用默認值

          我們可以給變量輸出提供默認值。

          ①在Index控制器中新建outde方法

          ②在index.html模板中輸出

          預覽:


          2. 系統變量使用默認值

          對系統變量依然可以支持默認值輸出。

          Index控制器的outde方法不變,在index.html模板中輸出系統變量。

          預覽:


          3. 默認值和函數同時使用

          ①在公共函數中創建函數

          ②在index.html模板中輸出

          預覽:

          ThinkPHP5連載為卓象程序員原創,轉載請聯系卓象程序員

          關注卓象程序員,定期發布技術文章

          下一篇講解“模板-變量輸出二”


          主站蜘蛛池模板: 99偷拍视频精品一区二区| 日本不卡在线一区二区三区视频| 国产a∨精品一区二区三区不卡| 国产怡春院无码一区二区| 无码国产伦一区二区三区视频| 国产婷婷色一区二区三区深爱网 | 久久人妻无码一区二区| 亚洲AV综合色区无码一区| 日韩制服国产精品一区| 久久99久久无码毛片一区二区| 一区二区网站在线观看| 一区二区三区电影在线观看| 免费高清在线影片一区| 国产乱人伦精品一区二区在线观看 | 精品久久一区二区三区| 国产一区二区在线观看app| 免费无码一区二区| 日本美女一区二区三区| 精品3d动漫视频一区在线观看| 在线观看国产一区亚洲bd| 综合一区自拍亚洲综合图区| 激情久久av一区av二区av三区| 欧美日韩国产免费一区二区三区| 中文字幕在线不卡一区二区| 中文字幕乱码一区久久麻豆樱花 | 日韩视频在线观看一区二区| 狠狠爱无码一区二区三区| 国产精品一区三区| 亚洲色精品aⅴ一区区三区| 精品一区二区在线观看| 日韩精品无码一区二区三区| 国产精品一区二区久久| 无码人妻精品一区二区蜜桃 | 久久国产精品一区免费下载| 蜜桃无码AV一区二区| 日韩一区二区三区四区不卡| 日韩成人一区ftp在线播放| 色一情一乱一伦一区二区三区日本| 日韩精品无码Av一区二区| 亚洲av无码一区二区三区不卡| 91精品国产一区|