2021年11月30日 星期二

[研究][ASP.NET]Fortify SCA 報告 Path Manipulation (路徑操作) 解決方法

[研究][ASP.NET]Fortify SCA 報告 Path Manipulation (路徑操作) 解決方法

2021-11-30


問題發生行


HttpContext.Current.Response.WriteFile( fd );

攻擊者可以控制在 WriteFile() 的檔案系統路徑引數,可讓他們存取或修改原本受保護的檔案。

解決方法1:白名單,建立合法值的清單,而使用者只能從清單中選取。缺點是在某些情況下,清單會過於龐大難維護,不切實際。

解決方法2:黑名單,拒絕或避開可能有危險的字元,缺點是可能不完整。

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

解決

偷懶點,隨便寫個副程式,把值回傳,結果失敗。  


public static string MyAntiPathManipulation(string myPath)
{
    // 失敗,直接回傳不行
    return myPath;
}

後來直接拿這篇的來用,通過 Fortify SCA檢驗

[研究][ASP.NET] 防 XSS 的 HtmlSanitizer ( HTML消毒劑)
https://shaurong.blogspot.com/2021/09/aspnet-xss-htmlsanitizer-html.html

(完)


2021年11月29日 星期一

[研究][ASP.NET]不能為收取目錄傳遞方法啟用 SSL。

[研究][ASP.NET]不能為收取目錄傳遞方法啟用 SSL。

SSL must not be enabled for pickup-directory delivery methods.

2021-11-29

因為 Web.config 中設定 


<system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="C:\inetpub\mailroot\Pickup" />
      </smtp>
    </mailSettings>
</system.net>

解決:請在 client.Send(message); 之前加上  


client.DeliveryMethod = SmtpDeliveryMethod.Network;

範例


using System;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;

protected void Button3_Click(object sender, EventArgs e)
{
    MailMessage message = new MailMessage(寄件者Email, 收件者Email)
    {
        Subject = "測試主旨-測試一般郵件(SSL連線、Fortify SCA驗證通過)",
        Body = "本文",
        SubjectEncoding = Encoding.UTF8,
        BodyEncoding = Encoding.UTF8,
        IsBodyHtml = true
    };
    try
    {
        //SmtpClient client = new SmtpClient();
        SmtpClient client = new SmtpClient("localhost", 25);
        //SmtpClient client = new SmtpClient(SMTP伺服器, 25);

        //client.ServicePoint.MaxIdleTime = 1;
        //client.ServicePoint.ConnectionLimit = 1;

        //Fortify SCA : Critical : Insecure Transport Mail Transmission
        //需用加密連線,加上 client.UseDefaultCredentials = true; 和 client.EnableSsl = true;

        // 只有 client.UseDefaultCredentials = true; 一個寄信成功,但是 Fortify SCA 會報告
        client.UseDefaultCredentials = true;    // OK

        // 根據驗證程序,遠端憑證是無效的。=> 會出錯,下面這一行必須註解掉
        // 原因:mail server和client使用ssl連線,但ssl憑證並沒有經過認證(ex:自簽憑證 Self Signed Certifcate)
        // client.EnableSsl = true;

        // 解決「根據驗證程序,遠端憑證是無效的。」,不管驗證結果 true 或 false,都當 true
        //ServicePointManager.ServerCertificateValidationCallback +=  (sender, cert, chain, sslPolicyErrors) => true;
        //ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
        //System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
        System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateCheck;
        client.EnableSsl = true;

        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.Send(message);
        Response.Write("寄件成功");
    }
    catch (Exception)
    {
        Response.Write("寄件失敗");

        //不能為收取目錄傳遞方法啟用 SSL。
        //SSL must not be enabled for pickup-directory delivery methods.
        throw;
    }
}
private static bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return !certificate.Issuer.Equals("解決");
    // or
    //return false;
}

(完)

[研究]WhatsUp與SQL Server支援

[研究]WhatsUp與SQL Server支援

2021-11-29 

WhatsUp Gold v2019  (19.0) 版支援到 SQL Server 2016
https://docs.ipswitch.com/NM/WhatsUpGold2019/06_Languages/ChineseT/Release_Notes/sysreq/index.htm

