<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Leo Sheu 的日常筆記</title><link>https://blog.leosheu.com/</link><description>Recent content on Leo Sheu 的日常筆記</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Sun, 13 Nov 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.leosheu.com/index.xml" rel="self" type="application/rss+xml"/><item><title>unit test - 在特定參數條件時回傳造假資料</title><link>https://blog.leosheu.com/p/unit-test-%E5%9C%A8%E7%89%B9%E5%AE%9A%E5%8F%83%E6%95%B8%E6%A2%9D%E4%BB%B6%E6%99%82%E5%9B%9E%E5%82%B3%E9%80%A0%E5%81%87%E8%B3%87%E6%96%99/</link><pubDate>Sun, 13 Nov 2022 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/unit-test-%E5%9C%A8%E7%89%B9%E5%AE%9A%E5%8F%83%E6%95%B8%E6%A2%9D%E4%BB%B6%E6%99%82%E5%9B%9E%E5%82%B3%E9%80%A0%E5%81%87%E8%B3%87%E6%96%99/</guid><description>&lt;h3 id="情境"&gt;情境&#10;&lt;/h3&gt;&lt;p&gt;在寫單元測試時，想判斷輸入物件的其中一個 property 是特定數值才回傳造假資料。&#10;可以限縮造假的範圍來提高正確性。&lt;/p&gt;&#10;&lt;h3 id="使用-nsubstitute-argist-有條件的比對參數"&gt;使用 NSubstitute Arg.Is&amp;lt;T&amp;gt; 有條件的比對參數&#10;&lt;/h3&gt;&lt;p&gt;有個 mail 物件，在寫測試時想造假特定收件人寄送的回傳值。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mail&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Recipient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Subject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AttachFile&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Attachment&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;這時可以使用 &lt;code&gt;Arg.Is&amp;lt;T&amp;gt;(condition)&lt;/code&gt; 裡面帶入指定條件，以下範例是當收件人為 Leo 時才回傳造假的結果 &lt;code&gt;true&lt;/code&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_mailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Arg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Is&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recipient&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Leo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;Returns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;另外想測試是否有特定參數的呼叫 &lt;code&gt;Received&lt;/code&gt; 一次，也可以使用 &lt;code&gt;Arg.Is&lt;/code&gt; 去限縮條件。&#10;此例為驗證是否有收件人是 Leo 的 mail 呼叫 &lt;code&gt;Send()&lt;/code&gt; 方法。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_mailService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Arg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Is&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recipient&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Leo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="reference"&gt;Reference&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;a class="link" href="https://nsubstitute.github.io/help/argument-matchers/" target="_blank" rel="noopener"&#10; &gt;Argument matchers - Conditionally matching an argument&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>如何在 Windows 10 修改 MAC Address</title><link>https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/</link><pubDate>Mon, 19 Sep 2022 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/</guid><description>&lt;ol&gt;&#10;&lt;li&gt;Windows 設定 &amp;gt; 網路和網際網路 &amp;gt; 狀態，點選 &amp;ldquo;變更介面卡選項&amp;rdquo;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="394px" data-flex-grow="164" height="470" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/mac-1.png" width="773"&gt;&lt;/p&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;找到要修改的網路，右鍵 &amp;gt; 內容&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="539px" data-flex-grow="224" height="381" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/mac-2.png" srcset="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/mac-2_hu_d4ff7150e4bcd075.png 800w, https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/mac-2.png 857w" width="857"&gt;&lt;/p&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;點選設定&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="189px" data-flex-grow="78" height="533" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/mac-3.png" width="421"&gt;&lt;/p&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;進階 &amp;gt; 本地管理位置 &amp;gt; 值，修改成指定的 MAC address 即可&#10;&lt;ul&gt;&#10;&lt;li&gt;例如 &lt;code&gt;F8:8C:21:77:FB:CB&lt;/code&gt; 則填入 &lt;code&gt;F88C2177FBCB&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="215px" data-flex-grow="89" height="518" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%9C%A8-windows-10-%E4%BF%AE%E6%94%B9-mac-address/mac-4.png" width="465"&gt;&lt;/p&gt;&#10;&lt;p&gt;最後再利用指令檢查是否修改完成 (實體位址)&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ipconfig&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>如何對 protected method 做 unit test</title><link>https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%B0%8D-protected-method-%E5%81%9A-unit-test/</link><pubDate>Sun, 18 Sep 2022 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%B0%8D-protected-method-%E5%81%9A-unit-test/</guid><description>&lt;h3 id="情境"&gt;情境&#10;&lt;/h3&gt;&lt;p&gt;在寫單元測試時，如果想要針對一個 protected method 做測試時，在測試專案想要存取 method 時會顯示 &lt;code&gt;cannot access protected method 'XXX' here&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1460px" data-flex-grow="608" height="81" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E5%B0%8D-protected-method-%E5%81%9A-unit-test/protected-1.png" width="493"&gt;&lt;/p&gt;&#10;&lt;p&gt;一般情況下最好是由呼叫 &lt;code&gt;Protected&lt;/code&gt; 的 &lt;code&gt;Public&lt;/code&gt; method 去做測試，但如果萬不得已，也有可以對 protected method 進行測試的方法。&lt;/p&gt;&#10;&lt;h3 id="testing-protected-methods"&gt;Testing Protected Methods&#10;&lt;/h3&gt;&lt;p&gt;假設有個 protected method &lt;code&gt;MyMethodName&lt;/code&gt;，我們想要對這個 method 進行單元測試。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OriginalClass&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;MyMethodName&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;any string&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;這時可以在測試專案新增一個 &lt;code&gt;FakeClass&lt;/code&gt; 去繼承 &lt;code&gt;OriginalClass&lt;/code&gt;，並新增一個 method，透過 new 修飾詞隱藏繼承自基底類別的方法，FakeClass 中 method 的實作使用 base 呼叫基底類別原有的方法。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FakeClass&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OriginalClass&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;MyMethodName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MyMethodName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;最後測試時使用 &lt;code&gt;FakeClass&lt;/code&gt; 呼叫 &lt;code&gt;MyMethodName&lt;/code&gt; 進行測試即可。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="reference"&gt;Reference&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;a class="link" href="https://learn.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override-and-new-keywords" target="_blank" rel="noopener"&#10; &gt;了解使用 Override 和 New 關鍵字的時機&lt;/a&gt;&lt;br&gt;&#10;&lt;a class="link" href="https://learn.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/new-modifier" target="_blank" rel="noopener"&#10; &gt;new 修飾詞 (C# 參考)&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>漏洞回報 健檢中心醫療資料存取控制缺陷</title><link>https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/</link><pubDate>Sun, 28 Aug 2022 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/</guid><description>&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="169px" data-flex-grow="70" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-1.png" width="386"&gt;&lt;/p&gt;&#10;&lt;h3 id="敘述"&gt;敘述&#10;&lt;/h3&gt;&lt;p&gt;做完健康檢查後，在網站上登入後查看報告時，發現有個報告書下載的功能。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="385px" data-flex-grow="160" height="585" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-2.png" srcset="https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-2_hu_b1f6e610d0b34be4.png 800w, https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-2.png 939w" width="939"&gt;&lt;/p&gt;&#10;&lt;p&gt;下載完成後是一個PDF檔，這時發現下載網址後有個 &lt;code&gt;bid&lt;/code&gt; 的參數。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="932px" data-flex-grow="388" height="198" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-3.png" width="769"&gt;&lt;/p&gt;&#10;&lt;p&gt;看起來 &lt;code&gt;bid&lt;/code&gt; 的參數是有規律且有序的，此時嘗試修改不同的數值嘗試發起 request，發現可以正常取得 PDF 報告書。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="496px" data-flex-grow="206" height="523" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-4.png" srcset="https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-4_hu_c443db8393ee70d5.png 800w, https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-4.png 1082w" width="1082"&gt;&lt;/p&gt;&#10;&lt;p&gt;此存取控制缺陷的漏洞會造成可以取得他人的健檢報告資料。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="296px" data-flex-grow="123" height="608" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E6%BC%8F%E6%B4%9E%E5%9B%9E%E5%A0%B1-%E5%81%A5%E6%AA%A2%E4%B8%AD%E5%BF%83%E9%86%AB%E7%99%82%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6%E7%BC%BA%E9%99%B7/mornjoy-5.png" width="751"&gt;&lt;/p&gt;&#10;&lt;h3 id="相關網址"&gt;相關網址&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://medirep.mornjoy.com.tw/Login/Index&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://medirep.mornjoy.com.tw/siteadmin/Print?bid=_{Id}_&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="時間軸"&gt;時間軸&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;2022/05/30 - 提交漏洞&lt;br&gt;&#10;2022/06/02 - 通報未回應 (由 HITCON ZeroDay 服務團隊)&lt;br&gt;&#10;2022/06/07 - 複測已修復 (by Leo)&lt;br&gt;&#10;2022/07/30 - 公開&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;回報於 &lt;a class="link" href="https://zeroday.hitcon.org/vulnerability/ZD-2022-00376" target="_blank" rel="noopener"&#10; &gt;HITCON ZeroDay：晨悅預防醫學機構 醫療資料存取漏洞&lt;/a&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="reference"&gt;Reference&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;a class="link" href="https://portswigger.net/web-security/access-control" target="_blank" rel="noopener"&#10; &gt;Access control vulnerabilities and privilege escalation | Web Security Academy&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>所有的 Class 都要加 Interface 嗎?</title><link>https://blog.leosheu.com/p/why-add-interface/</link><pubDate>Sun, 07 Aug 2022 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/why-add-interface/</guid><description>&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ITextSummarizer&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;summarizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TextSummarizer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ITextSummarizer&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;summarizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//do something&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;summarize text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;雖然 TextSummarizer 只有一個實作，就算之後不會有另一個實作，加上 interface 也有其他好處。&lt;/p&gt;&#10;&lt;h3 id="定義-interface-的優點"&gt;定義 interface 的優點：&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;可以使測試更容易 - 如果要在測試期間使用 mock 或 fake 假的實作，會需要定義一個介面來執行此操作。&lt;/li&gt;&#10;&lt;li&gt;讓公用 API 更清晰 - 使用端應該或不應該使用哪些功能不會產生混淆。&lt;/li&gt;&#10;&lt;li&gt;有可能猜錯只需要一個實作 - 最初寫程式時可能確定真的不需要第二個實作，但經過一兩個月後，這個假設可能被證明是錯誤的。&lt;/li&gt;&#10;&lt;li&gt;同一類別可以解決兩個子問題 - 有時某個類別可以為兩個或多個不同的抽象層提供實作。例如 LinkedList 實作類別可以實作 List 和 Queue 介面。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="定義-interface-的缺點"&gt;定義 interface 的缺點：&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;需要付出更多努力 - 如果沒有 IDE 的幫忙，可能要手動多寫幾行程式碼。&#10;-&amp;gt; &lt;a class="link" href="https://www.jetbrains.com/help/rider/Refactorings__Extract_Interface.html" target="_blank" rel="noopener"&#10; &gt;使用 Rider 自動產生 Interface&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="reference"&gt;Reference&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;a class="link" href="https://www.tenlong.com.tw/products/9786263242128" target="_blank" rel="noopener"&#10; &gt;Good Code, Bad Code｜寫出高品質的程式碼&lt;/a&gt; PART 1 理論篇 - 第2章 抽象層&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>Hugo start</title><link>https://blog.leosheu.com/p/hugo-start/</link><pubDate>Sun, 31 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/hugo-start/</guid><description>&lt;img src="https://blog.leosheu.com/p/hugo-start/hugo-logo.svg" alt="Featured image of post Hugo start" /&gt;&lt;p&gt;[Windows]&#10;透過 &lt;a class="link" href="https://scoop.sh/" target="_blank" rel="noopener"&#10; &gt;Scoop&lt;/a&gt; 安裝：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;scoop&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;hugo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Hugo start： &lt;a class="link" href="https://gohugo.io/getting-started/quick-start" target="_blank" rel="noopener"&#10; &gt;https://gohugo.io/getting-started/quick-start/&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Theme： &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener"&#10; &gt;https://github.com/CaiJimmy/hugo-theme-stack&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Run server (include content marked as draft)&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;-D&lt;/span&gt; &lt;span class="n"&gt;-p&lt;/span&gt; &lt;span class="mf"&gt;8888&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>使用 Autofac KeyFilter Attribute 在相同介面注入不同實體</title><link>https://blog.leosheu.com/p/autofac-keyfilter-attribute/</link><pubDate>Fri, 22 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/autofac-keyfilter-attribute/</guid><description>&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IAlertService&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;SendAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SlackAlertService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IAlertService&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;SendAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TelegramAlertService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IAlertService&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;SendAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;假如有個 TestAlertService 需要同時使用到 SlackAlertService 和 TelegramAlertService ，在使用 autofac 注入時因為兩個 service 都使用相同的介面，這個時候可以透過加上 KeyFilter attribute 的方式來指定所需要的實體。&lt;/p&gt;&#10;&lt;p&gt;KeyFilter 的使用方式：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestAlertService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IAlertService&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;TestAlertService&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;KeyFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;IAlertService&lt;/span&gt; &lt;span class="n"&gt;slackAlert&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;KeyFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;telegram&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;IAlertService&lt;/span&gt; &lt;span class="n"&gt;slackAlert&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;在註冊時需要透過設定好的 key 去指定相對應的實作，以及設定哪個類別要使用 attribute filter：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisterType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SlackAlertService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;().&lt;/span&gt;&lt;span class="n"&gt;Keyed&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IAlertService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisterType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TelegramAlertService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;().&lt;/span&gt;&lt;span class="n"&gt;Keyed&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IAlertService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;telegram&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisterType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TestAlertService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;().&lt;/span&gt;&lt;span class="n"&gt;As&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IAlertService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;().&lt;/span&gt;&lt;span class="n"&gt;WithAttributeFiltering&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;hr&gt;&#10;&lt;p&gt;參考資料：&lt;a class="link" href="https://autofac.readthedocs.io/en/latest/advanced/keyed-services.html?highlight=named#resolving-with-attributes" target="_blank" rel="noopener"&#10; &gt;[Autofac] resolving with attributes&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>如何查詢 w3wp.exe 對應的 IIS Application Pool</title><link>https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E6%9F%A5%E8%A9%A2-w3wp.exe-%E5%B0%8D%E6%87%89%E7%9A%84-iis-application-pool/</link><pubDate>Thu, 02 Sep 2021 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E6%9F%A5%E8%A9%A2-w3wp.exe-%E5%B0%8D%E6%87%89%E7%9A%84-iis-application-pool/</guid><description>&lt;p&gt;on Windows 2012 (IIS 8)&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;選擇想要檢視的 IIS Worker Process&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="378px" data-flex-grow="157" height="412" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E6%9F%A5%E8%A9%A2-w3wp.exe-%E5%B0%8D%E6%87%89%E7%9A%84-iis-application-pool/w3wp-1.png" width="650"&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;切到 detail 查看該 process 的 PID&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="436px" data-flex-grow="182" height="357" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E6%9F%A5%E8%A9%A2-w3wp.exe-%E5%B0%8D%E6%87%89%E7%9A%84-iis-application-pool/w3wp-2.png" width="650"&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;切換到 C:\Windows\System32\inetsrv ，執行 &lt;code&gt;.\appcmd.exe list wp&lt;/code&gt; 找到對應的 PID&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="473px" data-flex-grow="197" height="343" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%A6%82%E4%BD%95%E6%9F%A5%E8%A9%A2-w3wp.exe-%E5%B0%8D%E6%87%89%E7%9A%84-iis-application-pool/w3wp-3.png" width="677"&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item><item><title>台灣網路資訊中心 域名管理關鍵 Key 共用漏洞</title><link>https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/</link><pubDate>Wed, 10 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/</guid><description>&lt;p&gt;某天逛 Facebook 突然發現有個「中文化電子郵件信箱體驗活動」，只要動動手指就可以體驗看起來很狂的中文信箱地址，而且還附贈該中文網域名稱一年，就趕緊就來申請囉。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="478px" data-flex-grow="199" height="642" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-1.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-1_hu_a3535906306e7427.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-1.png 1280w" width="1280"&gt;&lt;/p&gt;&#10;&lt;p&gt;在經過很多步驟和教學後，終於拿到了成功獲得域名通知信，信中給了個連結可以設定管理網域的判別密碼。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="495px" data-flex-grow="206" height="401" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-2.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-2_hu_ffe5f8773db71b9.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-2.png 828w" width="828"&gt;&lt;/p&gt;&#10;&lt;p&gt;可以看到設定判別密碼的網址帶了兩個參數 key 及 dn，key 是一串亂碼，而 dn 則是個人中文網域名稱 (灰色方塊部分)。&lt;/p&gt;&#10;&lt;p&gt;-&amp;gt;透過此網址可重複修改密碼&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="388px" data-flex-grow="161" height="567" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-3.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-3_hu_13e3886738b6195d.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-3.png 917w" width="917"&gt;&lt;/p&gt;&#10;&lt;p&gt;接著就收到一封邀請好友的信件，點擊信中連結輸入好友 Gmail 信箱，成功推廣可以有抽獎點數。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="625px" data-flex-grow="260" height="491" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-4.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-4_hu_2f04c5bfa88dc3ba.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-4.png 1280w" width="1280"&gt;&lt;/p&gt;&#10;&lt;p&gt;但點進去推廣頁面，看了網址所帶的參數覺得怎麼有種似曾相識的感覺？&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="374px" data-flex-grow="155" height="630" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-5.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-5_hu_5073526083d47c2c.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-5.png 982w" width="982"&gt;&lt;/p&gt;&#10;&lt;p&gt;推廣頁面和設定密碼的頁面所使用的 key 竟然是同一把！&lt;/p&gt;&#10;&lt;p&gt;如果任何人知道你的中文網域名稱及邀請頁面連結，代入 &lt;code&gt;KEY&lt;/code&gt; 及 &lt;code&gt;網域名稱&lt;/code&gt; 到設定密碼頁面，即可修改他人的判別密碼。&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://rs.twnic.net.tw/cgi-bin/eai/chgpass.cgi?key=" target="_blank" rel="noopener"&#10; &gt;https://rs.twnic.net.tw/cgi-bin/eai/chgpass.cgi?key=&lt;/a&gt; {KEY} &amp;amp;dn= {網域名稱}.台灣&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="468px" data-flex-grow="195" height="656" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-6.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-6_hu_f6b9dffba91e1499.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-6.png 1280w" width="1280"&gt;&lt;/p&gt;&#10;&lt;p&gt;用修改後的密碼登入就可以取得原域名擁有者的所有權限，可以更改 DNS 設定、查看或修改個人資料等等。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="687px" data-flex-grow="286" height="261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-7.png" width="748"&gt;&lt;/p&gt;&#10;&lt;p&gt;如果你公布了你的網域名稱，順便附上信中的推廣連結，等於是告訴人：來吧，可以幫我改密碼喔。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="624px" data-flex-grow="260" height="346" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-8.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-8_hu_7335f5d4b4ab3396.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-8.png 900w" width="900"&gt;&lt;/p&gt;&#10;&lt;p&gt;為了避免關鍵 key 外流，我推廣好友自己打 Gmail 信箱總安全了吧，這樣想就大錯特錯了！&lt;/p&gt;&#10;&lt;p&gt;就算自己打信箱推廣，被推廣好友所收到確認信所含連結也有那把可以重設密碼的 key (右下黃色區塊)。總之，如果要推廣好友，絕對不能把我的網域名稱告訴他人，不然他就能幫忙改密碼並接管自己的個人網域了。&lt;/p&gt;&#10;&lt;p&gt;-&amp;gt;同一人所發出邀請 key 皆相同，參數 rec 不同被推廣者皆不相同。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="536px" data-flex-grow="223" height="423" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-9.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-9_hu_8e863b365ebef45c.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-9.png 946w" width="946"&gt;&lt;/p&gt;&#10;&lt;p&gt;之後把情況詳情回報給台灣網路資訊中心，當天幾小時後重設密碼的頁面就自動跳轉到 &lt;a class="link" href="https://rs.twnic.net.tw/cgi-bin/eai/chgpass.cgi" target="_blank" rel="noopener"&#10; &gt;https://rs.twnic.net.tw/cgi-bin/eai/chgpass.cgi&lt;/a&gt; 乾淨的網址，改成用 Form Data 的形式送出 key &amp;amp; dn，暫時先改變資料送出的形式，把漏洞變得比較不明顯。&lt;/p&gt;&#10;&lt;p&gt;幸好隔天重設密碼的流程就換了，改成只回傳一個&amp;lt;script&amp;gt; alert，提示至信箱確認變更密碼連結，他人就不再能簡單取得個人網域權限了，當天的修改貌似只是不想讓更多人能一眼就發現並使用這個漏洞。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="922px" data-flex-grow="384" height="216" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-10.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-10_hu_3611f8eceeb5c1e6.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-10.png 830w" width="830"&gt;&lt;/p&gt;&#10;&lt;p&gt;設定密碼的頁面所使用的 key (灰色部分) 終於不是那組連推廣都共用的那把了。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="392px" data-flex-grow="163" height="606" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-11.png" srcset="https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-11_hu_644d2e05348faec.png 800w, https://blog.leosheu.com/p/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E/twnic-11.png 991w" width="991"&gt;&lt;/p&gt;&#10;&lt;p&gt;查了一下此活動開始也有一段時間了，不過看起來還沒有人發現。為了避免更多資料外洩，當天即送出了問題回報，他們也非常快速的解決了問題，在隔天即修復完成。除了讓人佩服工程師的努力外，正面面對漏洞修補的態度也值得讚賞。&lt;/p&gt;&#10;&lt;p&gt;這個問題的根本原因就是重設密碼所用的 token 也被其他服務所使用，而該推廣中文域名活動的服務剛好會讓 token 流出給第三者，而讓外人可以輕易取得域名管理權限。&lt;/p&gt;&#10;&lt;p&gt;其實只要多留意並不難發現這個漏洞，但它還是存在了幾個禮拜的時間，這也說明了網路上並不是沒有漏洞，而是缺少發現。身為使用者可以多仔細觀察，協助政府或企業發現問題。而開發者則要注意並不是使用亂數當 token 就安全，也要注意在設定密碼這種比較敏感的服務和其他一般服務所使用的 token 必須要有所區隔。&lt;/p&gt;&#10;&lt;p&gt;時間軸：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;2017/3/30：漏洞詳情回報給財團法人台灣網路資訊中心&#10;2017/3/31：修復了此漏洞&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;本文同步刊載於 &lt;a class="link" href="https://kb.hitcon.org/post/159329007522/%E5%8F%B0%E7%81%A3%E7%B6%B2%E8%B7%AF%E8%B3%87%E8%A8%8A%E4%B8%AD%E5%BF%83%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86%E9%97%9C%E9%8D%B5-key-%E5%85%B1%E7%94%A8%E6%BC%8F%E6%B4%9E" target="_blank" rel="noopener"&#10; &gt;HITCON Knowledge Base&lt;/a&gt; in 2017.04&lt;/p&gt;&#10;</description></item></channel></rss>