2024年2月26日 星期一

[研究]ASP.NET WebForm, ListView, GridView 的 ItemTemplate 中,Label的 Bind()可以改成 Eval() 嗎?

[研究]ASP.NET WebForm, ListView, GridView 的 ItemTemplate 中,Label的 Bind()可以改成 Eval() 嗎?

2024-02-26

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

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

ASP.NET WebForm, ListView 的 ItemTemplate 中,

<asp:Label ID="Label4" runat="server" Text='<%# Bind("ID") %>'>可以改成<asp:Label ID="Label4" runat="server" Text=' <%# Eval("ID") %>'> 嗎?

ChatGPT

是的,您可以將 <asp:Label> 控制項中的 Text 屬性從 <%# Bind("ID") %> 改為 <%# Eval("ID") %>。 兩者的差別在於:

  • Bind:會將控制項的值綁定到資料來源,並且與資料來源雙向綁定。 如果您在控制項中變更了值,則會自動反映到資料來源中。
  • Eval:只是從資料來源中檢索值,並將其顯示在控制項中。 如果您在控制項中變更了值,則不會反映到資料來源中。

在大多數情況下,如果您只需要顯示資料而不需要更改它,並且不需要與資料來源雙向綁定,那麼使用 Eval 會更合適。 因此,您可以安全地將 <asp:Label> 控制項的 Text 屬性修改為 <%# Eval("ID") %>。

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

【實際測試】

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.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:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDBConnectionString %>"
            DeleteCommand="DELETE FROM [MyTable] WHERE [SN] = @SN"
            InsertCommand="INSERT INTO [MyTable] ([SN], [cname]) VALUES (@SN, @cname)"
            SelectCommand="SELECT * FROM [MyTable]"
            UpdateCommand="UPDATE [MyTable] SET [cname] = @cname WHERE [SN] = @SN">
            <DeleteParameters>
                <asp:Parameter Name="SN" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="SN" Type="Int32" />
                <asp:Parameter Name="cname" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="cname" Type="String" />
                <asp:Parameter Name="SN" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
            AutoGenerateColumns="False" DataKeyNames="SN" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
                <asp:BoundField DataField="SN" HeaderText="SN" ReadOnly="True" SortExpression="SN" />
                <asp:TemplateField HeaderText="cname" SortExpression="cname">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("cname") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <%--<asp:Label ID="Label1" runat="server" Text='<%# Bind("cname") %>'></asp:Label>--%>
                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("cname") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:FormView ID="FormView1" runat="server" DataKeyNames="SN" DataSourceID="SqlDataSource1">
            <EditItemTemplate>
                SN:
                <asp:Label ID="SNLabel1" runat="server" Text='<%# Eval("SN") %>' />
                <br />
                cname:
                <asp:TextBox ID="cnameTextBox" runat="server" Text='<%# Bind("cname") %>' />
                <br />
                <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="更新" />
                &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="取消" />
            </EditItemTemplate>
            <InsertItemTemplate>
                SN:
                <asp:TextBox ID="SNTextBox" runat="server" Text='<%# Bind("SN") %>' />
                <br />
                cname:
                <asp:TextBox ID="cnameTextBox" runat="server" Text='<%# Bind("cname") %>' />
                <br />
                <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="插入" />
                &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="取消" />
            </InsertItemTemplate>
            <ItemTemplate>
                SN:
                <asp:Label ID="SNLabel" runat="server" Text='<%# Eval("SN") %>' />
                <br />
                cname:
                <%--<asp:Label ID="cnameLabel" runat="server" Text='<%# Bind("cname") %>' />--%>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("cname") %>' />
                <br />
                <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit" Text="編輯" />
                &nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="刪除" />
                &nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New" Text="新增" />
            </ItemTemplate>
        </asp:FormView>
    </form>
</body>
</html>


Default.aspx.cs

預設內容   


(下圖)實際測試,Bind 換成 Eval 後,使用 "編輯" 功能仍正常。

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

[研究]ASP.NET WebForm, GridView, FormView 的 ItemTemplate 中,Label 為何預設使用 Bind,而非用 Eval ?

2024-02-26

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

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

ASP.NET WebForm, GridView 的 ItemTemplate 中,Label 為何預設使用 Bind,而非用 Eval ?

<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("cname") %>'></asp:Label>
</ItemTemplate>

ChatGPT

在ASP.NET WebForms中,GridView的ItemTemplate中預設使用Bind而不是Eval,可能是出於以下原因:

  • 雙向綁定(Two-Way Binding):使用Bind時,不僅可以從資料來源擷取值顯示在控制項中,還可以將控制項的值變更後更新回資料來源。 這種雙向綁定對於GridView的編輯、更新和插入操作非常有用,因為它可以簡化與資料來源的互動。
  • 類型安全性(Type-Safe):Bind在綁定資料時會檢查資料類型,並盡可能將資料類型配對到控制項。 這樣可以減少資料類型轉換錯誤的可能性。
  • 效能最佳化:Bind可能會比Eval更有效率,因為它可以在資料綁定過程中進行一些最佳化,例如延遲載入和類型推斷。

雖然預設使用Bind可能會為某些情況帶來便利性和效能優勢,但在某些情況下可能更適合使用Eval。 如果您只是需要從資料來源中檢索值並顯示在GridView中,而不需要將值變更後更新回資料來源,那麼使用Eval可能會更簡單和直覺。

如果您希望在GridView的ItemTemplate中使用Eval而不是Bind,您可以手動變更程式碼,將Text屬性從<%# Bind("cname") %>變更為<%# Eval("cname") %>。

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

ASP.NET WebForm, FormView 的 ItemTemplate 中,Label 為何預設使用 Bind,而非用 Eval ?

<ItemTemplate>
cname:<asp:Label ID="cnameLabel" runat="server" Text='<%# Bind("cname") %>' />
</ItemTemplate>

ChatGPT

在ASP.NET WebForms中,FormView控制項的ItemTemplate中預設使用Bind而不是Eval,可能是因為FormView通常用於資料編輯和顯示的情況,而不僅僅是顯示資料。 使用Bind提供了更強大的雙向資料綁定功能,適用於FormView控制項的編輯、更新和插入操作。

透過使用Bind,您可以實現以下功能:

  • 雙向綁定:可以將控制項的值與資料來源進行雙向綁定,使得當使用者變更控制項的值時,可以將變更後的值自動更新到資料來源中。
  • 類型安全性:Bind在綁定資料時會盡可能地將資料類型配對到控制項中,這可以減少資料類型轉換錯誤的可能性。
  • 資料來源更新:當使用者對控制項進行變更並提交表單時,使用Bind可以使表單中的值自動更新到資料來源中,而無需手動編寫更新邏輯。

雖然預設使用Bind可能會為某些情況帶來便利性和效能優勢,但在某些情況下可能更適合使用Eval。 如果您只是需要從資料來源中檢索值並顯示在FormView中,而不需要將值變更後更新回資料來源,那麼使用Eval可能會更簡單和直覺。

如果您希望在FormView的ItemTemplate中使用Eval而不是Bind,您可以手動變更程式碼,將Text屬性從<%# Bind("cname") %>變更為<%# Eval("cname") %>。

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

Label 是唯讀的,Bind 的雙向綁定應該無用吧 ?

ChatGPT

您是對的,對於唯讀的Label控件,使用Bind進行雙向綁定是沒有意義的。 因為Label控制項是唯讀的,使用者無法在頁面上直接編輯它們,所以無法透過Label控制項向資料來源中傳遞使用者輸入的值。

在FormView的ItemTemplate中,如果Label控制用於唯讀目的,則應該使用Eval而不是Bind。 Eval只會從資料來源中擷取值並顯示在Label控制項中,而不會嘗試將值更新回資料來源。

因此,在只需要顯示資料而不需要更新資料的情況下,應該使用Eval而不是Bind。 如果您的Label控制項用於唯讀目的,可以將綁定從<%# Bind("cname") %>變更為<%# Eval("cname") %>,以確保最佳的效能和邏輯一致 性。

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

如果 FormView 提供編輯欄位 AAA,EditItemTemplate 和 InsertItemTemplate 對 AAA 欄位仍用 Bind,在 ItemTemplate 中,顯示欄位 AAA 的 Label 可從 Bind() 改用 Eval() 嗎?

ChatGPT

如果在 FormView 中,對於欄位 AAA 在 EditItemTemplate 和 InsertItemTemplate 中使用了 Bind(),那麼在 ItemTemplate 中使用 Eval() 通常是安全的,尤其是當您希望只讀地顯示欄位 AAA 的目前值時。

在 EditItemTemplate 和 InsertItemTemplate 中使用 Bind() 可以實現雙向綁定,使用戶能夠編輯欄位 AAA 並將變更儲存到資料來源中。 而在 ItemTemplate 中,您可能只是想顯示目前資料來源中欄位 AAA 的值,而不允許使用者直接編輯它。

所以,您可以將ItemTemplate 中顯示欄位AAA 的Label 控制項的綁定從<%# Bind("AAA") %> 變更為<%# Eval("AAA") %>,以便在顯示該值時不觸發 雙向綁定的邏輯。 這樣做不會影響編輯功能,因為 EditItemTemplate 和 InsertItemTemplate 仍然使用 Bind() 來處理編輯和插入操作。

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

Bind() 和 Eval() 哪個效能較好 ?

ChatGPT

在 ASP.NET WebForms 中,Eval() 和 Bind() 都是用於資料綁定的方法,但它們之間有一些不同之處,包括效能方面。