WhatsUp Gold 2020 使用說明
https://docs.ipswitch.com/NM/WhatsUpGold2020/03_Help/1028/index.htm?89675.htm?toc.htm

WhatsUp Gold v2020  (20.0) 版支援到 SQL Server 2019
https://docs.ipswitch.com/NM/WhatsUpGold2020/01_ReleaseNotes/sysreq/index.htm

WhatsUp Gold v2021  (21.0) 版支援到 SQL Server 2019
https://docs.ipswitch.com/NM/WhatsUpGold2021/06_Languages/ChineseT/Release_Notes/sysreq/index.htm

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

SQL Server 目前最新 SQL Server 2019 版 ( 15.0 版)

SQL Server 用戶端相關程式或驅動程式 Driver (目前最新 18.10 版 (v15.0.18390.0) )

SQL Server Management Studio (SSMS) 18.10 v15.0.18390.0 (2021-10-05 釋出)
https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?redirectedfrom=MSDN&view=sql-server-ver15


若單獨下載,似乎還有比 SSMS 內含更新的版本

下載 Microsoft OLE DB Driver for SQL Server (目前最新 18.6版)
https://docs.microsoft.com/zh-tw/sql/connect/oledb/download-oledb-driver-for-sql-server?view=sql-server-ver15

下載 Microsoft ODBC Driver 17 for SQL Server (目前最新17.8.1 版)
https://docs.microsoft.com/zh-tw/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15


SQL Server Native Client
https://docs.microsoft.com/zh-tw/sql/relational-databases/native-client/sql-server-native-client?view=sql-server-ver15

(完)

2021年11月25日 星期四

[研究]Fortify SCA報告Insecure SSL: Server Identity Verification Disabled

[研究]Fortify SCA報告Insecure SSL: Server Identity Verification Disabled

2021-11-24

環境:Visual Studio 2022 + C# + ASP.NET + WebForm

Default.apsx


protected void Page_Load(object sender, EventArgs e)
{
     System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
     HttpWebRequest WebRequest = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");
}


protected void Page_Load(object sender, EventArgs e)
{
     System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateCheck;
     HttpWebRequest WebRequest = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");
}
private static bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}

用 Micro Focus Fortify SCA ( Static Code Analyzer ) 21.1.2 掃描有 Insecure SSL: Server Identity Verification Disabled 問題。

主要問題是 SSL 連線時  (連上 HTTPS 網站、Mail Client 和 SMTP Server 用 SSL 通訊、其他),沒有檢查伺服器憑證,或檢查沒通過 ( 自簽憑證、過期、其他),因為內部連線時,一般不會去付費買商用憑證來用,只好想辦法避過檢查。

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

解決方法


protected void Page_Load(object sender, EventArgs e)
{
     System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateCheck;
     HttpWebRequest WebRequest = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");
}
private static bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return !certificate.Issuer.Equals("解決");
}


protected void Page_Load(object sender, EventArgs e)
{
     System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateCheck;
     HttpWebRequest WebRequest = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");
}
private static bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return false;
}

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


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication20
{
    public partial class Default3 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            HttpWebRequest WebRequest = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");

            System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateCheck;
            HttpWebRequest WebRequest2 = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");

            System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateCheck2;
            HttpWebRequest WebRequest3 = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");

            System.Net.ServicePointManager.ServerCertificateValidationCallback = CertificateCheck3;
            HttpWebRequest WebRequest4 = (HttpWebRequest)System.Net.WebRequest.Create("http://cdn.thu.edu.tw/");
        }
        private static bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
        private static bool CertificateCheck2(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return false;
        }
        private static bool CertificateCheck3(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return !certificate.Issuer.Equals("解決");
        }
    }
}


(完)

[研究][ASP.NET]Fortify SCA 的 Privacy Violation: Heap Inspection 問題處理

