PHP 解析器遇到 // 或 # 後,**忽略後續內容直到行尾或 PHP 標籤結束 ?>**。若在註釋中插入 ?> 結束標籤,後續代碼將脫離 PHP 模式以 HTML 輸出,或遇到 <?php/<?= 重新進入 PHP 模式**繼續執行**。
<?php
// 註釋?><?= 'hello' ?>
// 解析流程:
// 1. // 註釋 → 忽略 "註釋"
// 2. ?> → 結束 PHP 模式
// 3. <?= 'hello' ?> → 重新進入 PHP,執行 echo 'hello'
// 4. 輸出:hello
?>
| Payload | 條件 | 結果 |
|---|---|---|
| 默認 | 輸出 hello | |
| 默認 | 輸出 hello | |
asp_tags=On (PHP 7 移除) | 輸出 hello | |
asp_tags=On | 輸出 hello |
phpinfo、system 等關鍵字,但可通過註釋閉合注入代碼片段。include/require 載入純數據文件(JSON/INI/PHP 返回陣列)。short_open_tag、ASP 標籤(現代 PHP 預設關閉)。?>、<?php、<?= 在字符串/註釋中出現的情況。token_get_all() 詞法分析而非正則匹配註釋。PHP 註釋以 ?> 結束為邊界,**而非換行符**。這一特性構成「註釋繞過」技巧,屬於語言解析器邊界行為。現代框架/模板引擎已徹底隔離代碼與數據,實際業務開發中極少遇到,但在**舊系統遷移、CTF、靜態分析規則編寫**時必須了解。