2025年6月26日 星期四

[研究]無法啟動Microsoft Outlook。無法開啟.Outlook 視窗。

[研究]無法啟動Microsoft Outlook。無法開啟.Outlook 視窗。無法開啟資料夾組。曾試登人 Microsoft Exchange 失敗 。

2025-06-25

平時正常的 Outlook 2019 (Windows 11上),突然出現下面訊息,Windows Reboot 也仍異常。

另外一台電腦Outlook連相同的 Exchange Server、用相同的帳號、密碼,正常使用。



無法啟動Microsoft Outlook。無法開啟.Outlook 視窗。無法開啟資料夾組。曾試登人 Microsoft Exchange 失敗 。

********************************************************************************


ChatGPT 說:


這種情況是 Outlook 常見的啟動故障,原因通常集中在設定檔損毀、本機快取資料(OST)異常或Outlook 啟動參數問題。以下是具體的排除步驟:


【步驟 1】嘗試使用 Outlook 安全模式

防止加載外掛程式干擾:Outlook.exe /safe

若可正常開啟,代表有外掛或設定干擾,可考慮停用第三方外掛程式再重啟。


註:cd   C:\Program Files\Microsoft Office\root\Office 16\  

執行 Outlook.exe  /safe,問題依舊。


【步驟 2】刪除本機 OST 快取檔

本機 OST 損毀也會導致 Exchange 登入失敗:


位置:%LOCALAPPDATA%\Microsoft\Outlook

關閉 Outlook,刪除對應帳號的 .ost 檔案,重新開啟 Outlook 會自動重建 .ost 快取檔。


註:把 C:\Users\帳號\AppData\Local\Microsoft\Outlook 目錄中所有 .tmp 刪除,啟動 Outlook,問題

依舊。

註:把 C:\Users\帳號\AppData\Local\Microsoft\Outlook 目錄中所有 .ost 搬移到別處,啟動 Outlook,問題依舊,因為也沒重建新 .ost 檔案,所以再把 .ost 搬回來。


【步驟 3】重建 Outlook 設定檔

設定檔有可能損毀,請重建:

  1. 進入 控制台 → 郵件(Mail)。
  2. 點選 顯示設定檔(Show Profiles)。
  3. 建立新設定檔,並設定 Exchange 帳號。





註:後來刪除舊的設定檔,重建新的設定檔,啟動 Outlook 後正常。因為設定檔案刪除又新增,所以自動產生新的 .ost,自動重新重新下載所有郵件,舊的 .ost 就可以自己手動刪除了。

註:其實 ChatGPT 建議的步驟2是【建立新設定檔】,步驟3才是【刪除 OST 重建】,敝人實測試順序不同。

【步驟 4】確認網路與 Exchange 連線狀態

  • 雖然其他電腦正常,但還是建議檢查:
  • Windows 網路 Proxy 或 DNS 設定
  • Outlook 狀態列是否顯示:正在連接.../需要密碼
  • 測試:ping Exchange 伺服器名稱
  • 使用 Ctrl + 右鍵點選 Outlook 圖示 → 連線狀態 檢查連線細節。

註:步驟3已經解決問題,步驟4和5就用不到了。


【步驟 5】Outlook 修復

若上述都不行,嘗試執行修復:

  1. 進入 控制台 → 程式和功能。
  2. 找到 Microsoft Office,選擇 變更 → 線上修復。


【其他補充】

若有以下情況也可能造成類似錯誤:

  • Windows 更新或 Office 更新未完整套用
  • 檔案權限異常
  • Exchange 密碼變更但憑證記錄未更新


【建議流程總結】

  1. ✅ 先試 Safe Mode →
  2. ✅ 建立新設定檔 →
  3. ✅ 刪除 OST 重建 →
  4. ✅ 檢查網路與 Exchange 狀態 →
  5. ✅ 最後考慮 Office 修復


(完)





2025年6月25日 星期三

[研究]黑箱 Web弱點掃描報告【不安全的第三方鏈結 (target="_blank")】弱點(一)

[研究]黑箱 Web弱點掃描報告【不安全的第三方鏈結 (target="_blank")】弱點(一)

2025-06-25

HCL AppScan 10.8報告

不安全的第三方鏈結 (target="_blank")

嚴重性: 中

CVSS 評分: 5.3

CVSS 向量: AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N/E:X/RL:X/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MPR:X/MUI:X/MS:X/MC:X/MI:X/MA:X

風險: 有可能說服無經驗而易受騙的使用者提供機密性資訊,如:使用者名稱、密碼、信用卡號碼、社會保險號碼等等

原因: 以 target=_blank 鏈結所鏈結到的頁面可以透過 window.opener 物件部分存取鏈結頁面視窗物件

修正: 將屬性 rel = "noopener noreferrer"  新增至 target="_blank" 的每一個鏈結元素

請問 rel = "noopener noreferrer" 的意義 ? 為何可以解決 "不安全的第三方鏈結 (target="_blank")" 問題 ?

********************************************************************************

ChatGPT 說:

一、rel="noopener noreferrer" 的意義

1.noopener:
  • 禁止新開的分頁透過 window.opener 存取開啟它的原始頁面(即父頁面)的 window 物件。
  • 防止 Reverse Tabnabbing 攻擊。
2.noreferrer

  • 禁止瀏覽器在點擊鏈結時,將 HTTP Referer 標頭傳送給目標網站,避免洩漏來源頁面的網址資訊。
  • 同時也隱含 noopener 效果(現代瀏覽器中)。

二、target="_blank" 的安全問題來源

  • target="_blank" 會在新分頁或新視窗打開鏈結。
  • 如果沒有搭配 rel="noopener":
    • 新開的頁面可以透過 window.opener 取得原本頁面的控制權。
    • 惡意站點可能透過 window.opener.location = 'http://phishing-site.com' 導致原頁面跳轉到釣魚或惡意網站。
    • 攻擊方式稱為 Reverse Tabnabbing。

三、為何 rel="noopener noreferrer" 可以解決?

  • noopener 讓新頁面無法透過 window.opener 操控原頁面,避免原頁面被重定向或注入惡意腳本。
  • noreferrer 進一步防止來源資訊洩漏,增加隱私性。

四、實際範例

不安全寫法:

<a href="https://example.com" target="_blank">外部連結</a>

安全寫法:

<a href="https://example.com" target="_blank" rel="noopener noreferrer">外部連結</a>