[研究][ASP.NET][WebForm][C#]Fortify SCA 的 Privacy Violation: Heap Inspection 問題處理

2021-11-25

Software Security | Privacy Violation: Heap Inspection
https://vulncat.fortify.com/zh-tw/detail?id=desc.dataflow.java.privacy_violation_heap_inspection

摘要:錯誤地處理機密資訊,導致洩漏使用者隱私資訊,且是不合法的行為。

建議:當安全性和隱私要求發生矛盾時,通常隱私應該放在較重要的位置。為要滿足此要求,並仍維持所需的安全資訊,應在退出程式前清除所有的隱私資料。

Micro Focus Fortify Static Code Analyzer 的參考範例


static void ManipulateSecureString()
{
    // SecureString, with some data
    SecureString ss = new SecureString();
    ss.AppendChar('a');
    ss.AppendChar('s');
    ss.AppendChar('d');
    ss.AppendChar('f');

    // copy data as unicode character array to a buffer in unmanaged space
    IntPtr ssAsIntPtr = Marshal.SecureStringToGlobalAllocUnicode(ss);

    for (Int32 i = 0; i < ss.Length; i++)
    {
        // multiply 2 because Unicode chars are 2 bytes wide
        Char ch = (Char)Marshal.ReadInt16(ssAsIntPtr, i * 2);

        // do something with each char
    }

    // don't forget to free it at the end
    Marshal.ZeroFreeGlobalAllocUnicode(ssAsIntPtr);
}

敝人改寫為一個函數


public static string AntiPrivacyViolationHeapInspection(string sensitiveString)
{
    SecureString ss = new SecureString();
    string ss2 = "";
    foreach (char c in string.Format("{0}", sensitiveString))
    {
        ss.AppendChar(c);
    }
    IntPtr ssAsIntPtr = Marshal.SecureStringToGlobalAllocUnicode(ss);
    for (Int32 i = 0; i < ss.Length; i++)
    {
        // multiply 2 because Unicode chars are 2 bytes wide
        Char ch = (Char)Marshal.ReadInt16(ssAsIntPtr, i * 2);

        ss2 = ss2 + ch;
    }
    Marshal.ZeroFreeGlobalAllocUnicode(ssAsIntPtr);
    return ss2;
}

(完)

2021年11月24日 星期三

[研究]MSDN訂閱價格

[研究]MSDN訂閱價格

2021-11-24

定價及購買選項 | Visual Studio
https://visualstudio.microsoft.com/zh-hant/vs/pricing/
點「購買 Visual Studio 訂閱」超連結

Visual Studio - Microsoft Store
https://www.microsoft.com/zh-tw/store/collections/visualstudio?atc=true&icid=SMB_CP1_visualstudio&rtc=2

Visual Studio Professional 訂閱    NT$43,308.00 起
Visual Studio Enterprise 訂閱    NT$216,684.00 起
Visual Studio Test Professional 訂閱    NT$78,344.00 起
Visual Studio Professional 2019    NT$18,024.00

這疑似一位使用者、一年訂閱、零售價格,

企業大量授權版用戶似乎有一年、二年的訂閱,價格也更低 (官方沒有直接公開價格)。

Click 圖片可看100%圖片

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

定價及購買選項 | Visual Studio
https://visualstudio.microsoft.com/zh-hant/vs/pricing/
點「公司」超連結

對於擁有 5 位以上使用者/裝置的小到中型企業,

Professional訂閱每月45美金

Enterprise訂閱每月250美金,一年約US$250*12月*35=NT$105,000

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

定價及購買選項 | Visual Studio
https://visualstudio.microsoft.com/zh-hant/vs/pricing/
點「Enterprise」超連結

對於擁有 500 個以上使用者/裝置的大型組織,

Professional訂閱每月45美金

EnterpriseProfessional訂閱每月250美金

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

購買 Visual Studio Professional - Visual Studio

https://visualstudio.microsoft.com/zh-hant/vs/support/purchasing-visual-studio-professional/

(完)

[研究]你的連線不是私人連線 ... 目前無法造訪 ...,因為這個網站使用 HSTS。

[研究]你的連線不是私人連線 ... 目前無法造訪 ...,因為這個網站使用 HSTS。

2021-11-24

問題:你的連線不是私人的連線

NET::ERR_CERT_COMMON_NAME_INVALID

目前無法造訪 localhost,因為這個網站使用 HSTS。





你的連線不是私人連線

攻擊者可能會試圖從 localhost 竊取你的資訊 (例如密碼、郵件或信用卡資料)。瞭解詳情

NET::ERR_CERT_COMMON_NAME_INVALID

要獲得 Chrome 最高等級的安全防護,請啟用強化防護功能

localhost 通常會使用加密方式保護你的資訊。但 Chrome 這次嘗試連線到 localhost 時,該網站傳回了異常且錯誤的憑證。這可能是因為有攻擊者企圖偽裝成 localhost,或是受到 Wi-Fi 登入畫面影響而造成連線中斷。不過請放心,Chrome 已及時停止連線,並未傳輸任何資料,因此你的資訊仍然安全無虞。

目前無法造訪 localhost,因為這個網站使用 HSTS。網路錯誤和攻擊行為通常是暫時性的,因此這個網頁可能稍後就會恢復正常狀態。



********************************************************************************
解決方法:






(完)

相關

HTTP強制安全傳輸技術 - 維基百科,自由的百科全書
HTTP嚴格傳輸安全(英語:HTTP Strict Transport Security,縮寫:HSTS)
https://zh.wikipedia.org/wiki/HTTP%E4%B8%A5%E6%A0%BC%E4%BC%A0%E8%BE%93%E5%AE%89%E5%85%A8


[研究][ASP.NET][WebForm][C#]網址防 Fortify SCA 報告Cross-Site Scripting, XSS

[研究][ASP.NET][WebForm][C#]網址防 Fortify SCA 報告跨站腳本攻擊(Cross-Site Scripting, XSS)

2021-11-24

工具:Visual Studio 2022 + Micro Focus Fortify Static Code Analyzer 21.1.2

NuGet 安裝 HtmlSanitizer 套件

Default.aspx 


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication16.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">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /><br />
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
            <br />
            <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" /><br />
            <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
            <br />
            <asp:Button ID="Button3" runat="server" Text="Button" OnClick="Button3_Click" /><br />
            <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label><br />
            <br />
        </div>
    </form>
</body>
</html>

Default.aspx.cs


using Ganss.XSS;
using System;
using System.Web.Security.AntiXss;

namespace WebApplication16
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Button1_Click(sender, e);
            //Button2_Click(sender, e);
            //Button3_Click(sender, e);
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string url = "https://www.hinet.net/?sno=" + Request.QueryString["sno"];
            Label1.Text = url;  // 有 XSS 問題
            ClientScript.RegisterStartupScript(GetType(), "message", 
                "<script>alert('修改成功。\\n按【確定】轉往列表畫面。');" +
                "location.href='" + url + "';</script>"); // 有 XSS 問題
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            string url = "https://www.hinet.net/?sno=" + Request.QueryString["sno"];
            url = AntiXssEncoder.UrlEncode(url);
            Label2.Text = url;
            // https%3A%2F%2Fwww.hinet.net%2F%3Fsno%3D
            // 不能用了
            //  '/' 應用程式中發生伺服器錯誤。
            //  具有潛在危險 Request.Path 的值已從用戶端(:) 偵測到。
            ClientScript.RegisterStartupScript(GetType(), "message", 
                "<script>alert('修改成功。\\n按【確定】轉往列表畫面。');" +
                "location.href='" + url + "';</script>");
        }

        protected void Button3_Click(object sender, EventArgs e)
        {
            string url = "https://www.hinet.net/?sno=" + Request.QueryString["sno"];
              url = MyAntiXssFilter(url);
            Label3.Text = url;
            // https://www.hinet.net/?sno=
            // 仍可以使用
            ClientScript.RegisterStartupScript(GetType(), "message", 
                "<script>alert('修改成功。\\n按【確定】轉往列表畫面。');" +
                "location.href='" + url + "';</script>");
        }


        public static string MyAntiXssFilter(object inputObject)
        {
            string inputStr = "";
            if (inputObject != null)
            {
                inputStr = inputObject.ToString();
            }
            var sanitizer = new HtmlSanitizer();
            sanitizer.AllowedAttributes.Add("class");
            sanitizer.AllowedAttributes.Add("id");
            var sanitized = sanitizer.Sanitize(inputStr);
            return sanitized;
        }
    }
}

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