Eval():

  • Eval() 用於從資料來源中檢索值並將其顯示在控制項中。
  • 它是唯讀的,不會修改資料來源中的值。
  • Eval() 在資料綁定時進行一次性的讀取操作,並將值直接綁定到控制項上,不涉及任何資料來源的變更。
  • 由於 Eval() 是唯讀的,因此它的效能通常比較高,特別是在簡單資料綁定的情況下。

Bind():

  • Bind() 除了從資料來源擷取值並將其顯示在控制項中之外,還可以將控制項中的值更新回資料來源中。
  • Bind() 是雙向綁定的,可以用於在控制項中編輯值並將變更儲存到資料來源。
  • Bind() 在資料綁定時會建立資料來源和控制項之間的雙向綁定關係,當使用者對控制項進行變更時,會自動更新資料來源中的值。
  • 由於 Bind() 具有雙向綁定的功能,它可能會比 Eval() 更消耗效能,特別是在大規模資料綁定或編輯操作中。

因此,從效能角度來看,在只需要從資料來源中檢索值並顯示在控制項中時,Eval() 可能是更有效率的選擇。 但是,如果需要實現編輯和更新功能,並且可以使用雙向綁定,那麼 Bind() 可能是更合適的選擇,儘管在某些情況下可能會稍微影響效能。

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

結論:

GridView 和 FormView 的 ItemTemplate 中 Label 為何預設使用 Bind,而非用 Eval,不知道。 

但實際測試,Label的 Bind()可以改成 Eval(),"編輯" 運作正常。 

(完)

相關