五、補充說明

  • 現代瀏覽器多已預設部分阻擋 window.opener,但為相容舊版瀏覽器或確保萬無一失,仍建議主動加入 rel="noopener noreferrer"。
  • 若只是連結到本站內部頁面,此問題較低,但對外部(不受信任)鏈結,強烈建議加上。

六、結論

rel="noopener noreferrer" 是解決 target="_blank" 安全隱患的標準做法,能有效防範:

  • ✔ 釣魚攻擊
  • ✔ 反向分頁劫持(Reverse Tabnabbing)
  • ✔ 敏感資訊洩漏(Referer)

實務建議:

只要有 target="_blank",一律搭配 rel="noopener noreferrer",尤其是鏈結到外部網站。


(完)

[研究]Domsignal 網站 HSTS (HTTP Strict Transport Security) 測試

[研究]Domsignal 網站 HSTS (HTTP Strict Transport Security) 測試

2025-06-24

Domsignal 網站 HSTS (HTTP Strict Transport Security) 測試

https://domsignal.com/hsts-test

拿 HitNet 網站測試

Gmail 測試


(完)

2025年6月24日 星期二

[研究]ASP.NET, WebForm, MasterPage, 跨站請求偽造 XSRF/CSRF(Cross-Site Request Forgery)防護

[研究]ASP.NET, WebForm, MasterPage, 跨站請求偽造 XSRF/CSRF(Cross-Site Request Forgery)防護

2025-06-24

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

Site1.master
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" 
    Inherits="WebApplication1.Site1" %>

<!DOCTYPE html>

<html>
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
        <asp:HiddenField ID="AntiCsrfToken" runat="server" />
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
    </form>
</body>
</html>


Site1.master.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Site1 : System.Web.UI.MasterPage
    {
        private const string AntiXsrfTokenKey = "__AntiXsrfToken";
        private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
        private string _antiXsrfTokenValue;

        protected void Page_Init(object sender, EventArgs e)
        {
            // The code below helps to protect against XSRF attacks
            var requestCookie = Request.Cookies[AntiXsrfTokenKey];

            if (requestCookie != null && Guid.TryParse(requestCookie.Value, out Guid requestCookieGuidValue))
            {
                // Use the Anti-XSRF token from the cookie
                _antiXsrfTokenValue = requestCookie.Value;
                Page.ViewStateUserKey = _antiXsrfTokenValue;
            }
            else
            {
                // Generate a new Anti-XSRF token and save to the cookie
                _antiXsrfTokenValue = Guid.NewGuid().ToString("N");
                Page.ViewStateUserKey = _antiXsrfTokenValue;

                var responseCookie = new HttpCookie(AntiXsrfTokenKey)
                {
                    HttpOnly = true,
                    Value = _antiXsrfTokenValue
                };
                if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
                {
                    responseCookie.Secure = true;
                }
                Response.Cookies.Set(responseCookie);
            }

            Page.PreLoad += master_Page_PreLoad;
        }
        protected void master_Page_PreLoad(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // Set Anti-XSRF token
                ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
                ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? string.Empty;
            }
            else
            {
                // Validate the Anti-XSRF token
                if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue 
                    || (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? string.Empty))
                {
                    throw new InvalidOperationException("Validation of Anti-XSRF token failed.");
                }
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
}


Default.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</asp:Content>


Default.aspx.cs

using System;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("XSRF (CSRF) 測試範例!");
        }
    }
}

用 OWASP Zed Attack Proxy (ZAP) 2.16.1 (2025-03-26 釋出) 測試

(完)

相關

[研究]ASP.NET, WebForm, 跨站請求偽造 XSRF/CSRF(Cross-Site Request Forgery)防護

[研究]ASP.NET, WebForm, 跨站請求偽造 XSRF/CSRF(Cross-Site Request Forgery)防護

2025-06-24

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
    Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </form>
</body>
</html>


Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("XSRF (CSRF) 測試範例!");
        }
    }
}

用 OWASP Zed Attack Proxy (ZAP) 2.16.1 (2025-03-26 釋出) 測試

********************************************************************************

修改後 Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        private string AntiXsrfTokenKey = "__AntiXsrfToken";
        private string AntiXsrfTokenValue;

        protected void Page_Init(object sender, EventArgs e)
        {
            // 取得或產生 Anti-XSRF Token
            AntiXsrfTokenValue = (string)ViewState[AntiXsrfTokenKey];
            if (string.IsNullOrEmpty(AntiXsrfTokenValue))
            {
                AntiXsrfTokenValue = Guid.NewGuid().ToString("N");
                ViewState[AntiXsrfTokenKey] = AntiXsrfTokenValue;
            }

            // 綁定驗證事件
            Page.PreLoad += Page_PreLoad;
        }

        protected void Page_PreLoad(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // 首次載入,將 Token 存入 ViewState
                ViewState[AntiXsrfTokenKey] = AntiXsrfTokenValue;
            }
            else
            {
                // PostBack 時比對 Token
                if ((string)ViewState[AntiXsrfTokenKey] != AntiXsrfTokenValue)
                {
                    throw new InvalidOperationException("Anti-XSRF 檢查失敗。");
                }
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("XSRF (CSRF) 測試範例!");
        }
    }
}

再次測試



********************************************************************************

ZAP 為何仍出現 XSRF 警告?

因為 ZAP 看到:

<form method="post" action="./" id="form1">

代表:

  • 表單缺少 隱藏欄位 Token (Anti-CSRF Token)。
  • 僅靠 ViewStateUserKey,ZAP 檢查不到,因為它藏在 __VIEWSTATE,無明顯 Token 存在。

所以:

  • ✅ ViewStateUserKey 減少風險,但不是主動、可見的 CSRF 防護。
  • ❌ 缺少獨立、隱藏欄位 Token,ZAP 視為未防護。

********************************************************************************

再再次修改

Default.aspx


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
    Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:HiddenField ID="AntiCsrfToken" runat="server" />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </form>
</body>
</html>

 Default.aspx.cs

using System;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        private const string AntiCsrfKey = "AntiCsrfTokenKey";

        protected void Page_Init(object sender, EventArgs e)
        {
            // ViewStateUserKey 強化 ViewState 防偽造
            if (Context.User.Identity.IsAuthenticated)
            {
                ViewStateUserKey = Session.SessionID;
            }
            else
            {
                ViewStateUserKey = Guid.NewGuid().ToString();
            }

            // 產生 Anti-CSRF Token
            if (Session[AntiCsrfKey] == null)
            {
                Session[AntiCsrfKey] = Guid.NewGuid().ToString("N");
            }

            AntiCsrfToken.Value = Session[AntiCsrfKey].ToString();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                // 驗證 Anti-CSRF Token
                if (AntiCsrfToken.Value != (string)Session[AntiCsrfKey])
                {
                    throw new InvalidOperationException("Anti-CSRF Token 驗證失敗,請重新整理頁面。");
                }
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("XSRF (CSRF) 測試範例!");
        }
    }
}