2022-09-08 .fpr 報告預設 Quick View 模式改成 Security Auditor View,不會有 Cross-Site Scripting: Poor Validation 問題。

(完)

2021年11月23日 星期二

[研究]無法載入檔案或組件 'DotNetOpenAuth.Core,

[研究]無法載入檔案或組件 'DotNetOpenAuth.Core,

2021-11-23

原來是不需要這個套件的,Visual Studio 下執行突然出現這種錯誤,NuGet 安裝後仍是有問題;把 DotNetOpenAuth 相關逐一全部移除後,仍是如此,最後把 obj 和 bin 目錄全部砍了,再次於 Visual Studio 中執行,正常了。

(完)

2021年11月20日 星期六

[研究]Eval與一些HtmlEncode、HtmlSanitizer與Fortify SCA的XSS (Cross-Site Scripting)檢測

[研究]Eval與一些HtmlEncode、HtmlSanitizer與Fortify SCA的XSS (Cross-Site Scripting)檢測

2021-11-20
2024-02-26更新

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

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

某些程式寫法

<a href="####" onclick="window.open('MyGroupForm.aspx?MyGroupID=<%# Eval("MyGroupID") %>', '', 'scrollbars=yes,resizable=yes,width=800,height=700,left=10,top=10');">編輯</a>