[研究][ASP.NET][C#][WebForm]Server-Side Request Forgery (SSRF) 解決

[研究][ASP.NET][C#][WebForm]Server-Side Request Forgery (SSRF) 解決

2024-02-26

【問題】

Fortify SCA 報告有伺服器端請求偽造 (Server-side request forgery, SSRF)問題

HttpWebRequest req = (HttpWebRequest)WebRequest.Create
    ("https://www.google.com/recaptcha/api/siteverify?secret=6LemXqE&response=" + Response); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);  

https://vulncat.fortify.com/zh-tw/detail?id=desc.dataflow.java.server_side_request_forgery#C%23%2FVB.NET%2FASP.NET

Fortify SCA 報告

Abstract:

Create() 利用使用者控制的資料啟動與第三方系統的網路連線以存取資源 URI。由於要求源自應用程式伺服器內部 IP 位址,因而攻擊者可能代表應用程式伺服器利用此弱點傳送要求。

Explanation:

當攻擊者可以影響應用程式伺服器建立的網路連線時,就會發生 Server-Side Request Forgery。網路連線來自應用程式伺服器的內部 IP,因而攻擊者可以使用此連線略過網路控制措施,並掃描或攻擊原本未暴露的內部資源。

Recommendations:

切勿根據使用者控制的資料建立網路連線,並確保請求傳送至預期的目的地。如果建立目的地 URI 需要使用者資料,請使用間接方法:建立允許使用者指定的合法資源名稱的清單,並只允許使用者從清單中選取。使用此方法,使用者就不能直接輸入來指定資源名稱。

但在某些情況下,這種方法是不切實際的,因為這樣一份合法資源名稱太過於龐大或是太難以維護。在這些情況下,程式設計師通常會實作拒絕清單。在使用輸入資料前,拒絕清單會選擇性的拒絕或避開可能有危險的字元。不過,任何此類不安全字元清單可能都不完整,並且幾乎肯定會過期。一個更好的方法是建立字元清單。此清單會列出允許出現於資源名稱中的字元,並僅接受由核准集中的字元組成的輸入。

另外,如果需要,請確保使用者輸入僅用於指定目標系統上的資源,而 URI 架構、主機及連接埠由應用程式控制。這樣會大大減輕攻擊者可能造成的損害。

References:

[1] Alexander Polyakov, SSRF vs. Business critical applications, BlackHat 2012, http://media.blackhat.com/bh-us-12/Briefings/Polyakov/BH_US_12_Polyakov_SSRF_Business_Slides.pdf

[2] SSRF bible. Cheatsheet, ONSec Labs, https://docs.google.com/document/d/1v1TkWZtrhzRLy0bYXBcdLUedXGb9njTNIJXa3u9akHM/edit

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

【參考】

ASP.NET WebForm, 如何解決 HttpWebRequest req = (HttpWebRequest)WebRequest.Create 的 Server-side request forgery 問題

ChatGPT

要解決ASP.NET WebForms中的伺服器端請求偽造(Server-side request forgery,SSRF)問題,您可以採取下列措施:

1.輸入驗證和過濾:在使用使用者提供的URL之前,請務必進行嚴格的輸入驗證和過濾。 確保URL是有效的,且只包含您允許的協定和網域。

string userUrl = userInputTextBox.Text;
if (Uri.TryCreate(userUrl, UriKind.Absolute, out Uri validatedUri))
{
     if (validatedUri.Scheme == Uri.UriSchemeHttp || validatedUri.Scheme == Uri.UriSchemeHttps)
     {
         // 繼續處理請求
         HttpWebRequest req = (HttpWebRequest)WebRequest.Create(validatedUri);
         // 執行請求並處理回應
     }
     else
     {
         // 拒絕非HTTP/HTTPS協定的URL
         // 可以記錄或回報非法URL的嘗試
     }
}
else
{
     // 拒絕無效的URL
     // 可以記錄或回報無效URL的嘗試
}

2.白名單驗證:限制應用程式可以存取的URL範圍,只允許存取您信任的網域或URL。 這可以透過配置一個白名單列表來實現,只有列表中的URL才能被應用程式存取。

3,安全性配置:確保應用程式的伺服器和網路配置是安全的,防止應用程式發出惡意或未經授權的請求。 例如,防火牆和網路隔離可以幫助限制對不信任資源的存取。

4.權限控制:在可能的情況下,使用應用程式的身份驗證和授權機制來限制對敏感資源的存取。 確保只有經過身份驗證和授權的使用者才能執行敏感操作。

5.更新和監控:定期更新應用程式和相關的程式庫,以修復已知的安全漏洞,並監視應用程式的行為,以偵測潛在的惡意活動。

透過採取這些措施,您可以有效地減少ASP.NET WebForms應用程式中的伺服器端請求偽造問題的風險。

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

【解決】

Default.aspx.cs

string Response = Request["g-recaptcha-response"];
bool Valid = false;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create
("https://www.google.com/recaptcha/api/siteverify?secret=6Ldw&response=" + Response);
try
{
    //Google recaptcha Response
    using (WebResponse wResponse = req.GetResponse())
    {

        using (StreamReader readStream = new StreamReader(wResponse.GetResponseStream()))
        {
            string jsonResponse = readStream.ReadToEnd();

            JavaScriptSerializer js = new JavaScriptSerializer();
            MyObject data = js.Deserialize<MyObject>(jsonResponse);// Deserialize Json

            Valid = Convert.ToBoolean(data.success);
        }
    }

    return Valid;
}
catch (WebException ex)
{
    throw ex;
}

改為

Default.aspx.cs


// Fortify SCA 報告 HttpWebRequest req = (HttpWebRequest)WebRequest.Create 有 Server-Side Request Forgery (SSRF) 問題
#region === 處理 SSRF ===
//HttpWebRequest req = (HttpWebRequest)WebRequest.Create
//("https://www.google.com/recaptcha/api/siteverify?secret=6LdwoDsjAAAAAN0pQmRJEW0dtD0vOe6XTV6obAk0&response=" + Response);

HttpWebRequest req = null;
string googleReCaptchaUrl = "https://www.google.com/recaptcha/api/siteverify?secret=6Ldw&response=" + Response;
if (Uri.TryCreate(googleReCaptchaUrl, UriKind.Absolute, out Uri validatedUri))
{
    if (validatedUri.Scheme == Uri.UriSchemeHttp || validatedUri.Scheme == Uri.UriSchemeHttps)
    {
        // 繼續處理請求
        //HttpWebRequest req = (HttpWebRequest)WebRequest.Create(validatedUri);
        req = (HttpWebRequest)WebRequest.Create(validatedUri);
        // 執行請求並處理回應
    }
    else
    {
        Label_MSG1.Text = "拒絕非HTTP/HTTPS協定的URL";
        // 拒絕非HTTP/HTTPS協定的URL
        // 可以記錄或回報非法URL的嘗試
    }
}
else
{
    // 拒絕無效的URL
    Label_MSG1.Text = "拒絕無效的URL";
    // 可以記錄或回報無效URL的嘗試
}
#endregion === 處理 SSRF ===

try
{
    //Google recaptcha Response
    using (WebResponse wResponse = req.GetResponse())
    {

        using (StreamReader readStream = new StreamReader(wResponse.GetResponseStream()))
        {
            string jsonResponse = readStream.ReadToEnd();

            JavaScriptSerializer js = new JavaScriptSerializer();
            //MyObject data = js.Deserialize<MyObject>(jsonResponse);// Deserialize Json

            //Valid = Convert.ToBoolean(data.success);
        }
    }

    return Valid;
}
catch (WebException ex)
{
    throw ex;
}

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

(完)

相關

[研究]CSRF, SSRF, XSS 比較
https://shaurong.blogspot.com/2024/02/csrf-ssrf-xss.html

白名單
html - How to make a C# whitelist/BlackList - Stack Overflow
https://stackoverflow.com/questions/1442005/how-to-make-a-c-sharp-whitelist-blacklist

C# static code analysis | Vulnerability
https://rules.sonarsource.com/csharp/type/Vulnerability/RSPEC-5144

[研究]CSRF, SSRF, XSS 比較

[研究]CSRF, SSRF, XSS 比較

2024-02-27

CSRF, SSRF, XSS 比較

ChatGPT

CSRF(Cross-Site Request Forgery)、SSRF(Server-Side Request Forgery)和XSS(Cross-Site Scripting)是Web應用程式中常見的安全威脅,它們具有不同的特點和攻擊方式:

CSRF(跨站請求偽造):

  • 攻擊方式:CSRF攻擊利用了使用者的已認證會話,在使用者不知情的情況下執行非授權的操作。 攻擊者建構惡意請求並誘使受害者在受信任的網站上執行這些請求,從而利用使用者的身分來執行惡意操作。
  • 目標:攻擊目標是執行未經授權的操作,例如更改使用者密碼、發表文章或執行其他敏感操作。
  • 防禦:防禦CSRF攻擊的常用方法包括使用CSRF令牌、檢查Referer頭、使用雙重認證等。

SSRF(伺服器端請求偽造):

  • 攻擊方式:SSRF攻擊利用了伺服器端應用程式對外部資源的存取權限,透過操縱伺服器端的請求來發動針對內部網路或其他受信任資源的攻擊。
  • 目標:攻擊目標是利用伺服器的存取權限,例如存取內部系統、執行任意網路請求等。
  • 防禦:防禦SSRF攻擊的方法包括限制伺服器端應用程式的存取權限、白名單驗證輸入URL、檢查使用者提供的URL等。

XSS(跨站腳本攻擊):

  • 攻擊方式:XSS攻擊利用了網路應用程式對使用者輸入的信任,向受害者傳遞惡意腳本,並在受害者的瀏覽器上執行這些腳本,以竊取資訊、劫持會話或執行其他惡意操作。
  • 目標:攻擊目標是執行惡意腳本,以獲取敏感資訊或執行其他攻擊。
  • 防禦:防禦XSS攻擊的方法包括對使用者輸入進行正確的轉義和過濾、使用HTTPOnly和Secure標誌來設定cookie、採用內容安全策略(Content Security Policy)等。

雖然CSRF、SSRF和XSS都是網頁應用程式中的常見攻擊,但它們的目標、攻擊方式和防禦方法各不相同。 因此,開發人員和安全專家需要針對每種攻擊類型採取不同的防禦措施來保護應用程式的安全性。

定義利用使用者的身分在受信任網站上執行未授權操作。利用伺服器端應用程式對外部資源的存取權限。向使用者瀏覽器注入惡意腳本,以在使用者端執行。
攻擊目標利用使用者的身分執行未經授權的操作。利用伺服器的存取權限執行惡意操作。竊取使用者資訊、劫持會話或執行其他惡意操作。
攻擊方式利用受害者在受信任網站上的認證狀態。利用伺服器端應用程式對外部資源的存取。向受害者的瀏覽器注入惡意腳本。
防禦方法使用CSRF令牌、檢查Referer頭、雙重認證等。限制伺服器端應用程式的存取權限、白名單驗證URL等。轉義和過濾使用者輸入、使用HTTPOnly和Secure標誌、內容安全策略(CSP)等。


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

XSS 分成哪幾種 ?

ChatGPT

XSS(跨站腳本攻擊)可分為以下幾種常見類型:

反射型 XSS(Reflected XSS):

  • 攻擊方式:惡意腳本作為輸入的一部分傳遞給應用程序,然後在回應中反射回用戶,攻擊者誘使用戶點擊包含惡意腳本的連結或訪問特定的URL。
  • 特點:惡意腳本在用戶每次請求時都會反射回用戶,因此稱為「反射型」。

儲存型 XSS(Stored XSS):

  • 攻擊方式:惡意腳本被儲存在應用程式的資料庫或檔案系統中,當其他使用者存取包含惡意腳本的頁面時,惡意腳本都會被執行。
  • 特點:惡意腳本在伺服器上永久存儲,因此稱為「儲存型」。

DOM 型 XSS(DOM-based XSS):

  • 攻擊方式:惡意腳本透過修改頁面的DOM結構來執行攻擊,而不是利用伺服器端的回應。 攻擊成功取決於頁面中的客戶端腳本如何處理使用者輸入。
  • 特點:攻擊不會將惡意腳本傳送到伺服器,而是在用戶端中利用DOM操作執行攻擊。

這些不同類型的XSS攻擊方式都有其特徵和攻擊方式。 了解它們有助於開發人員和安全專家採取適當的防禦措施來保護網路應用程式免受XSS攻擊的影響。

特點反射型XSS儲存型XSSDOM型XSS
攻擊方式惡意腳本作為輸入的一部分傳遞給應用程序,然後在回應中反射回使用者。惡意腳本被儲存在應用程式的資料庫或檔案系統中。惡意腳本透過修改頁面的DOM結構來執行攻擊。
特點惡意腳本在使用者每次請求時都會反射回使用者。惡意腳本在伺服器上永久存儲,可被多個使用者觸發。攻擊不會將惡意腳本傳送到伺服器,而是在用戶端中利用DOM操作執行。
攻擊目標誘使使用者點擊包含惡意腳本的連結或造訪特定的URL。其他使用者造訪包含惡意腳本的頁面時,惡意腳本被執行。利用DOM操作執行攻擊,而不是利用伺服器端的回應。
防禦方法對使用者輸入進行正確的轉義和過濾,使用HTTPOnly和Secure標誌,內容安全策略(CSP)等。對使用者輸入進行正確的轉義和過濾,限制使用者輸入的長度和類型。對使用者輸入進行正確的轉義和過濾,避免直接在DOM中執行未經驗證的輸入。


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

2024年2月23日 星期五

[研究]伺服器端渲染、用戶端渲染、動態網站、靜態網站、動態網頁、靜態網頁

[研究]伺服器端渲染、用戶端渲染、動態網站、靜態網站、動態網頁、靜態網頁

2024-02-23

用表格,比較 伺服器端渲染?用戶端渲染?動態網站? 靜態網站?動態網頁?靜態網頁?

ChatGPT

"伺服器端渲染" 的英文是 "Server-Side Rendering"(SSR)。

"用戶端渲染" 的英文是 "Client-Side Rendering"(CSR)

下表將比較伺服器端渲染、客戶端渲染、動態網站、靜態網站、動態網頁和靜態網頁的特性:

特徵伺服器端渲染(SSR)客戶端渲染(CSR)動態網站靜態網站動態網頁靜態網頁
渲染位置伺服器端用戶端伺服器端/客戶端伺服器端伺服器端/客戶端伺服器端
頁面載入速度通常較快取決於客戶端裝置和網路取決於實作方式通常較快取決於實作方式通常較快
SEO有利需要特殊處理有利有利有利有利
使用者體驗首次載入速度快,但可能影響互動體驗首次載入速度慢,但互動體驗更流暢互動體驗更豐富頁面間切換較快互動體驗更豐富頁面間切換較快
更新與維護部分內容需要在伺服器端更新用戶端更新需要伺服器端維護頁面檔案更新需要伺服器端維護頁面檔案更新

伺服器端渲染和客戶端渲染是渲染方式的兩種不同方式,動態網站和靜態網站則是根據內容更新頻率的不同而區分,而動態網頁和靜態網頁則是在網站中頁面的類型區分。

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

"伺服器端渲染" 的英文是 "Server-Side Rendering"(SSR)。 的 Rendering 意義 ?

ChatGPT

"Rendering" 意指將資料轉換為視覺化的結果或呈現形式的過程。 在軟體開發領域,"Rendering" 通常指的是將資料轉換為使用者介面的視覺化表示,例如將網頁內容轉換為瀏覽器中顯示的頁面。 Rendering 過程可以包括佈局、樣式應用、圖像載入等步驟,以便將資料以最適合使用者理解的方式呈現出來。

在 "Server-Side Rendering"(SSR)中,"Rendering" 指的是伺服器端將動態資料轉換為 HTML 或其他標記語言的過程,然後將產生的頁面傳送到客戶端瀏覽器進行顯示。 這使得使用者在請求網頁時能夠立即看到頁面內容,而無需等待客戶端 JavaScript 載入和執行。

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

伺服器端彩現 - 維基百科,自由的百科全書

https://zh.wikipedia.org/zh-tw/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%B8%B2%E6%9F%93

SSR伺服器端彩現(英語:server side render)指一般情況下,一個web頁面的資料彩現完全由客戶端或者瀏覽器端來完成。先從伺服器請求,然後到頁面;再通過AJAX請求到頁面資料並把相應的資料填充到模板,形成完整的頁面來呈現給使用者。伺服器端彩現把資料的初始請求放在了伺服器端,伺服器端收到請求後,把資料填充到模板形成完整的頁面,由伺服器端把彩現的完整的頁面返回給客戶端。這樣減少了一次客戶端到伺服器端的HTTP請求,加快了相應速度,一般用於效能最佳化。

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

ASP.NET, HTML, JSP, PHP, Java, JavaScript, React, Node.js 是 服務器端渲染?客戶端渲染?動態網站?靜態網站?動態網頁?靜態網頁?

ChatGPT

這些技術可以在不同情況下用作服務器端渲染或客戶端渲染,動態網站或靜態網站,以及動態網頁或靜態網頁。 讓我來解釋一下:

  • ASP.NET、JSP、PHP 和 Java 是伺服器端技術,這意味著它們在伺服器上執行並產生 HTML,然後將其發送到客戶端瀏覽器。 它們通常用於動態網站,因為每次請求時,服務器都會根據用戶的需求產生新的 HTML 頁面。
  • HTML、JavaScript 和 CSS 是客戶端技術,這意味著它們在客戶端瀏覽器中運行。 
  • React 和 Node.js 可以在服務器端和客戶端都運行,因此它們可以用於服務器端渲染和客戶端渲染。
  • 靜態網站是指內容在網站部署後不會改變的網站,通常由純 HTML、CSS 和 JavaScript 檔案組成,不需要服務器端處理。 而動態網站是指內容會根據用戶的請求或其他條件而變化的網站,通常使用服務器端技術來產生內容。
  • 動態網頁是指內容在每次請求時都可能會改變的網頁,而靜態網頁是指內容在請求期間保持不變的網頁。

總的來說,這些技術可以用於多種場景,具體取決於您的需求和項目的特點。

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

請用表格呈現 

ChatGPT 

好的,這裡是一個表格,將這些技術按照服務器端渲染/客戶端渲染、動態網站/靜態網站、以及動態網頁/靜態網頁的特性進行了分類:

技術服務器端渲染/客戶端渲染動態網站/靜態網站動態網頁/靜態網頁
ASP.NET服務器端渲染動態網站動態網頁
HTML客戶端渲染靜態網站靜態網頁
JSP服務器端渲染動態網站動態網頁
PHP伺服器端渲染動態網站動態網頁
Java服務器端渲染動態網站動態網頁
JavaScript客戶端渲染靜態網站靜態網頁
React伺服器端渲染/客戶端渲染動態網站動態網頁
Node.js服務器端渲染/客戶端渲染動態網站動態網頁

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

node.js 是需要服務器端渲染的動態內容 ?

ChatGPT

Node.js 本身是一個執行 JavaScript 的運行時環境,通常用於構建伺服器端應用程序。它可以用於處理伺服器端的邏輯,包括動態生成內容、處理資料庫查詢、處理用戶請求等。

Node.js 本身並不提供伺服器端渲染,但可以與其他技術結合,實現伺服器端渲染的功能。例如,可以使用 Node.js 與 React 框架結合,使用像 Next.js 這樣的庫實現伺服器端渲染。這樣的組合可以讓你在伺服器端動態生成 React 組件,然後將其作為 HTML 發送到瀏覽器,從而實現伺服器端渲染的效果。

總的來說,雖然 Node.js 本身不是伺服器端渲染的技術,但可以作為伺服器端應用程序的運行環境,與其他技術結合,實現動態內容的伺服器端渲染。

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

react 是需要服務器端渲染的動態內容 ?

ChatGPT

React 本身是一個用於構建用戶界面的 JavaScript 庫,通常用於構建動態的單頁應用程序(SPA)。在傳統的單頁應用程序中,React 是在用戶端運行的,它將應用程序的界面渲染到瀏覽器中,並與用戶進行交互。

雖然 React 可以在用戶端運行,但對於某些情況下,伺服器端渲染(SSR)是很有用的。伺服器端渲染可以改善首次加載時間,尤其是對於搜索引擎優化(SEO)和首次加載性能方面有很大的幫助。通過伺服器端渲染,可以在伺服器上生成應用程序的初始 HTML,然後將其發送到瀏覽器。這樣,用戶在下載 HTML 時就會看到完整的頁面,而不需要等待 JavaScript 下載並運行。

因此,雖然 React 可以在用戶端渲染,但在某些情況下,例如對於需要更好的首次加載性能或 SEO 的應用程序,使用伺服器端渲染是有益的。在這種情況下,React 可以被用於伺服器端渲染動態內容。

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

ASP.NET WebForm Web Application 是需要服務器端渲染的動態內容 ?

ChatGPT

ASP.NET WebForms 是一種用於建立 Web 應用程式的技術框架,它基於伺服器端的頁面生命週期和事件模型。 WebForms 應用程式通常是伺服器端渲染的,這表示頁面的內容是在伺服器上動態產生並傳送到客戶端的。 在 WebForms 中,伺服器端程式碼可以用來產生動態內容,並在頁面生命週期的不同階段執行邏輯。

因此,ASP.NET WebForms Web 應用程式通常涉及服務器端渲染的動態內容。 在頁面中,你可以使用伺服器控制項、伺服器端程式碼和事件模型來動態產生 HTML 內容,以回應使用者的請求和互動。

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

PHP 是需要服務器端渲染的動態內容 ?

ChatGPT

是的,PHP 是一種伺服器端腳本語言,用於開發動態網站和 Web 應用程式。 在 PHP 中,程式碼在伺服器上執行,然後產生 HTML 內容,最終將其傳送到客戶端的瀏覽器進行顯示。 因此,PHP 通常用於服務器端渲染動態內容。

PHP 可以與 HTML 混合使用,以便在頁面中嵌入動態內容。 透過在 HTML 中嵌入 PHP 程式碼,可以實現諸如從資料庫檢索資料、處理表單提交、產生動態頁面內容等功能。 這使得 PHP 成為開發動態網站和 Web 應用程式的強大工具。

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

(完)

2024年2月20日 星期二

[研究]Windows Update - SQL Server 2019 的累積更新 25 (CU25)

[研究]Windows Update - SQL Server 2019 的累積更新 25 (CU25)

2024-02-20

KB5033688 - SQL Server 2019 的累積更新 25
https://learn.microsoft.com/zh-tw/troubleshoot/sql/releases/sqlserver-2019/cumulativeupdate25

KB5033688 - Cumulative Update 25 for SQL Server 2019
https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2019/cumulativeupdate25




(完)

[研究]ASP.NET WebForm 用 ClosedXML 匯出 CSV ANSI 和 CSV UTF-8 ( .csv)(逗號分隔檔)

[研究]ASP.NET WebForm 用 ClosedXML 匯出 CSV ANSI 和 CSV UTF-8 ( .csv)(逗號分隔檔)

2024-02-20

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

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

逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其檔案以純文字形式儲存表格資料(數字和文字)。

https://zh.wikipedia.org/zh-tw/%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E5%80%BC

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

請問 CSV ANSI 和 CSV UTF-8 的演變 ?

ChatGPT

CSV(逗號分隔值)是一種常見的檔案格式,用於存儲表格數據,其中每行表示表格中的一行,並使用逗號分隔每個字段。CSV ANSI 和 CSV UTF-8 是兩種不同的 CSV 檔案格式,主要是關於字符編碼方面的區別。

CSV ANSI:

ANSI 是一種字符編碼方案,通常僅支援基本的拉丁字母、數字和符號,無法支援全球各種語言的字符。它可能受到不同操作系統和地區的限制。

CSV ANSI 格式的檔案使用 ANSI 字符編碼,這意味著它只能支援有限的字符集,如果在檔案中使用了非 ANSI 字符,可能會出現亂碼或者無法正確顯示的情況。

CSV UTF-8:

UTF-8 是一種字符編碼方案,支援世界上幾乎所有的字符,包括拉丁字母、漢字、西里爾字母等。它是一種Unicode編碼方式,使得不同語言的字符都能夠被正確地表示和處理。

CSV UTF-8 格式的檔案使用UTF-8字符編碼,因此可以支援更廣泛的字符集,而且可以確保跨不同系統和平台的兼容性。

演變方面,隨著全球化的發展和對字符支援的需求增加,越來越多的系統和軟件開始使用 UTF-8 字符編碼,因此,儘管在過去可能會遇到 CSV ANSI 格式的檔案,但現在更常見的是使用 CSV UTF-8 格式,以確保兼容性和支援更廣泛的字符集。

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

ASP.NET WebForm WebApplication 

using ClosedXML.Excel;
using System.Text;

protected void GenerateCSV_ANSI()
{
    var wb = new XLWorkbook();
    var ws = wb.Worksheets.Add("Sheet1");

    // 假設 data 是你要寫入 CSV 的資料
    var data = new List<List<string>>
    {
        new List<string> { "Column1", "Column2", "Column3" },
        new List<string> { "Value1", "Value2", "Value3" },
        // 添加更多的資料行...
    };

    // 將資料寫入工作表
    for (int i = 0; i < data.Count; i++)
    {
        for (int j = 0; j < data[i].Count; j++)
        {
            ws.Cell(i + 1, j + 1).Value = data[i][j];
        }
    }

    // 將工作簿另存為 CSV 檔案,使用 ANSI 編碼
    var encoding = Encoding.GetEncoding("Windows-1252"); // ANSI 編碼
    wb.SaveAs("output_ansi.csv", new SaveOptions { EvaluateFormulasBeforeSaving = false, Encoding = encoding });

    // 將工作簿另存為 CSV 檔案,使用 UTF-8 編碼
    // wb.SaveAs("output_utf8.csv", new SaveOptions { EvaluateFormulasBeforeSaving = false, Encoding = Encoding.UTF8 });
}


主要的差異在於另存為 CSV 時指定的編碼。對於 CSV ANSI,使用的是 Windows-1252 編碼,這是一種常見的 ANSI 編碼。而對於 CSV UTF-8,則使用 UTF-8 編碼,這是一種支援更廣泛字符集的 Unicode 編碼。

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

(完)

相關

[研究][ASP.NET][WebForm] 匯出寫入 .csv
https://shaurong.blogspot.com/2021/02/aspnet-csv.html

[研究]ASP.NET WebForm 用 ClosedXML 匯出 CSV ANSI 和 CSV UTF-8 ( .csv)(逗號分隔檔)https://shaurong.blogspot.com/2024/02/aspnet-webform-closedxml-csv-ansi-csv.html


[研究]Windows 內置 服務 帳號 有哪些 ? 差異 ?

[研究]Windows 內置 服務 帳號 有哪些 ? 差異 ?

2024-02-20

ChatGPT

Windows 內建的服務帳號通常用於執行Windows服務。 這些帳戶具有特定的權限和存取級別,以便服務可以在系統上執行其功能。 以下是一些常見的Windows內建服務帳號:

Local Service(本機服務):這是一個內建帳戶,用於在本機電腦上執行服務。 它有一些限制,例如只能在本機上存取資源。

Network Service(網路服務):與本機服務類似,但允許服務存取網路資源。

Local System(本機系統):這是一個高權限的帳戶,具有本機系統上的完全存取權限。 許多Windows服務使用這個帳戶來運行,因為它擁有廣泛的權限。

User Accounts(使用者帳戶):除了內建的服務帳戶外,還可以使用一般使用者帳戶來執行服務。 這種做法可以增加安全性,因為服務的權限將受到限制,但也可能會限制其功能。

這些帳戶之間的主要區別在於它們的權限等級和範圍。 Local Service和Network Service是專門用於執行服務的帳戶,而Local System帳戶則擁有較高的權限,可以存取本機系統上的所有資源。 使用一般使用者帳戶執行服務可以提高安全性,但可能會限制服務的功能,因為一般使用者帳戶具有較少的權限。

(下圖)照「登入身分」排序






(完)

2024年2月19日 星期一

[研究]伺服器憑證-申請時填寫的「組織單位」沒顯示,顯示 "<不是憑證的一部份>"

[研究]伺服器憑證-申請時填寫的「組織單位」沒顯示,顯示 "<不是憑證的一部份>"

2024-02-19

環境:Windows Server 2019 繁體中文標準版

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

用 IIS 做伺服器憑證請求檔 ( Server Certificate Request File ) 時,組織 和 組織單位 是必填的。(用其他工具或方式,或許可以不用填寫,不確定、敝人不會、沒研究)

組織Organize Name, O

組織單位 Organizational Unit, OU



********************************************************************************
實際申請出來,下載、結合、具完整憑證鏈結的伺服器憑證,用瀏覽器檢視一下





(下圖) FireFox


(下圖) IIS 或 MMC 去看

********************************************************************************
(下圖) 找一張早期的憑證,用 IE ( Internet Explorer 11 ) 去看,是有 OU 組織單位的


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

僅記錄現況,具體原因是政策?核發單位?軟體?方法?不知道。

(完)


2024年2月8日 星期四

[研究]ASP.NET 網頁正常顯示,但用 Chrome, FireFox 列印成 pdf 時,部分文字重疊顯示,可能的原因?

[研究]ASP.NET 網頁正常顯示,但用 Chrome, FireFox 列印成 pdf 時,部分文字重疊顯示,可能的原因?

2024-02-08

如果

網頁A 在 Chrome 和 FireFox 都正常顯示,列印成 pdf 時,Chrome 正常,FireFox 文字重疊;

網頁B 在 Chrome 和 FireFox 都正常顯示,列印成 pdf 時,Chrome 文字重疊,FireFox 正常;

網頁C 在 Chrome 和 FireFox 都正常顯示,列印成 pdf 時,Chrome 文字重疊,FireFox 文字重疊;

網頁D 在 Chrome 和 FireFox 都正常顯示,列印成 pdf 時,Chrome 正常,FireFox  正常;

也就是 ASP.NET 網頁在瀏覽器都正常顯示,但用瀏覽器內建列印成 pdf 功能,不一定正常或不正常,比較可能原因? 解決方法?

ChatGPT

當 ASP.NET 網頁在不同瀏覽器中都正常顯示,但在使用瀏覽器內建的列印成 PDF 功能時出現不一致的情況,可能的原因和解決方法如下:

可能的原因:

  • PDF 轉換引擎差異:不同瀏覽器使用不同的 PDF 轉換引擎來處理列印成 PDF 的功能。這些引擎可能在處理某些 CSS 或 HTML 元素時存在差異,導致在某些情況下文字重疊或排版錯誤。
  • 瀏覽器版本差異:不同版本的瀏覽器可能會使用不同的 PDF 轉換引擎,這可能導致在某些版本的瀏覽器中出現文字重疊或排版錯誤。
  • CSS 或 HTML 問題:雖然網頁在瀏覽器中正常顯示,但可能存在某些 CSS 或 HTML 元素在列印成 PDF 時的兼容性問題,導致文字重疊或排版錯誤。

解決方法:

  • 使用專業的 PDF 轉換工具:對於要求精確的列印成 PDF 功能,可以考慮使用專業的 PDF 轉換工具,而不是依賴瀏覽器的內建功能。這些工具通常具有更強大的轉換引擎,可以處理更多種類的 CSS 和 HTML 元素,從而獲得更好的結果。
  • 檢查 CSS 和 HTML:檢查網頁中的 CSS 和 HTML,確保它們在列印成 PDF 時能夠正確顯示。可以嘗試移除一些可能導致問題的 CSS 樣式或 HTML 元素,以查看是否能解決問題。
  • 測試不同瀏覽器版本:如果可能,可以在不同版本的瀏覽器中進行測試,看看是否有特定版本的瀏覽器存在問題。如果是特定版本的問題,可以考慮升級或降級瀏覽器版本。
  • 向 ASP.NET 社區尋求幫助:在 ASP.NET 社區中尋求幫助,看看是否有其他開發者遇到過類似的問題,或者是否有相關的解決方案或建議。

通常情況下,結合以上方法,可以找到解決問題的方案。

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

這是瀏覽器的 Bug ?

ChatGPT

在某些情況下,這可能是瀏覽器的 bug,導致列印成 PDF 時文字重疊或排版錯誤。瀏覽器可能會在處理特定的 CSS 或字型時出現問題,導致列印結果不正確。

如果你確信這是瀏覽器的問題,可以考慮向相應的瀏覽器開發者團隊報告這個問題,通常他們會對於用戶提出的問題做出回應並修復相應的 bug。另外,你也可以在網絡上搜索看看是否有其他使用者遇到了相同的問題,有時候會找到一些暫時的解決方案或者工作回避方法。

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

(完)

2024年2月6日 星期二

[研究]SQL Server,資料庫 'MyDb' 還原失敗。

[研究]SQL Server,資料庫 'MyDb' 還原失敗。

2024-02-06

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

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



===================================

資料庫 'MyDB' 還原失敗。 (Microsoft.SqlServer.Management.RelationalEngineTasks)

------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.RelationalEngineTasks.RestoreDatabaseTaskFormComponent.PerformTask(ITaskExecutionContext context)
   於 Microsoft.SqlServer.Management.RelationalEngineTasks.RestoreDatabaseTaskFormComponent.Perform(ITaskExecutionContext context)
   於 Microsoft.SqlServer.Management.TaskForms.TaskExecutionManager.ExecuteTaskSequence(ISfcScriptCollector collector)

===================================

Microsoft.Data.SqlClient.SqlError: 檔案 "NccstDB_Data" 無法在現有的 "D:\DATABASE\MyDB.mdf" 上還原。請使用 WITH REPLACE 重新發出陳述式,以便覆寫已存在的檔案,或者使用 WITH MOVE 來識別替代位置。 (Microsoft.SqlServer.SmoExtended)

------------------------------
如需說明,請按一下: https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.200.48053.0&LinkId=20476

------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.Smo.RestorePlan.Execute()
   於 Microsoft.SqlServer.Management.RelationalEngineTasks.RestoreDatabaseTaskFormComponent.PerformTask(ITaskExecutionContext context)



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

解決:

有可能剛才操作太快,「選項」的「覆寫現有的資料庫 (WITH REPLACE)」沒勾選到。




(完)

相關

2024年2月5日 星期一

[研究]T-SQL, SQL Server, FieldA 欄位相同時,選擇出 UpdateDateTime 欄位最新的一筆

[研究]T-SQL, SQL Server,   FieldA 欄位相同時,選擇出 UpdateDateTime 欄位最新的一筆

2024-02-05

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

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

T-SQL, SQL Server, 當 FieldA 欄位值為 abc 時,選擇出 UpdateDateTime 欄位最新的一筆

xxxxx
SELECT *
FROM YourTable
WHERE FieldA = 'abc'
AND UpdateDateTime = (
     SELECT MAX(UpdateDateTime)
     FROM YourTable
     WHERE FieldA = 'abc'
)

T-SQL, SQL Server,   FieldA 欄位相同時,選擇出 UpdateDateTime 欄位最新的一筆

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY FieldA ORDER BY UpdateDateTime DESC) AS RowNum
    FROM YourTable
) AS Ranked
WHERE RowNum = 1;