再再次測試,防住 XSRF / CSRF 了。

********************************************************************************

(完)

相關

2025年6月23日 星期一

[研究]SecurityHeaders.com (Snyk 免費線上網站 HTTP 標頭檢查) 試用

[研究]SecurityHeaders.com (Snyk 免費線上網站 HTTP 標頭檢查) 試用

2025-06-23

網址
https://securityheaders.com/

下圖,數發部網站測試結果


Google 測試結果

下圖,Microsoft 網站測試結果

下圖,NICS網站測試結果

測試了好幾個,都是

Sorry about that...

The target site took too long to respond and the connection timed out. Try again later.


********************************************************************************

測試好幾個,都是

Sorry about that...

The target site took too long to respond and the connection timed out. Try again later.

ChatGPT 說:

1.目標網站伺服器速度慢

測試時,SecurityHeaders 會遠端請求目標網址,若該網站回應時間過長(通常超過 5 秒),系統即視為逾時。

2.網站啟用防火牆或限制海外請求

很多企業網站設有地理封鎖、Cloudflare、WAF 等防護,導致來自 SecurityHeaders 的掃描請求被阻擋。

3.網站設定未允許 HEAD 請求或特殊端口

SecurityHeaders 主要透過 HTTP HEAD 或 GET 請求檢測,若網站僅允許特定請求類型或使用非標準端口,則會導致逾時。

4.SecurityHeaders 伺服器當前繁忙或故障

該平台屬免費公開服務,高峰期可能因為大量掃描請求,導致系統資源緊張。


(完)





2025年6月13日 星期五

[研究]HTTP/2中間設備支援疑問

[研究]HTTP/2中間設備支援疑問

2025-06-13

確認  Web Server  支援也啟用了 HTTP/2,那瀏覽器從 Internet 連到 Web Server 經過的 Router, Switch Hub, Load Balancer, Mail SPAM, WAF, ... 等設備是否都要支援 HTTP/2 才能使用 HTTP/2 連線 ?

ChatGPT 說:

不需要所有設備都支援 HTTP/2,才能從瀏覽器成功建立 HTTP/2 連線到 Web Server。實際上,只要中間設備不會干擾或破壞 HTTP/2 的協定特性,即使它們本身不具備 HTTP/2 的特性,也仍然可以讓 HTTP/2 正常運作。

以下是詳細說明:

✅ 需支援 HTTP/2 的條件:

  • Client(瀏覽器):必須支援 HTTP/2,目前主流瀏覽器(Chrome、Edge、Firefox、Safari)都支援。
  • Web Server(含 HTTPS):必須啟用 HTTP/2。多數情況下 HTTP/2 需要搭配 TLS(HTTPS)才能在瀏覽器中啟用。

❗ 中間設備(Router, Switch, Load Balancer, WAF, Mail SPAM...)需考慮的點:

設備類型是否需支援 HTTP/2說明
Router / Switch / 普通 Hub❌ 不需支援屬於 L2/L3 層,只要不進行 L7 應用層封包解析,就不會影響 HTTP/2 傳輸。
Load Balancer(負載平衡器)⚠️ 視模式而定- 若是 L4 負載平衡(例如 TCP 層轉送),不需理解 HTTP/2,無須支援。
- 若是 L7 負載平衡(例如根據 URI 轉導),必須能正確處理 HTTP/2 封包。
WAF(Web Application Firewall)⚠️ 視支援度而定- 若 WAF 不支援 HTTP/2,會降級或拒絕連線。
- 若支援,則能正常轉發 HTTP/2。
Spam/Mail Gateway❌ 不相關它處理的是電子郵件(SMTP),和 HTTP/2 沒有關聯。
TLS Termination Proxy(終止 TLS 的設備)✅ 必須支援因為 HTTP/2 通常跑在 TLS 上,如果 TLS 終止設備無法理解 HTTP/2,就只能降級為 HTTP/1.1。


✅ 總結結論:

  • 只有處理到 L7 應用層、TLS Termination、或 做協定解包分析的設備(例如 WAF、L7 Load Balancer)需要支援或容忍 HTTP/2。
  • 只做封包轉發或路由的設備(Router/Switch)不需要支援 HTTP/2,只要它們不阻擋或修改封包即可。
  • 若任何中間設備(例如老舊 WAF)阻擋、修改、降級 HTTP/2 連線,瀏覽器會自動降級為 HTTP/1.1。

(完)


[研究][小畫家]無法讀取這個檔案。這不是正確的點体圖權案,或是已不再支援這種格式。

[研究][小畫家]無法讀取這個檔案。這不是正確的點体圖權案,或是已不再支援這種格式

2025-06-13

小畫家

xxxxxxxxjpeg

[小畫家]無法讀取這個檔案。這不是正確的點体圖權案,或是已不再支援這種格式。


********************************************************************************

【研究】


用 Image Analyzer 軟體是可以開啟的


FastStone Image Viewer 7.9 也是可以看到的。

.jpeg檔案大小 18.6 MB (19,537,904 位元組),存成 .png 是 60.5 MB (63,507,615 位元組)。

用小畫家開啟該.png 檔案,結果錯誤訊息依舊。

********************************************************************************

小畫家開啟 某 .jpeg 或該 .jpeg 另存成的 .png 檔案都出出現

[小畫家]無法讀取這個檔案。 

這不是正確的點体圖權案,或是已不再支援這種格式。

Image Analyzer 軟體開啟顯示圖片 10039* 17717 解析度

FastStone Image Viewer 7.9 也是可以看到的。

請問小畫家為何無法開啟 ?

.jpeg檔案大小 18.6 MB (19,537,904 位元組),存成 .png 是 60.5 MB (63,507,615 位元組)。

ChatGPT 說:

你提到的問題:「小畫家(Microsoft Paint)無法開啟該 .jpeg 或 .png 圖檔,出現錯誤訊息:這不是正確的點陣圖檔案,或是已不再支援這種格式」,其實很可能與 圖片的解析度與記憶體需求過高 有關。

