在項目中,合理的使用緩存對性能有較大的幫助。ThinkPHP提供了方便的緩存方式,包括數據緩存、靜態緩存和查詢緩存等,支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache在內的動態數據緩存類型,以及可定制的靜態緩存規則,並提供了快捷方法進行存取操作。
這里就講框架自帶的三種緩存方式!
對於白盒來說的話,只要知道Cache的Name的話 那么肯定可以得到相應的文件名,另外一種生成文件名的方式是當沒有指定緩存的名稱的時候,這個時候這個文件名就是根據數據庫的數據來動態進行生成
需要注意的是:這里的換行符為\n,在http請求中可以用%0a來進行表達
在16進制代碼中"0A"是換行,如果只有"0D",那么光標會回到這一行的開始處,只有"0A"、"0D"一起用,才能使光標到下一行的開始處。
第一種:數據緩存
public function test02(){
S('name',"\nphpinfo();//");
}
正則匹配:S\(.*?
第二種:快速緩存
public function test02(){
F('name','\nphpinfo()//'); //第一種快速緩存的方式
F('name','<?php phpinfo();//',TEMP_PATH); //第二種快速緩存的方式,進行指定文件名name.php和指定緩存路徑
}
正則匹配:F\(.*?
第三種:查詢緩存
public function test02(){
M('user')->where('id',1)->cache(60)->select();
}
正則匹配:M\('表名'.*?->cache\(
以上就是三種tp3 緩存的方式了!
自己還需要總結下的就是:
1、一般前兩種如果內容可控的話,那么一般就可以拿到權限
2、第三種的話,可以看到一般是從數據庫中取出然后對其中的內存進行寫入緩存文件,所以可以去找寫入數據庫的內容是否可控,二者聯系
最后還有個就是:類似第三種查詢緩存方式所生成的文件名需要如何知道?
https://www.kancloud.cn/manual/thinkphp/1837 tp3的文檔中有寫到會 根據當前的查詢條件等信息生成一個帶有唯一標識的查詢緩存
import hashlib
a = 'a:4:{s:5:"where";a:1:{s:2:"id";i:1;}s:5:"cache";a:3:{s:3:"key";b:1;s:6:"expire";i:60;s:4:"type";s:0:"";}s:5:"table";s:4:"user";s:5:"model";s:4:"user";}'
b= hashlib.md5(a.encode()).hexdigest()
c= hashlib.md5(b.encode()).hexdigest()