<a href="MyGroupDelete.aspx?MyGroupID=<%#Eval("MyGroupID")%>&p=<%=p%>" onclick="return confirm('確定要刪除嗎?');" >刪除</a>

<asp:Label ID="lb_MyGroupName" runat="server" Text='<%# Eval("MyGroupName") %>' />

Fortify SCA 檢查會出現 Cross-Site Scripting 問題。

Default.aspx


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication4.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">
        <div>
            <asp:Label ID="Label0" runat="server"></asp:Label><br />
            <asp:Label ID="Label1" runat="server"></asp:Label><br />
            <asp:Label ID="Label2" runat="server"></asp:Label><br />
            <asp:Label ID="Label3" runat="server"></asp:Label><br />
            <asp:Label ID="Label4" runat="server"></asp:Label><br />
            <asp:Label ID="Label5" runat="server"></asp:Label><br />
            <asp:Label ID="Label6" runat="server"></asp:Label><br />
            <asp:Label ID="Label7" runat="server"></asp:Label><br />
            <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
        </div>
    </form>
</body>
</html>


Default.aspx.cs


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

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

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            // NuGet 要安裝 AntiXSS 4.3.0
            string testString = "<b>Test</b><script>alert(1);</script>123'" + Request.QueryString["XSS"];
            Label0.Text = testString;
            Label1.Text = Microsoft.Security.Application.Encoder.HtmlEncode(testString); 
            Label2.Text = Server.HtmlEncode(testString);
            Label3.Text = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(testString, true);
            Label4.Text = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(testString, false);
            Label5.Text = HttpUtility.HtmlEncode(testString);
            Label6.Text = System.Net.WebUtility.HtmlEncode(testString);
            
            // NuGet 要安裝 HtmlSanitizer
            var sanitizer = new HtmlSanitizer();
            Label7.Text = sanitizer.Sanitize(testString);
        }
    }
}

(下圖) testString 有 XSS 問題,Label0 沒有處理就輸出,彈出了視窗,Fortify SCA也掃出有問題。




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

測試 含空白字串、日期資料

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" /><br />
        <asp:Literal ID="Literal1" runat="server"></asp:Literal><br />
        <asp:Literal ID="Literal2" runat="server"></asp:Literal><br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
    </form>
</body>
</html>

注意,HtmlSanitizer 8.x 使用的是 using Ganss.Xss; 不是 using Ganss.XSS;  (大小寫差異)

Default.aspx.cs

using Ganss.Xss;
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)
        {
            //string testString = "<b>Test</b><script>alert(1);</script>123'" + Request.QueryString["XSS"];
            string testString = "<b>Test</b>   " + DateTime.Now.ToString();

            // NuGet 要安裝 HtmlSanitizer
            var sanitizer = new HtmlSanitizer();
            Literal1.Text = testString;
            Literal1.Text = sanitizer.Sanitize(testString);
            Label1.Text = testString;
            Label2.Text = sanitizer.Sanitize(testString);
        }
    }
}

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

APS.NET WebForm 程式<asp:Label ID="lb_GroupName" runat="server" Text='<%# Eval("GroupName") %>' /> 如何用using Ganss.Xss; 和sanitizer.Sanitize 改寫,避免 XSS 問題?

ChatGPT