🧠 解析度過高、記憶體需求過高

對於某些系統或版本的小畫家(特別是 Windows 10 或早期的版本),會有內建的解析度限制。

一張 10039 x 17717 的影像,即使是未壓縮的 24-bit RGB Bitmap:

10039 x 17717 x 3 bytes ≈ 508 MB RAM(僅圖片像素資料)

加上緩衝、UI、編輯暫存等等,很容易超過 1 GB 記憶體需求。小畫家無法處理這麼大的工作集。

🧠小畫家對檔案格式支援有限

即使是標準 JPEG/PNG,小畫家也可能無法處理某些「非典型編碼」或嵌入有特殊 EXIF/ICC profile 的圖片(雖然這點比較少見)。

✅ 建議的解法

💡 解法 1:使用更強的圖像處理軟體

  •  ImageGlass
  •  IrfanView
  •  GIMP(跨平台、免費,類 Photoshop)
  •  Paint.NET
  •  Photoshop

💡 解法 2:將圖片縮小後再用小畫家開啟

💡 解法 3:轉存為 8-bit 色彩模式(降低記憶體需求)

********************************************************************************

小畫家最大能開啟的 .jpg 或 .png 解析度大小 ? 檔案大小 ? 或其他限制 ?

ChatGPT 說:

小畫家(Microsoft Paint)並沒有官方明文公布「最大支援的解析度或檔案大小」,但依據實務觀察與多方測試,可歸納出以下限制與行為模式:

🎯 小畫家的實際限制(非官方)

項目實務限制值(約略)說明
最大圖片解析度約 32,767 × 32,767 像素(理論上限)
實際穩定約在 10,000 x 10,000 像素以下
Windows GDI+ API 的點陣圖尺寸上限是 32,767 px,但小畫家不穩定;過高會無法開啟或當機。
圖片總像素數(寬×高)約 100–120 百萬像素 以下比較穩定超過 150MP 常導致「無法讀取此圖檔」錯誤。
檔案大小約 20–25 MB 以下較穩定即使檔案小,但像素太大仍會失敗;反之亦然。PNG 壓縮不影響讀取時的實體像素需求。
記憶體用量限制約可支援圖片在 RAM 中佔用 300–500MB圖片太大導致小畫家在載入時記憶體不足而報錯。
色彩深度支援常見的 24-bit(RGB)、32-bit(含 Alpha)PNG
但無法處理某些高位元 PNG(如 48-bit HDR)
若圖像格式異常,可能跳錯。
格式限制.bmp、.jpg、.jpeg、.png、.gif(靜態)、.tif(有時支援)動態 GIF、CMYK JPEG、特殊 ICC/EXIF 檔案可能無法開啟。


🧪 測試結果與案例參考

圖片解析度格式可否用小畫家開啟備註
8000 x 8000 (64MP)PNG/JPG✅ 可以較穩定
10000 x 12000 (120MP)PNG⚠️ 不一定可開依硬體與版本而定
10039 x 17717 (177MP)PNG❌ 無法開啟你遇到的案例
20000 x 20000 (400MP)PNG❌ 無法開啟一律失敗或報錯
5000 x 10000 (50MP)PNG/JPG✅ 可以適合縮圖後編輯

🧠 背後原因

小畫家基於 Windows GDI/GDI+ API,這些 API 本身對圖像尺寸與緩衝區有一定上限,再加上小畫家本身是為簡單操作設計,並未針對高解析度圖片進行記憶體優化與延遲載入處理。

✅ 建議方案

若你要處理超過小畫家能支援的圖片,建議使用以下工具:

軟體優點
Paint.NET較輕量、免費,支援高解析度圖像
GIMP開源免費,支援大型圖片
IrfanView / FastStone快速檢視與縮圖
Photoshop專業等級,可開啟超大圖像
ImageMagick CLI適合批次處理與自動縮圖

(完)

2025年6月12日 星期四

[研究]ASP.NET, 傳統 多 Master Page、多頁式 WebForm 架構能改寫成為"一頁式網站" ?

[研究]ASP.NET, 傳統 多 Master Page、多頁式 WebForm 架構能改寫成為"一頁式網站" ?

2025-06-12

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

🔄 傳統 WebForm 改寫為 SPA 的方法與挑戰

面向說明
頁面切換邏輯原本每個 .aspx 頁面都有自己的 MasterPage、Page_Load。SPA 要用 JavaScript + AJAX 把這些內容以片段(Partial View)載入,或重構成 Web API + 前端頁面組件。
MasterPage 結構要改為一個主頁殼(例如 Default.aspx + Site.Master),所有內容在主頁內透過 AJAX 載入
區域。
ViewState / PostbackSPA 不再用 ViewState/Postback,而用 JSON API 和前端狀態管理(例如 localStorage, sessionStorage)。若要部分保留 WebForms,可用 UpdatePanel 模擬。
控制項重用原本的 WebForms Server Control 需改寫成 JavaScript 元件或 HTML partials。
驗證 / 權限控制Server-side 驗證(如 RequiredFieldValidator)需改為 JavaScript 驗證 + Server API 驗證搭配。
導航 / URL 路由SPA 需用 JavaScript 處理「偽路由(hash-based routing)」或 HTML5 History API 處理路由(如 /home, /about 對應不同畫面)

🛠️ 可行的轉換技術

技術選項說明
jQuery + AJAX適合 WebForms 傳統開發者,不需全面重寫,但維護性差。
UpdatePanel + ScriptManager可保留 WebForms 特性做「半 SPA」,但仍有 ViewState 與性能問題。
ASP.NET Web API + JavaScript 前端從 WebForms 將資料/邏輯分離為 API,前端用 React/Vue/jQuery 管理畫面。
Blazor WebAssembly若轉向 .NET Core/Blazor,可用 C# 寫前端 SPA。但需大幅改寫,與 WebForms 不相容。

不建議轉為 SPA 的狀況
  • 使用大量 WebForms Server Control(如 GridView, DataSource, Login controls)
  • 大量依賴 ViewState 與 Page Lifecycle 的商業邏輯
  • 系統已穩定維運,無明顯效能問題或 UX 瓶頸

🧮 程式修改百分比(粗估)