在這個查詢中,ROW_NUMBER()函數會為每個 FieldA 分組中的記錄指派一個行號,依照 UpdateDateTime 降序排序。 然後外部查詢選取每個分組中行號為 1 的記錄,這些記錄就是每個 FieldA 值中最新的記錄。

(完)

相關

2024年2月3日 星期六

[研究]GCB 套用與 Windows 遠端桌面影響

 [研究]GCB 套用與 Windows 遠端桌面影響

2024-02-03

根據這篇,好像已經先某種程度放行 Windows 遠端桌面

[研究]GCB,Windows 2019、2022 Common 排除評估
https://shaurong.blogspot.com/2024/01/gcbwindows-20192022-common.html

根據這篇,是會影響的

[研究][GCB]遠端桌面連線出現「系統管理員已限制您可以使用的登入類型 (網路或互動式)。」https://shaurong.blogspot.com/2020/07/gcb.html

根據 Client 端畫面,Windows "服務" 為  "Remote Desktop Services" 或 "Remote Desktop Services UserMode Port Redirector",登入身分 是 Local System,使用 "本機系統帳戶",而非 "這個帳戶",似乎沒受到影響,敝人沒有 Server 端權限,無法進一步確認。



(完)

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項https://shaurong.blogspot.com/2024/02/gcb-gcb-ad-domain-lgpoexe-gcb-gpo.html