首先,請確保您已將 Ganss.Xss 庫新增至您的專案。 您可以透過 NuGet 套件管理器來安裝該程式庫。

Default.aspx

<asp:Label ID="lb_GroupName" runat="server" Text='<%# Sanitizer_Sanitize(Eval("GroupName").ToString()) %>' />

Default.aspx.cs

using Ganss.Xss;

protected string Sanitizer_Sanitize(string input)  
{ var sanitizer = new HtmlSanitizer(); return sanitizer.Sanitize(input); }

Common.cs

public static string MyAntiXssFilter(object inputObject)
{
    // 注意,MyAntiXssFilter 參數若為網址,& 會變成 &amp;  ,無法傳1個以上參數,改成

    string inputStr = "";
    if (inputObject != null)
    {
        inputStr = inputObject.ToString();
    }
    var sanitizer = new HtmlSanitizer();
    sanitizer.AllowedAttributes.Add("class");
    sanitizer.AllowedAttributes.Add("id");
    
    // 允許 <a href="mailto:"
    sanitizer.AllowedSchemes.Add("mailto"); 
    
    // 沒用; 若處理網址, & 會變成 &amp;
    //sanitizer.AllowedAttributes.Add("&"); 

    var sanitized = sanitizer.Sanitize(inputStr);
    sanitized = sanitized.Replace("&amp;", "&");
    return sanitized;
}

Default.aspx

<asp:Label ID="lb_GroupName" runat="server" Text='<%# Common.MyAntiXssFilter(Eval("GroupName").ToString()) %>' />

注意 Eval("GroupName") 改成 Common.MyAntiXssFilter(Eval("GroupName")),後面兩個括弧若少了一個,Compile 時不會有錯誤或警告,除非目前在 .aspx 網頁上,才會有一點警告
因為 MyAntiXssFilter 傳入是 object,傳出已經是 string,所以可以不用 ToString()。
********************************************************************************
2024-02-27
boxList.DataSource = En.Sys.Where(s => s.Id == id && s.Level == "A")
.Select(t => new { v1 = HttpUtility.HtmlEncode(t.Name), v2 = HttpUtility.HtmlEncode(t.Id) })
.ToList();
使用 HttpUtility.HtmlEncode 失敗


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