項目修改或重寫比例備註
.aspx 頁面結構90–100% 移除SPA 只保留一個 HTML 容器頁面,原本每個頁面要轉成組件或 section。
Master Page100% 移除或棄用不再使用 ASP.NET MasterPage。SPA 通常採用前端框架的 Layout。
伺服器控制項(如 GridView、FormView)90–100% 捨棄需改為前端元件(如 React Table、Vue Component),或改用 HTML + JavaScript。
Code-behind (.aspx.cs)70–90% 重寫改為 Web API 的後端服務(JSON 資料),前端邏輯用 JavaScript 處理。
使用者互動(Button Click、PostBack)100% 改寫不再用 PostBack。改為前端 AJAX 呼叫 API。
資料處理(如 DAL、BLL)10–30% 可保留若已分層良好,可直接重用,封裝成 Web API。
JavaScript / 前端框架0 ➜ 新增 100%需大量新增(React、Vue、或 jQuery、甚至純原生 JS)。
頁面導覽、切換(Menu)100% 改寫要用 JavaScript 處理 Router 或 Section 滾動(如 hash links、前端 Router)。
驗證機制(如 RequiredFieldValidator)100% 改為 JavaScript 驗證 + API 驗證原本的 ASP.NET 驗證控制項無法使用。
Session/Login 機制30–70% 調整前端登入後需記錄 token,後端改為 Token 驗證、Claims 或 OAuth。

📊 總體程式修改百分比
  • 整體重寫比例:80–100%
  • 實際可重用部分:後端業務邏輯(DAL/BLL):約可重用 20–40%
  • CSS 樣式:若結構不變可重用 30–50%
  • SQL 與資料表結構:可完全保留
(完)

相關

[研究]甚麼是 "一頁式網站" ?

[研究]甚麼是 "一頁式網站" ?

2025-06-12

ChatGPT 說:

「一頁式網站」(One Page Website 或 Single Page Website)是一種網頁設計風格,其所有主要內容都集中在同一個網頁中,而不是分散在多個不同的頁面(如「首頁」、「關於我們」、「產品介紹」、「聯絡我們」等)之中。使用者透過**垂直捲動(Scroll)**或點擊導覽連結,頁面會平滑地捲動到對應區塊,而不會跳轉到其他 URL。

有時候也用 SPA(Single Page Application),但 SPA 更多是指技術架構(用 JavaScript 動態載入內容的應用程式),不完全等同於一般靜態或簡單的一頁式網站。

✅ 一頁式網站的特色:

  • 只有一個 HTML 頁面:所有內容寫在同一頁中,通常以 <section> 區隔不同主題。
  • 滑動導覽(Scroll Navigation):導覽列(Menu)連結的是頁面內的錨點(Anchor),例如 #about、#services。
  • 適合簡潔內容:常用於產品介紹頁、活動宣傳頁、個人作品集(Portfolio)等。
  • 互動流暢:配合 JavaScript 或 CSS 的動畫效果,滑動時畫面呈現更自然、有吸引力。

🔍 與多頁式網站比較:

項目一頁式網站多頁式網站
結構所有內容集中在一頁每個主題分開頁面
網址(URL)通常只一個網址 + 錨點(#)多個不同 URL
載入速度初次載入可能稍慢(因一次載入全部)單頁載入較快
SEO 表現SEO 較難優化(因為只有一頁)SEO 容易針對每頁最佳化
使用者體驗簡潔、滑動流暢,適合行動裝置結構清晰,適合大量資訊內容

常見用途:

  • 活動 / 展覽網站
  • 新產品上線頁(Landing Page)
  • 個人履歷 / 作品集(Portfolio)
  • 宣傳型微型網站(Microsite)

********************************************************************************

✅ 一頁式網站的 優點

1. 使用者體驗佳(UX)

  • 瀏覽方式簡單,透過滑動就能閱讀整體內容。
  • 不需跳轉頁面,操作直覺,特別適合手機或平板使用者。

2. 專注於單一目的

  • 很適合用來推廣一項產品、活動、課程或服務,內容聚焦,不分散注意力。

3. 設計簡潔、美觀

  • 頁面結構統一,方便用動畫、視差滾動(parallax)、全螢幕背景等效果提升視覺吸引力。

4. 開發與維護成本較低

  • 架構簡單,通常只需一組 HTML/CSS/JS 檔案,相對容易建置與維護。

5. 提升轉換率(Conversion)

  • 所有訊息與 Call-to-Action(如表單、按鈕)都在一頁內,能有效引導使用者進行下一步行動。


❌ 一頁式網站的 缺點

1. SEO 不利

  • 只有一個頁面,無法針對多個關鍵字做優化。
  • 搜尋引擎無法清楚區分不同內容的主題與結構。

2. 內容有限

  • 若資訊量太多,會造成捲動過長、混亂,反而降低使用者體驗。
  • 不適合多產品、多分類、需說明大量內容的網站。

3. 首次載入速度可能較慢

  • 所有內容、圖片與動畫都在一頁中,初次載入需要較多資源。

4. 分析困難

  • 無法像多頁式網站那樣針對每個頁面分析使用者行為(例如:某人停留在「關於我們」幾秒鐘)。

5. 功能擴展受限

  • 若未來想擴充內容為多類服務或加入部落格功能,一頁式架構會變得難以維護。


📌 適合使用一頁式網站的情境

使用情境是否適合
單一活動宣傳頁✅ 非常適合
單一產品介紹✅ 適合
個人履歷 / 作品集✅ 適合
電商網站(多品項)❌ 不適合
資訊型官方網站(多層內容)❌ 不適合

********************************************************************************

「一頁式網站」和「網址不會變化的網站」在使用者體驗上可能看起來類似,但它們是兩個不同的概念,下面用表格和說明幫你清楚區分和比較。

概念定義比較

項目一頁式網站(One Page Website)網址不會變化的網站
定義整個網站的內容集中在單一頁面中,以滾動或區塊跳轉方式展示使用者互動或內容變化時,網址保持不變
網址結構通常是單一 URL,部分跳轉使用錨點(如 #about)URL 幾乎不變(連錨點也可能不變)
導覽方式滾動到頁面內區塊(anchor link)JavaScript 動態改變頁面內容
是否會載入新頁面否(所有內容已載入)否(內容透過 AJAX/JavaScript 動態載入)
常見技術HTML + CSS + JS,無需框架通常是 SPA(如 Vue、React),或 iframe
SEO 友善程度較差(全部內容在一頁中)視實作方式而定,SPA 若未處理 SSR 也較差
適用情境單一活動、產品介紹、履歷網站Web App、儀表板系統、後台管理介面等

簡單總結比較邏輯

問題一頁式網站網址不變化的網站
全部內容是否在一個 HTML 中?✅ 是❌ 不一定
是否依靠捲動導覽?✅ 是❌ 否,內容直接改變
是否一定只有一個網址?✅ 幾乎是✅ 常常是
是否屬於 Web App 類型?❌ 否✅ 是,常是 SPA

(完)

[研究]微軟每月定期發布 Windows 更新時間

[研究]微軟每月定期發布 Windows 更新時間

2025-06-12

Windows 用戶端的更新發行週期 (2025-03-27)
https://learn.microsoft.com/zh-tw/windows/deployment/update/release-cycle

Update release cycle for Windows clients (2025-03-27)
https://learn.microsoft.com/en-us/windows/deployment/update/release-cycle

【微軟每月更新發佈時間】

每月第二個星期二(Patch Tuesday):微軟會發布「每月安全更新」,也稱為「累積更新」,包括安全性修補程式和非安全性內容。這些更新通常在美國太平洋時間上午 10:00 發布。

【台灣用戶可下載時間】

台灣位於 UTC+8 時區,與美國太平洋時間(PST/PDT)有 15 或16小時的時差。每月第二個星期二的更新:台灣時間為每月第二個星期三的上午 1:00 (夏令時間) 或 2:00 ( 冬令時間)。

時間區間美國太平洋時間台灣時間(UTC+8)時差
冬令時間(大約11月初~3月初)PST(UTC-8)UTC+816 小時
夏令時間(大約3月中~11月初)PDT(UTC-7)UTC+815 小時

(完)

[研究]wafw00f測試沒發現 WAF,但實際是有過 WAF 的

[研究]wafw00f測試沒發現 WAF,但實際是有過 WAF 的

2025-06-10

kali :Linux 測試沒發現 WAF,但實際是有過 WAF 的。

┌──(kali㉿kali)-[~]
└─$ wafw00f https://(遮蔽)/

                 ?              ,.   (   .      )        .      "
         __        ??          ("     )  )'     ,'        )  . (`     '`
    (___()'`;   ???          .; )  ' (( (" )    ;(,     ((  (  ;)  "  )")
    /,___ /`                 _"., ,._'_.,)_(..,( . )_  _' )_') (. _..( ' )
    \\   \\                 |____|____|____|____|____|____|____|____|____|

                                ~ WAFW00F : v2.3.1 ~
                    ~ Sniffing Web Application Firewalls since 2014 ~

[*] Checking https://(遮蔽)/
[+] Generic Detection results:
[-] No WAF detected by the generic detection
[~] Number of requests: 7
                                                                             
┌──(kali㉿kali)-[~]
└─$ 



********************************************************************************

ChatGPT 說:

這種情況 —— WAFW00F 測不到 WAF,但實際目標有部署 WAF —— 在實務上並不少見。以下是可能的原因與對應建議:


🔍 一、為何 WAFW00F 測不到 WAF?

1. WAF 被設成非侵入式(被動偵測)或透明代理

  • 某些 WAF 例如 Cloudflare、F5、AWS WAF 可以在不改變回應標頭、不封鎖探測的情況下運作,只在「明顯攻擊」時才攔截。
  • WAFW00F 預設的探測不一定會觸發這些條件。

2. WAF 有設定白名單或學習模式

  • 若你的 IP 是白名單、信任來源,WAF 不會對你觸發封鎖規則。
  • 學習模式下,WAF 會先觀察行為,不主動阻擋。

3. Web Server 或 CDN 已隱匿 WAF 特徵

  • 例如使用 nginx + ModSecurity 搭配自訂錯誤頁面,不容易從標頭或錯誤碼中看出 WAF 存在。
  • 或使用 Edge Proxy(如 CloudFront) 將 WAF 內建於背後。

4. WAFW00F 探測 signature 不涵蓋該廠商或版本

  • 雖然 WAFW00F 支援 80+ 種 WAF,但不是每一版、每一設定都能辨識。
  • 某些中國大陸廠商、客製化 WAF,可能未列入其 signature 資料庫。

🧪 二、如何手動驗證是否有 WAF?

1. 使用明顯攻擊參數測試

curl -i "https://example.com/index.php?id=1 AND 1=1"

curl -i "https://example.com/index.php?id=1; DROP TABLE users--"

看是否出現:

403 Forbidden / 406 Not Acceptable / 429 Too Many Requests

X-WAF-* 標頭、Server: cloudflare、akamai, f5, mod_security

2. 增加 User-Agent、Referer、Cookie 異常內容測試

curl -i -H "User-Agent: sqlmap" https://example.com/

curl -i -H "Referer: http://evil.com" https://example.com/

3. 使用其他工具進行交叉比對

Nmap + http-waf-detect.nse
https://nmap.org/nsedoc/scripts/http-waf-detect.html

ffuf / sqlmap 在偵測時也可能會回報 WAF 存在

wafpass 或 wafninja 可嘗試繞過測試

https://github.com/wafpassproject/wafpass
https://github.com/khalilbijjou/wafninja

✅ 補充:sqlmap 偵測 WAF 的範例

sqlmap -u "https://example.com/page.php?id=1" --identify-waf

若有偵測到 WAF,sqlmap 會回報廠牌與類型。

(完)

[研究]h2spec 2.6.0(HTTP/2 協定符合性測試工具)試用

[研究]h2spec 2.6.0(HTTP/2 協定符合性測試工具)試用

2025-06-12

h2spec官方網站,h2spec v2.6.0 於 2020-08-04 釋出

https://github.com/summerwind/h2spec

下載

https://github.com/summerwind/h2spec/releases

h2spec_windows_amd64.zip 

實際使用,預設不會告訴你有那些參數

C:\h2spec_windows_amd64>h2spec.exe
Generic tests for HTTP/2 server
  1. Starting HTTP/2
    × 1: Sends a client connection preface

Error: dial tcp 127.0.0.1:80: connectex: No connection could be made because the target machine actively refused it.

C:\h2spec_windows_amd64>

實際使用,拿 www.hinet.net 試驗一下

-t:執行所有測試(包含 HTTP/2 要求與錯誤處理)

-k:忽略 TLS 憑證錯誤(對測試 staging/dev 伺服器很實用)

-p 443:指定 HTTPS 連接埠

-h:目標主機(可以是 domain 或 IP)

C:\h2spec_windows_amd64>h2spec.exe -t -k -p 443 -h www.hinet.net
Generic tests for HTTP/2 server
  1. Starting HTTP/2
    ✔ 1: Sends a client connection preface

  2. Streams and Multiplexing
    ✔ 1: Sends a PRIORITY frame on idle stream
    ✔ 2: Sends a WINDOW_UPDATE frame on half-closed (remote) stream
    ✔ 3: Sends a PRIORITY frame on half-closed (remote) stream
    ✔ 4: Sends a RST_STREAM frame on half-closed (remote) stream
    ✔ 5: Sends a PRIORITY frame on closed stream

  3. Frame Definitions
    3.1. DATA
      ✔ 1: Sends a DATA frame
      ✔ 2: Sends multiple DATA frames
      ✔ 3: Sends a DATA frame with padding

    3.2. HEADERS
      ✔ 1: Sends a HEADERS frame
      ✔ 2: Sends a HEADERS frame with padding
      ✔ 3: Sends a HEADERS frame with priority

    3.3. PRIORITY
      ✔ 1: Sends a PRIORITY frame with priority 1
      ✔ 2: Sends a PRIORITY frame with priority 256
      ✔ 3: Sends a PRIORITY frame with stream dependency
      ✔ 4: Sends a PRIORITY frame with exclusive
      ✔ 5: Sends a PRIORITY frame for an idle stream, then send a HEADER frame for a lower stream ID

    3.4. RST_STREAM
      ✔ 1: Sends a RST_STREAM frame

    3.5. SETTINGS
      ✔ 1: Sends a SETTINGS frame

    3.7. PING
      ✔ 1: Sends a PING frame

    3.8. GOAWAY
      ✔ 1: Sends a GOAWAY frame

    3.9. WINDOW_UPDATE
      ✔ 1: Sends a WINDOW_UPDATE frame with stream ID 0
      ✔ 2: Sends a WINDOW_UPDATE frame with stream ID 1

    3.10. CONTINUATION
      ✔ 1: Sends a CONTINUATION frame
      ✔ 2: Sends multiple CONTINUATION frames

  4. HTTP Message Exchanges
    ✔ 1: Sends a GET request
    ✔ 2: Sends a HEAD request
    ✔ 3: Sends a POST request
    using source address 10.3.121.11:52517m
    × 4: Sends a POST request with trailers
      -> The endpoint MUST respond to the request.
         Expected: HEADERS Frame (stream_id:1)
           Actual: Connection closed

  5. HPACK
    ✔ 1: Sends a indexed header field representation
    ✔ 2: Sends a literal header field with incremental indexing - indexed name
    ✔ 3: Sends a literal header field with incremental indexing - indexed name (with Huffman coding)
    ✔ 4: Sends a literal header field with incremental indexing - new name
    ✔ 5: Sends a literal header field with incremental indexing - new name (with Huffman coding)
    ✔ 6: Sends a literal header field without indexing - indexed name
    ✔ 7: Sends a literal header field without indexing - indexed name (with Huffman coding)
    ✔ 8: Sends a literal header field without indexing - new name
    ✔ 9: Sends a literal header field without indexing - new name (huffman encoded)
    ✔ 10: Sends a literal header field never indexed - indexed name
    ✔ 11: Sends a literal header field never indexed - indexed name (huffman encoded)
    ✔ 12: Sends a literal header field never indexed - new name
    ✔ 13: Sends a literal header field never indexed - new name (huffman encoded)
    ✔ 14: Sends a dynamic table size update
    ✔ 15: Sends multiple dynamic table size update

Hypertext Transfer Protocol Version 2 (HTTP/2)
  3. Starting HTTP/2
    3.5. HTTP/2 Connection Preface
      ✔ 1: Sends client connection preface
      ✔ 2: Sends invalid connection preface

  4. HTTP Frames
    4.1. Frame Format
      ✔ 1: Sends a frame with unknown type
      ✔ 2: Sends a frame with undefined flag
      ✔ 3: Sends a frame with reserved field bit

    4.2. Frame Size
        1: Sends a DATA frame with 2^14 octets in length

訊息太多了,敝人只是想簡單知道 Web Server 目前提供支援的 HTTP 版本。

(完)

[研究]Acrobat Pro 2020 如何移除 .PDF 開啟密碼 ?

[研究]Acrobat Pro 2020 如何移除 .PDF 開啟密碼 ?

2025-06-12

  1. 開啟 Acrobat Pro 2020。
  2. 開啟受密碼保護的 PDF 檔案。
  3. Acrobat 會要求你輸入「開啟密碼」。輸入正確密碼後,PDF 才會被打開。
  4. 按下快捷鍵 Ctrl + D,在跳出的「文件內容」視窗中,切換到 「安全性」標籤。
  5. 找到「安全性方式」下拉選單,將其從【密碼安全性】改成【無安全性】
  6. Acrobat 會提示你需要再次輸入密碼以確認身份。
  7. 儲存檔案。

此時產出的檔案就已經沒有開啟密碼了。


(完)

2025年6月10日 星期二

[研究]相同 ASP.NET WebForm 網站,走 HTTPS,本機測 HTTP/2,Internet 測 HTTP/1.1

[研究]同一個 ASP.NET WebForm 網站,走 HTTPS,本機測 HTTP/2,Internet 測 HTTP/1.1

2025-06-10

Windows Server 2019 Standard + IIS + ASP.NET + WebForm + HTTPS (不提供 HTTP)





********************************************************************************

ChatGPT 說:

1. IIS 支援 HTTP/2,但可能經過中間設備或未正確協商
若你從外部透過以下途徑連線網站,有可能協議被降級:
  • 防火牆 / Proxy / SSL Offloading
  • CDN(Cloudflare、Azure Front Door、F5 等)
  • 負載平衡器 / Application Gateway
這些中介設備有些支援 HTTP/2、有些僅支援 HTTP/1.1,有些會對外說 HTTP/2,但與後端 IIS 通訊仍為 HTTP/1.1。

使用 curl -I --http2 https://你的網址 看實際協定協商狀況。

2. ALPN 協商失敗
HTTP/2 的協商是透過 TLS 擴展的 ALPN(Application-Layer Protocol Negotiation)完成的。若:
  • 客戶端不支援 ALPN(例如:老版本 curl)
  • TLS 設定過舊
  • Cipher Suite 不支援
則會退回 HTTP/1.1。

********************************************************************************

kali :Linux 測試沒發現 WAF,但實際是有過 WAF 的。

┌──(kali㉿kali)-[~]
└─$ wafw00f https://(遮蔽)/

                 ?              ,.   (   .      )        .      "
         __        ??          ("     )  )'     ,'        )  . (`     '`
    (___()'`;   ???          .; )  ' (( (" )    ;(,     ((  (  ;)  "  )")
    /,___ /`                 _"., ,._'_.,)_(..,( . )_  _' )_') (. _..( ' )
    \\   \\                 |____|____|____|____|____|____|____|____|____|

                                ~ WAFW00F : v2.3.1 ~
                    ~ Sniffing Web Application Firewalls since 2014 ~

[*] Checking https://(遮蔽)/
[+] Generic Detection results:
[-] No WAF detected by the generic detection
[~] Number of requests: 7
                                                                             
┌──(kali㉿kali)-[~]
└─$ 




(完)

[研究]Windows Server 2019 + IIS + ASP.NET 的 Web Server 如何啟用 HTTP/2

[研究]Windows Server 2019 + IIS + ASP.NET 的 Web Server 如何啟用 HTTP/2

2025-06-09

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

Windows Server 2019 + IIS + ASP.NET 的 Web Server 如何啟用 HTTP/2

ChatGPT 說:

在 Windows Server 2019 + IIS + ASP.NET 環境中啟用 HTTP/2,可以透過以下步驟進行設定。Windows Server 2019 的 IIS(版本 10.0)預設已支援 HTTP/2,只要使用的是 HTTPS(TLS)連線即可啟用。

1. 確認系統與 IIS 條件

  • Windows Server 2016或更新版本
  • IIS 10.0 或以上 ✔️
  • 已安裝 HTTPS 憑證(TLS/SSL) ✔️
  • HTTP/2 在 IIS 中只適用於 HTTPS,不支援純 HTTP 連線。
  • ASP.NET 應用無需額外修改支援 HTTP/2,由 IIS 處理協定層。

2. 檢查 IIS 是否已啟用 HTTP/2

IIS 10 on Windows Server 2019 預設開啟 HTTP/2

(下圖) FireFox可判斷是否是 HTTP/2


(下圖) FireFox + Windows Serer 2019 IIS + ASP.NET WebForm 測試


(下圖) Chrome 目前版本好像無法判斷是否是 HTTP/2



(下圖) curl 發現是自簽憑證,無法判斷是否是 HTTP/2


┌──(kali㉿kali)-[~]
└─$ curl -I https://192.168.128.131/         
curl: (35) GnuTLS, handshake failed: Key usage violation in certificate has been detected.
                                                                             
┌──(kali㉿kali)-[~]
└─$ curl -I https://192.168.128.131/default.htm
curl: (35) GnuTLS, handshake failed: Key usage violation in certificate has been detected.
                                                                             
┌──(kali㉿kali)-[~]
└─$ curl -I -k https://192.168.128.131/        
curl: (35) GnuTLS, handshake failed: Key usage violation in certificate has been detected.
                                                                             
┌──(kali㉿kali)-[~]
└─$ 


********************************************************************************

補充:

手動確認或修改 IIS 是否啟動 HTTP/2:

A. 開啟登錄編輯器:

Win + R → 輸入 regedit

B. 瀏覽至:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS\Parameters

C. 檢查或建立以下 DWORD 值:

EnableHttp2    值設為 1(啟用)

EnableHttp2Cleartext    值設為 0(禁用 HTTP/2 over HTTP)

如果這些鍵不存在,可以手動新增:

名稱 類型 數值

EnableHttp2 DWORD (32-bit) 1

EnableHttp2Cleartext DWORD (32-bit) 0

修改後,重新啟動 HTTP 服務或整台伺服器:

iisreset

3. 確認 HTTPS 綁定

請確認你已在 IIS 管理員中:

為網站設定了有效的 SSL 憑證。

在網站的綁定設定中使用 HTTPS + 對應的 Port(通常是 443)。


(完)

相關



2025年6月9日 星期一

[研究]發現 Mend 不會區分是否註解

[研究]發現 Mend 不會區分是否註解

2025-06-09




確認過使用 bootstrap 3.3.7 的地方都是註解。

(完)



[研究]Web Server 支援 HTTP/2 的條件?

[研究]Web Server 支援 HTTP/2 的條件? 

2025-06-09

ChatGPT 說:

Web Server 要支援 HTTP/2,需滿足以下條件:

🔧 一、Web Server 軟體本身要支援 HTTP/2

常見支援 HTTP/2 的 Web Server:

Web ServerHTTP/2 支援情況
Apache (httpd)自 2.4.17 起支援(需啟用 mod_http2)
Nginx自 1.9.5 起支援(需使用 OpenSSL 1.0.2+)
IIS自 Windows Server 2016 / Windows 10 起內建支援
LiteSpeed支援
Caddy預設支援
Tomcat需搭配 HTTP/2 upgrade handler 或 proxy 使用

📜 二、使用的 TLS/SSL 憑證(HTTPS)

  • 雖然 HTTP/2 在標準中不強制使用 TLS(即 HTTPS),但幾乎所有主要瀏覽器 都只在 HTTPS 連線上啟用 HTTP/2。
  • 所以:部署 HTTPS 是實務上啟用 HTTP/2 的必要條件。

🔗 三、OpenSSL 或類似加密函式庫版本(伺服器端)

某些 Web Server 需要依賴 OpenSSL,HTTP/2 支援需 OpenSSL 版本為:

  • 最低需 OpenSSL 1.0.2
  • 更佳為 OpenSSL 1.1.1 或 OpenSSL 3.x

⚙️ 四、瀏覽器與客戶端支援

  • 大部分現代瀏覽器(Chrome, Firefox, Edge, Safari)都支援 HTTP/2。
  • 但若用戶端不支援,伺服器會自動回退到 HTTP/1.1。
  • 敝人補充:詳見 https://caniuse.com/http2

✅ 五、伺服器設定是否有正確啟用 HTTP/2

例如:

  • Apache: 需加入 Protocols h2 http/1.1 並載入 mod_http2
  • Nginx: listen 443 ssl http2;
  • IIS: 只需確保是 Windows 10/Server 2016 以上版本,並啟用 HTTP/2

🧪 六、驗證方式

可以使用以下方式確認是否成功啟用 HTTP/2:

(完)

[研究]Rocky Linux 9.6安裝

[研究]Rocky Linux 9.6安裝

2025-06-09

Rocky Linux 9.6 於 2025-06-03 釋出。

官方網站

https://rockylinux.org/zh-TW

直接下載

https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.6-x86_64-dvd.iso




















(完)