[研究]GCB套用前後,Windows「帳戶原則」(密碼原則、帳戶鎖定原則)對比
https://shaurong.blogspot.com/2024/02/gcbwindows.html

[研究]GCB套用前後,「本機原則」(稽核原則、使用者權限指派、安全性原則)對比
https://shaurong.blogspot.com/2024/02/gcb.html

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響
https://shaurong.blogspot.com/2024/02/gcb-splunk-serversplunk-universal.html

[研究]GCB 套用與 ArcSight 影響
https://shaurong.blogspot.com/2024/02/gcb-arcsight.html

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響
https://shaurong.blogspot.com/2024/02/gcb-trend-micro-deep-security-agent-dsa.html

[研究]GCB 套用與 EDR 影響
https://shaurong.blogspot.com/2024/02/gcb-edr.html

[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響
https://shaurong.blogspot.com/2024/02/gcb-vans.html

 [研究]GCB 套用與 Windows 遠端桌面影響
https://shaurong.blogspot.com/2024/02/gcb-windows.html

[研究][GCB]遠端桌面連線出現「系統管理員已限制您可以使用的登入類型 (網路或互動式)。」https://shaurong.blogspot.com/2020/07/gcb.html

[研究][GCB]AD (Active Directory) 您嘗試連線的遠端電腦需要網路層級的驗證(NLA),但無法聯絡您的 Windows 網域控制站以執行 NLA。
https://shaurong.blogspot.com/2022/09/gcbad-active-directory-nla-windows-nla.html


[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響

[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響

2024-02-03

根據這篇,似乎並沒有特別處理 Splunk

[研究]GCB,Windows 2019、2022 Common 排除評估
https://shaurong.blogspot.com/2024/01/gcbwindows-20192022-common.html

根據 Client 端畫面,Windows "服務" 為  Win-Win7 Commander,登入身分 是 Local System,使用 "本機系統帳戶",而非 "這個帳戶",似乎沒受到影響,敝人沒有 Server 端權限,無法進一步確認。



(完)

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項https://shaurong.blogspot.com/2024/02/gcb-gcb-ad-domain-lgpoexe-gcb-gpo.html

[研究]GCB套用前後,Windows「帳戶原則」(密碼原則、帳戶鎖定原則)對比
https://shaurong.blogspot.com/2024/02/gcbwindows.html

[研究]GCB套用前後,「本機原則」(稽核原則、使用者權限指派、安全性原則)對比
https://shaurong.blogspot.com/2024/02/gcb.html

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響
https://shaurong.blogspot.com/2024/02/gcb-splunk-serversplunk-universal.html

[研究]GCB 套用與 ArcSight 影響
https://shaurong.blogspot.com/2024/02/gcb-arcsight.html

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響
https://shaurong.blogspot.com/2024/02/gcb-trend-micro-deep-security-agent-dsa.html

[研究]GCB 套用與 EDR 影響
https://shaurong.blogspot.com/2024/02/gcb-edr.html

[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響
https://shaurong.blogspot.com/2024/02/gcb-vans.html



[研究]GCB 套用與 EDR 影響

[研究]GCB 套用與 EDR 影響

2024-02-03

根據這篇,似乎並沒有特別處理 Splunk

[研究]GCB,Windows 2019、2022 Common 排除評估
https://shaurong.blogspot.com/2024/01/gcbwindows-20192022-common.html

根據 Client 端畫面,Windows "服務" 為  ThreatSonar,登入身分 是 Local System,使用 "本機系統帳戶",而非 "這個帳戶",似乎沒受到影響,敝人沒有 EDR Server 權限,無法進一步確認。




(完)

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項https://shaurong.blogspot.com/2024/02/gcb-gcb-ad-domain-lgpoexe-gcb-gpo.html

[研究]GCB套用前後,Windows「帳戶原則」(密碼原則、帳戶鎖定原則)對比
https://shaurong.blogspot.com/2024/02/gcbwindows.html

[研究]GCB套用前後,「本機原則」(稽核原則、使用者權限指派、安全性原則)對比
https://shaurong.blogspot.com/2024/02/gcb.html

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響
https://shaurong.blogspot.com/2024/02/gcb-splunk-serversplunk-universal.html

[研究]GCB 套用與 ArcSight 影響
https://shaurong.blogspot.com/2024/02/gcb-arcsight.html

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響
https://shaurong.blogspot.com/2024/02/gcb-trend-micro-deep-security-agent-dsa.html

[研究]GCB 套用與 EDR 影響
https://shaurong.blogspot.com/2024/02/gcb-edr.html


[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響

2024-02-03

根據這篇,似乎並沒有特別處理 Splunk

[研究]GCB,Windows 2019、2022 Common 排除評估
https://shaurong.blogspot.com/2024/01/gcbwindows-20192022-common.html

根據 Client 端畫面,Windows "服務" 為  Trend Micro Deep Security Agent 等數個,登入身分 是 Local System,使用 "本機系統帳戶",而非 "這個帳戶",似乎沒受到影響,敝人沒有 Deep Security Server  權限,無法進一步確認。


(完)

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項https://shaurong.blogspot.com/2024/02/gcb-gcb-ad-domain-lgpoexe-gcb-gpo.html

[研究]GCB套用前後,Windows「帳戶原則」(密碼原則、帳戶鎖定原則)對比
https://shaurong.blogspot.com/2024/02/gcbwindows.html

[研究]GCB套用前後,「本機原則」(稽核原則、使用者權限指派、安全性原則)對比
https://shaurong.blogspot.com/2024/02/gcb.html

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響
https://shaurong.blogspot.com/2024/02/gcb-splunk-serversplunk-universal.html

[研究]GCB 套用與 ArcSight 影響
https://shaurong.blogspot.com/2024/02/gcb-arcsight.html

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響
https://shaurong.blogspot.com/2024/02/gcb-trend-micro-deep-security-agent-dsa.html

[研究]GCB 套用與 EDR 影響
https://shaurong.blogspot.com/2024/02/gcb-edr.html

[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響
https://shaurong.blogspot.com/2024/02/gcb-vans.html

 [研究]GCB 套用與 Windows 遠端桌面影響
https://shaurong.blogspot.com/2024/02/gcb-windows.html

[研究][GCB]遠端桌面連線出現「系統管理員已限制您可以使用的登入類型 (網路或互動式)。」https://shaurong.blogspot.com/2020/07/gcb.html

[研究][GCB]AD (Active Directory) 您嘗試連線的遠端電腦需要網路層級的驗證(NLA),但無法聯絡您的 Windows 網域控制站以執行 NLA。
https://shaurong.blogspot.com/2022/09/gcbad-active-directory-nla-windows-nla.html




[研究]GCB 套用與 ArcSight 影響

[研究]GCB 套用與 ArcSight 影響

2024-02-03

根據這篇,似乎並沒有特別處理 Splunk

[研究]GCB,Windows 2019、2022 Common 排除評估
https://shaurong.blogspot.com/2024/01/gcbwindows-20192022-common.html

ArcSight ESM 是專為現代SOC 打造的下一代SIEM。 

Server 端是 ArcSight Enterprise Security Manager (ESM)

Client 端是 ArcSight Connector

根據 Client 端畫面,Windows "服務" 為 ArcSght Microsoft Windows Event Log - Native,登入身分 是 Local System,使用 "本機系統帳戶",而非 "這個帳戶",似乎沒受到影響,敝人沒有 ArcSight ESM 權限,無法進一步確認。



(完)

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項https://shaurong.blogspot.com/2024/02/gcb-gcb-ad-domain-lgpoexe-gcb-gpo.html

[研究]GCB套用前後,Windows「帳戶原則」(密碼原則、帳戶鎖定原則)對比
https://shaurong.blogspot.com/2024/02/gcbwindows.html

[研究]GCB套用前後,「本機原則」(稽核原則、使用者權限指派、安全性原則)對比
https://shaurong.blogspot.com/2024/02/gcb.html

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響
https://shaurong.blogspot.com/2024/02/gcb-splunk-serversplunk-universal.html

[研究]GCB 套用與 ArcSight 影響
https://shaurong.blogspot.com/2024/02/gcb-arcsight.html

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響
https://shaurong.blogspot.com/2024/02/gcb-trend-micro-deep-security-agent-dsa.html

[研究]GCB 套用與 EDR 影響
https://shaurong.blogspot.com/2024/02/gcb-edr.html

[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響
https://shaurong.blogspot.com/2024/02/gcb-vans.html

 [研究]GCB 套用與 Windows 遠端桌面影響
https://shaurong.blogspot.com/2024/02/gcb-windows.html

[研究][GCB]遠端桌面連線出現「系統管理員已限制您可以使用的登入類型 (網路或互動式)。」https://shaurong.blogspot.com/2020/07/gcb.html

[研究][GCB]AD (Active Directory) 您嘗試連線的遠端電腦需要網路層級的驗證(NLA),但無法聯絡您的 Windows 網域控制站以執行 NLA。
https://shaurong.blogspot.com/2022/09/gcbad-active-directory-nla-windows-nla.html


[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響

2024-02-03

根據這篇,似乎並沒有特別處理 Splunk

[研究]GCB,Windows 2019、2022 Common 排除評估
https://shaurong.blogspot.com/2024/01/gcbwindows-20192022-common.html

敝人 Splunk Server 架設在 Linux,Agent 安裝於 Windows,

檢查 Splunk Universal Forwarder 使用的 Windows "服務",使用帳號是 Local System,並沒有使用 "這個帳戶",檢查 Splunk Server (Linux 上),隔了數天,仍有資料回傳,故 GCB 套用沒影響到。


(下圖) gpedit.msc 畫面


(下圖)檢查 Splunk Server (Linux 上),隔了數天,仍有資料回傳,故 GCB 套用沒影響到。

(完)

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項https://shaurong.blogspot.com/2024/02/gcb-gcb-ad-domain-lgpoexe-gcb-gpo.html

[研究]GCB套用前後,Windows「帳戶原則」(密碼原則、帳戶鎖定原則)對比
https://shaurong.blogspot.com/2024/02/gcbwindows.html

[研究]GCB套用前後,「本機原則」(稽核原則、使用者權限指派、安全性原則)對比
https://shaurong.blogspot.com/2024/02/gcb.html

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響
https://shaurong.blogspot.com/2024/02/gcb-splunk-serversplunk-universal.html

[研究]GCB 套用與 ArcSight 影響
https://shaurong.blogspot.com/2024/02/gcb-arcsight.html

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響
https://shaurong.blogspot.com/2024/02/gcb-trend-micro-deep-security-agent-dsa.html

[研究]GCB 套用與 EDR 影響
https://shaurong.blogspot.com/2024/02/gcb-edr.html

[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響
https://shaurong.blogspot.com/2024/02/gcb-vans.html

 [研究]GCB 套用與 Windows 遠端桌面影響
https://shaurong.blogspot.com/2024/02/gcb-windows.html

[研究][GCB]遠端桌面連線出現「系統管理員已限制您可以使用的登入類型 (網路或互動式)。」https://shaurong.blogspot.com/2020/07/gcb.html

[研究][GCB]AD (Active Directory) 您嘗試連線的遠端電腦需要網路層級的驗證(NLA),但無法聯絡您的 Windows 網域控制站以執行 NLA。
https://shaurong.blogspot.com/2022/09/gcbad-active-directory-nla-windows-nla.html


[研究]SQL Server 刪除帳號失敗 (登入 'sa2' 的 卸除 失敗。)

[研究]SQL Server 刪除帳號失敗 (登入 'sa2' 的 卸除 失敗。)

2024-02-01

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

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






===================================

登入 'sa2' 的 卸除 失敗。  (Microsoft.SqlServer.Smo)

------------------------------
如需說明,請按一下: https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.200.48053.0&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=卸除+Login&LinkId=20476

------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.DropImpl(Boolean isDropIfExists, Boolean handleSevereError)
   於 Microsoft.SqlServer.Management.Smo.Login.Drop()
   於 Microsoft.SqlServer.Management.SqlManagerUI.DropObjects.DoDropObject(Int32 objectRowIndex)
   於 Microsoft.SqlServer.Management.SqlManagerUI.DropObjects.DropAllObjects(Boolean stopOnError)

===================================

執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo)

------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType, Boolean retry)
   於 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands, ExecutionTypes executionType, Boolean retry)
   於 Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection queries, Boolean retry)
   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.ExecuteNonQuery(StringCollection queries, Boolean includeDbContext, Boolean executeForAlter)
   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.DropImplWorker(Urn& urn, Boolean isDropIfExists)
   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.DropImpl(Boolean isDropIfExists, Boolean handleSevereError)

===================================

此登入是 1 項作業的擁有者。卸除此登入之前您必須先刪除或重新指派這些作業。 (Framework Microsoft SqlClient Data Provider)

------------------------------
如需說明,請按一下: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-15170-database-engine-error

------------------------------
伺服器名稱: .
錯誤號碼: 15170
嚴重性: 16
狀態: 1
行號: 2


------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException)
   於 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType, Boolean retry)

這個連結已經不存在,導向到別的網頁

https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.200.48053.0&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=卸除+Login&LinkId=20476
404 - 找不到頁面
https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-15170-database-engine-error

********************************************************************************
ChatGPT
這個錯誤訊息顯示您嘗試刪除一個登入 (Login),但該登入是某些作業的擁有者。在卸除此登入之前,您需要先刪除或重新指派這些作業。
解決方法通常是透過以下步驟進行:
  1. 確認登入所擁有的作業:您需要查詢登入所擁有的作業,以確定它們是什麼以及如何處理它們。
  2. 重新指派或刪除作業:一旦您知道登入擁有的作業,您可以將這些作業重新指派給其他登入或刪除它們(如果它們不再需要)。
  3. 再次嘗試刪除登入:完成上述步驟後,您應該能夠成功刪除該登入。
在執行上述步驟之前,請務必進行備份和確認,以免不小心刪除重要的作業或登入。此外,您可能需要具有相應權限的帳戶才能執行這些操作。
********************************************************************************
如何 "確認登入所擁有的作業" ?
ChatGPT
要確認登入所擁有的作業,您可以執行以下步驟:
1.查詢系統目錄表:使用系統目錄表查詢與登入相關的作業。在 SQL Server 中,系統目錄表存儲了有關伺服器物件的信息,包括登入、作業、角色等。
USE YourDatabaseName;
SELECT * FROM sys.database_principals WHERE type IN ('S', 'U');
這將列出所有 SQL Server 登入和使用者,以及它們的相關資訊,例如名稱、類型等。
敝人:注意 sid 欄位

2.查詢作業:查詢作業表,找出屬於該登入的作業。
USE msdb;
SELECT * FROM sysjobs WHERE owner_sid = (SELECT sid FROM sys.database_principals WHERE name = 'YourLoginName');
這將列出所有屬於特定登入的作業,您可以檢查這些作業的名稱和其他屬性。
敝人:物件名稱 'sysjobs' 無效 (這要 msdb 資料庫才有);資料行名稱 'owner_sid' 無效
敝人:實際檢查 sa2 的 SELECT 是 0 筆

3.檢查 SQL Server 代理工作:如果作業是使用 SQL Server 代理管理的,您還可以查詢 SQL Server 代理工作表。
USE msdb;
SELECT * FROM dbo.sysjobs WHERE owner_sid = (SELECT sid FROM sys.database_principals WHERE name = 'YourLoginName');
這將列出在 SQL Server 代理中屬於該登入的作業。

通過這些查詢,您應該能夠找到與該登入相關的作業,並決定是否重新指派它們或刪除它們。
********************************************************************************
列出某帳號所有作業
USE msdb;
SELECT j.name AS JobName
FROM dbo.sysjobs j
INNER JOIN master.dbo.syslogins l ON j.owner_sid = l.sid
WHERE l.name = 'YourLoginName';


發現是「維護計畫」的「子計畫」是 sa2 帳號相關,所以 sa2 帳號無法刪除。

MaintenancePlan2.Subplan_1

可參考這篇處理,後來 sa2 就順利砍掉了。

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html


(完)

相關

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決

2024-02-03

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

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

(下圖)Click「維護計畫」下方的 計畫,預設是 MaintenancePlan, MaintenancePlan1, MaintenancePlan2 這一類,選「管理連結」下拉選單,選「本機伺服器連結」 


(下圖)可以看到是用 sa 帳號去執行該筆維護計畫,可以換個存在且可用的帳號

(下圖) 可改選「使用 Windows NT 整合式安全性」來啟動 SQL Server Agent 服務,來執行維護計畫。

註:曾碰過選「使用 Windows NT 整合式安全性」,按下「確定」後失敗的情況,查到後來發現是因為 Windows hostname 曾經修改過,把 Windows hostname 改回去,reboot 後,再次變更成功。


另一種方式不修改 Windows hostname,而是修改 SQL Server 中紀錄的 ServerName,讓它和 Windows hostname 相同,參考:

[研究][SQL Server 2017]伺服器層級的 Urn 篩選無效;變更 SQL Server 的 ServerName
https://shaurong.blogspot.com/2018/10/sql-server-2017-urn.html

(完)

相關

[研究]SQL Server 2019 "維護計畫" 的 "維護清除工作" 的 "副檔名" 應設定為 bak 還是 .bak ?

[研究]SQL Server 2019 "維護計畫" 的 "維護清除工作"  的 "副檔名" 應設定為 bak 還是 .bak ?

2024-02-03


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

SQL Server "維護計畫" 的 "維護清除工作"  的 "副檔名" 應設定為 bak 還是 .bak ?

ChatGPT

在 SQL Server 的 "維護計畫" 中,通常是將 "維護清除工作" 中的副檔名設定為 .bak。這是因為在檔案系統中,副檔名通常是以.開頭的,因此.bak表示一個以.bak結尾的檔案。

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

User

如果 .bak 和 .zip , .rar 都要清除,該如何設定

ChatGPT

如果要清除.bak、.zip和.rar這三種副檔名的檔案,你可以在 SQL Server 的 "維護清除工作" 中設定多個條件來進行清除。具體步驟如下:

  • 在 "維護計畫" 中建立一個新的 "維護清除工作"。
  • 在 "維護清除工作" 的設定中,選擇要清除的資料庫或資料庫組。
  • 在 "設定清除作業" 中,新增多個 "作業"。
  • 對於每個作業,選擇 "副檔名" 條件,並分別設定為.bak、.zip和.rar。
  • 設定適當的清除週期和其他選項,以確保符合您的需求。

這樣設定後,SQL Server 將會定期清除符合這些條件的檔案。

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

User

敝人實際測試,要 bak 才行,.bak 不行

ChatGPT

感謝你的分享,看來在 SQL Server 的 "維護清除工作" 中,對於副檔名的設定是有一定的差異的。如果只能設定為bak而不能設定為.bak,那麼請確保在設定 "維護清除工作" 時使用正確的格式。

謝謝你的補充!

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

(完)

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項

2023-02-03

因為某些緣故,Windows Server 2019/2022 主機要退出 GCB AD Domain (變回 WORKGROUP),用 LGPO.exe 套用 GCB GPO。

這篇是因為在 GCB AD Domain, AD Domain, GCB 踢了些鐵板、遇到了些麻煩,分享的經驗。

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

【退 AD 前】

Windows Server 2019/2022 

1.退 AD 後,因為沒了 GCB Ad Domain,Windows 本機帳號 renamed_admin 會回復為 administrator。  (但過程沒讓你重設 administrator 密碼,你還記得密碼嗎?)

2.(可以等退 AD 後再做,但建議先做)

  建議替管理員 user1, user2, ... 建立 Windows Server 2019/2022 本機帳號,並加入 administrator 群組,以防萬一。

  (曾遇過某系統退 AD 後,aadministrator 登入成功,但畫面全黑,無法操作使用;user1登入則正常; 若不是先建立了其他 administrators 群組的帳號 就慘了)

SQL Server 2019/2022 

1.建議把「維護計畫」砍了,之後再重建和測試;

 因為目前用 GcbAdDomain\user1 帳號執行,退 AD 後不能跑,刪除又有權限問題要處理,麻

煩。

2.SSMS 中新增 "SQL Server驗證" 的 user2 和 user1 帳號,伺服器角色全勾, 免得退 AD 後,GcbAdDomain\user1 和 GcbAdDomain\user2 等 sysadmin 等級帳號都沒了。

3.因為 sa 以前就改名和關閉了,可以考慮新名稱改回為 sa,啟用,設定密碼。 

4.以退 AD 前,SQL Server 可能有下面帳號


GcbAdDomain\administrator (退AD後,可能還在,但可能無法登入)

GcbAdDomain\user1 (退AD後,可能還在,但可能無法登入)

GcbAdDomain\user2 (退AD後,可能還在,但可能無法登入)


Win2022Web\administrator 

Win2022Web\user1 (本機帳號,"Windows 驗證",本機 administrators 群組,預防萬一,建議有)

Win2022Web\user2 (本機帳號,"Windows 驗證",本機 administrators 群組)


sa (可能已經停用改名,可考慮啟用,設定密碼,"SQL Server 驗證" 的最高等級帳號是 sa,不是稱為 administrator )

user1 ("SQL Server 驗證",具有 sysadmin 等所有角色,預防萬一,建議有)

user2 ("SQL Server 驗證",具有 sysadmin 等所有角色,預防萬一)


MyWebServer (網站系統帳號,"SQL Server驗證",但只有特定 Database Owner 權限,沒有 sysadmin 等級權限)


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

【退 AD】

建議用 AD Domain 的 administrator / Renamed_Admin 來退出。

( 雖然 Win2022Web 本機的 administrator 也可以退出,但狀況不同 )

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

【退 AD 後】

測試一下 administrator 和 user1 可否登入。

註1:某系統退 AD 後,aadministrator 登入成功,但畫面全黑,無法操作使用;user1登入則正常;若不是先建立了其他 administrators 群組的帳號 就慘了。

註2:某系統退 AD 後,有 Renamed_Admin 帳號,沒 administrator 帳號,可能是以前加入 AD Domain 前,就改名了。  

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

【用 LGPO.exe 套 GCB 】

需要「系統管理員」層級的「命令提示字元」環境才行。

1. 將目前的群組原則備份

mkdir  D:\LGPO\BACKUP (LGPO.exe 不會自動建立目錄,要手動建立)

D:

cd LGPO

LGPO.exe /b D:\LGPO\BACKUP  (目錄必須已經存在)


註:LGPO.exe 的備份,只會對有人為設定的值備份,如果原來是 "尚未定義",而你套用的 GCB 改了它,備份檔可能是無法還原到 "尚未定義" 的,如果是有關 "權限" 的設定因 GCB 而喪失,後果可能嚴重。

就算仍有足夠權限解決問題,也要知道如何解決,例如稍後會提到的 SQL Server 服務被停用了。



2. 清空(刪除)目前的群組原則

RD /S /Q C:\Windows\System32\GroupPolicy


3. 將需要的設定檔匯入

LGPO.exe /g D:\LGPO\GCB_Rules


4. 強制更新,立即生效

gpupdate /force


(理論上這樣就不用 reboot Windows,但實際上放一晚隔間去檢視 "事件檢視器",套用後若沒立刻重新啟動 Windows, 會開始有些異常狀況,建議不用做此步驟,直接 "立即" "重新開機"。


5. 立即重新開機

shutdown /r /f /t 00


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

【SQL Server 無法用了】

如果有使用 SQL Server,立刻執行 gpedit.msc,左邊樹狀結構展開

本機電腦原則/電腦設定/Windows 設定/安全性設定/本機原則/使用者權限指派

右邊找到「以服務方式登入」把下面2個加入 (第一個必須,如果有使用「維護精靈」或 SQL Server Agent 相關工作,第2個也必須)

NT SERVICE\MSSQLSERVER

NT SERVICE\SQLSERVERAGENT

如果不確定要加入甚麼,點 Windows 桌面左下角「開始」按紐,選

「Windows 系統管理工具」/「服務」,找到 "SQL Server (MSSQLServer)",

Click,點選 "登入" 頁籤,看 "這個帳戶" 欄位使用哪個帳號啟動 SQL Server,

一般應該是 "NT SERVICE\MSSQLSERVER"



其他可能用到的服務 (依各自機器安裝軟體和設定不同,而可能不同)

  • LOCAL SERVICE
  • SQLServer2005SQLBrowserUser$WIN2019STD
  • SQLServerMSASUser$WIN2019STD$MSSQLSERVER
  • NT SERVICE\ALL SERVICES
  • NT SERVICE\SSISScaleOutWorker150
  • NT SERVICE\SQL Server Distributed Replay Controller
  • NT SERVICE\SSASTELEMETRY
  • NT SERVICE\SSISTELEMETRY150
  • NT SERVICE\SQLTELEMETRY
  • NT SERVICE\MSSQLServerOLAPService
  • NT SERVICE\MsDtsServer150
  • NT SERVICE\SQL Server Distributed Replay Client
  • NT SERVICE\MSSQLFDLauncher
  • NT SERVICE\SQLSERVERAGENT
  • NT SERVICE\MSSQLSERVER
  • IIS APPPOOL\Classic .NET AppPool
  • IIS APPPOOL\.NET v4.5
  • IIS APPPOOL\.NET v2.0
  • IIS APPPOOL\.NET v4.5 Classic
  • IIS APPPOOL\.NET v2.0 Classic
  • IIS APPPOOL\TestWebSite


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

【後續測試和設定】

1.測試 Web Server 是否正常運作。

2.進入 SQL Server Management Studio 19.x,用下面 2個都測試看看,

  •   Win2022Web\user1 (本機帳號,"Windows 驗證",本機 administrators 群組)
  •   user1 ("SQL Server 驗證",具有 sysadmin 等所有角色,預防萬一)

 要用 Win2022Web\user1 (本機帳號,"Windows 驗證") 登入 SSMS,Windows Server 2019/2022 就必須用 user1 登入。

 註1:敝人碰過有些主機用 user1 ("SQL Server 驗證") 居然無法登入 SSMS 的狀況,但有些主機可用 user1 登入 SSMS,砍掉重建後,可以正常登入。

註2: 敝人碰過有些主機用 Win2022Web\user1 (本機帳號,"Windows 驗證") 無法登入 SSMS 的狀況,後來發現是 Windows Hostname 曾經異動過的關係。當時沒有任何其他能成功登入 SSMS 的帳號了,後來把 Windows Hostname 改回原來的,才成功登入 SSMS。

註2A:某些軟體,Windows hostname 一但變更,會無法用,若再改回,有些是可以成功再使用,但遇過某軟體,hostname 改回仍會部份功能或所有功能無法再使用,注意

註3: 敝人碰過 sysadmin 等級帳號登入 SSMS 後,然後某操作,居然有權限問題,所以前面建議「角色」不要只勾 sysadmin,乾脆全勾選。


3.測試看看 Web Server 是否仍可正常瀏覽。

4.重新用 SSMS 建立 "維護計畫",執行看看能否成功。


(完)  

  

相關

[研究][GCB]退出 GCB AD Domain,用 LGPO.exe 套用 GCB GPO 注意事項https://shaurong.blogspot.com/2024/02/gcb-gcb-ad-domain-lgpoexe-gcb-gpo.html

[研究]GCB套用前後,Windows「帳戶原則」(密碼原則、帳戶鎖定原則)對比
https://shaurong.blogspot.com/2024/02/gcbwindows.html

[研究]GCB套用前後,「本機原則」(稽核原則、使用者權限指派、安全性原則)對比
https://shaurong.blogspot.com/2024/02/gcb.html

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html

[研究]GCB 套用與 Splunk Server、Splunk Universal Forwarder 影響
https://shaurong.blogspot.com/2024/02/gcb-splunk-serversplunk-universal.html

[研究]GCB 套用與 ArcSight 影響
https://shaurong.blogspot.com/2024/02/gcb-arcsight.html

[研究]GCB 套用與趨勢科技 Trend Micro Deep Security Agent (DSA) 影響
https://shaurong.blogspot.com/2024/02/gcb-trend-micro-deep-security-agent-dsa.html

[研究]GCB 套用與 EDR 影響
https://shaurong.blogspot.com/2024/02/gcb-edr.html

[研究]GCB 套用與 神網資訊資產管理(VANS導入) 影響
https://shaurong.blogspot.com/2024/02/gcb-vans.html

 [研究]GCB 套用與 Windows 遠端桌面影響
https://shaurong.blogspot.com/2024/02/gcb-windows.html

[研究][GCB]遠端桌面連線出現「系統管理員已限制您可以使用的登入類型 (網路或互動式)。」https://shaurong.blogspot.com/2020/07/gcb.html

[研究][GCB]AD (Active Directory) 您嘗試連線的遠端電腦需要網路層級的驗證(NLA),但無法聯絡您的 Windows 網域控制站以執行 NLA。
https://shaurong.blogspot.com/2022/09/gcbad-active-directory-nla-windows-nla.html