結論

  • HtmlEncode 把 HTML Tag 全部都編碼了,HtmlSanitizer 保留部分安全的 HTML Tag不做編碼,避免 XSS 問題。
  • 如果 testString 你確認沒有 HTML Tag,兩者都可用。
  • 如果 testString 不應該有 HTML Tag,用 HtmlEncode。(更好做法是把 HTML Tag移除,例如 HTML Agility Pack,https://www.nuget.org/packages/HtmlAgilityPack/
  • 如果 testString 有 HTML Tag,只是要處理有 XSS 問題的,用 HtmlSanitizer。

(完)

相關

探討 .NET HtmlEncode 解決方案之間的比較
https://www.thinkinmd.com/post/2020/07/25/discuss-dotnet-htmlencode-solutions-and-compare/#-htmlencode

【HTML】AntiXss.HtmlEncode vs AntiXss.GetSafeHtmlFragment
https://www.796t.com/post/MXliOWs=.html

2021年11月18日 星期四

[研究][ASP.NET]加簽寄信失敗-憑證鏈結無法建立於受信任的根授權

[研究][ASP.NET]加簽寄信失敗-「憑證鏈結無法建立於受信任的根授權」

2021-11-18

其實這個電子郵件Email憑證在別台用的好好的,新安裝一台主機使用,卻不能用。後來發現雖然Email憑證包含了完整的憑證鏈結,在mmc的「主控台跟目錄/憑證(本機電腦)/個人/憑證」匯入時,一個憑證匯入後新增了好幾個憑證,但是根憑證不會自動放到「受信任的根憑證授權單位」中,導致產生錯誤。

解決方法,再做一次,這次於「受信任的根憑證授權單位/憑證」下匯入。















(完)

[研究] CentOS 8.5 (2111) Linux 安裝記

[研究] CentOS 8.5 (2111) Linux 安裝記

2021-07-14

官方網站
https://www.centos.org/

CentOS - 維基百科,自由的百科全書
https://zh.wikipedia.org/zh-tw/CentOS

CentOS 8.5 於 2021-11-16 釋出,生命週期只到 2021-12-31
CentOS-8.5.2111-x86_64-dvd1.iso
10.0 GB (10,794,041,344 位元組)

不難安裝,只是個記錄。

請直接參考這篇

[研究] CentOS 8.4 Linux 安裝記
https://shaurong.blogspot.com/2021/07/centos-84-linux.html

一些常用套件更新狀況


(完)

[研究]VMware Workstation Pro 16.2.1 替VM增加TPM和SecureBoot,安裝Windows 11

[研究]VMware Workstation Pro 16.2.1 for Windows 替VM增加 TPM 和 SecureBoot 以便安裝 Windows 11

2021-11-18

Windows 11的安裝比 Windows 10要多考慮最低系統需求,否則很容易遇到此畫面。

此電腦無法執行Windows 11

Windows 11 規格、功能和電腦需求

https://aka.ms/WindowssysReq
https://www.microsoft.com/zh-tw/windows/windows-11-specifications
https://www.microsoft.com/en-us/windows/windows-11-specifications
Windows 11 的功能特定需求
https://www.microsoft.com/zh-tw/windows/windows-11-specifications#table2

  • 處理器:相容的 64 位元處理器或晶片式系統 (SoC) 具備 1 GHz 以上,並配備 2 個以上的核心。
  • RAM:4 GB。注意,VMware Workstation Pro 16.2.1 對 Windows 10 and later x64預設的RAM只有 2GB,要改成4GB才行。
  • 儲存空間:64 GB 以上儲存空間的裝置 注意:請參閱<讓 Windows 11 保持最新狀態的儲存空間需求詳細資訊>底下的內容,以取得更多詳細資訊。
    注意,VMware Workstation Pro 16.2.1 對 Windows 10 and later x64預設的磁碟大小只有 60GB,要改成64GB以上才行。
  • 系統韌體:UEFI、安全開機能力。查看這裡,以取得有關如何讓您的電腦符合這項需求的資訊。
    https://support.microsoft.com/topic/a8ff1202-c0d9-42f5-940f-843abef64fad
  • TPM:信賴平台模組 (TPM) 版本 2.0。查看這裡,以取得有關如何讓您的電腦符合這項需求的指示。
    https://docs.microsoft.com/zh-tw/windows/security/information-protection/tpm/trusted-platform-module-overview
    https://support.microsoft.com/windows/1fd5a332-360d-4f46-a1e7-ae6b0c90645c
  • 圖形卡:相容於 DirectX 12 或更新版本 (包含 WDDM 2.0 驅動程式)。
  • 顯示器:高畫質 (720p) 顯示器更勝於對角直線 9 吋的螢幕,每個色彩通道 8 位元。
  • 網際網路連線和 Microsoft 帳戶 Windows 11 家用版需要網際網路連線和 Microsoft 帳戶。https://account.microsoft.com/account
    將裝置切換脫離 S 模式的 Windows 11 家用版時,也需要網際網路連線能力。請在這裡深入了解 S 模式。
  • 對於所有 Windows 11 版本,必須具備網際網路存取才能執行更新、下載,以及充分利用某些功能。某些功能需要 Microsoft 帳戶。

根據這篇

設定虛擬信賴平台模組裝置
https://docs.vmware.com/tw/VMware-Workstation-Pro/16.0/com.vmware.ws.using.doc/GUID-B42CAC2A-DC3D-4F15-BEFE-AB4319B288CB.html

VMware Workstation Pro 從 15.0 就開始支援TPM 2.0

下面以 Windows 11 (business editions), (updated Nov 2021) (x64) - DVD (Chinese-Traditional)(2021-10-04) 安裝
zh-tw_windows_11_business_editions_updated_nov_2021_x64_dvd_4dc072f7.iso
5.07 GB (5,450,627,072 位元組)

Click圖片可看100%原始尺寸
































Windows 11 安裝請參考這篇

[研究] Windows 11公開下載正式版安裝









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

感覺,還是參考這篇繞過去簡單些

[研究] Windows 11正式版用 regedit.exe 繞過 TPM 和 Secure Boot 檢查https://shaurong.blogspot.com/2021/10/windows-11-regeditexe-tpm-secure-boot.html

(完)