【问题标题】:Create safe Control.ID string from user input从用户输入创建安全的 Control.ID 字符串
【发布时间】:2017-09-08 02:12:46
【问题描述】:

.net 中是否存在从字符串创建安全的Control.ID 属性以满足以下条件(来自MSDN):

只有字母数字字符和下划线字符 (_) 的组合是此属性的有效值。包含空格或其他无效字符将导致 ASP.NET 页面解析器错误。

那我可以拿一个字符串举例:

Hello world

然后得到类似的东西:

hello_world

我知道我可以编写一些自定义的东西来做到这一点,但似乎他们应该是已经存在的东西来做到这一点,但到目前为止我还没有找到任何东西。

【问题讨论】:

  • 你可以试试Server.URLEncode,把%换成_
  • @ZoharPeled - 我认为这不起作用,来自链接:'Spaces ( ) are converted to plus signs (+)' - 这将是一个无效字符。

标签: c# asp.net string sanitization


【解决方案1】:

好吧,如果你愿意写一些自定义的东西,我认为最好是它非常简单。

public static void Main(string[] args)
{
    var s = "some user input";
    Regex r =  new Regex(@"\W|_");
    var x = r.Replace(s, "_");
    Console.WriteLine(x);
    Console.WriteLine(r.Replace("http://google.com?s=search query here", "_"));

}

一些用户输入

http___google_com_s_search_query_here

【讨论】:

    【解决方案2】:

    如果您不需要将生成的控件名称转换回原始字符串,则可以使用字符串的哈希码代替字符串的文本:

        public string GetControlName(string userInput)
        {
            var hashCode = userInput.GetHashCode();
    
            string controlName;
    
            if (hashCode < 0)
            {
                controlName = String.Concat("uc_", -hashCode);
            }
            else
            {
                controlName = String.Concat("uc", hashCode);
            }
    
            return controlName;
        }
    

    这给了你:

    世界你好

    uc_1660742776

    一些用户输入

    uc_1363708559

    http://google.com?s=search在这里查询

    uc_2146180550

    另一种可能的方法是使用一种 SHA 算法(SHA1、SHA256、...):

        public string GetSHAControlName(string userInput)
        {
            using (var sha = SHA1.Create())
            {
                var input = Encoding.Default.GetBytes(userInput);
    
                var hash = sha.ComputeHash(input);
                
                return string.Concat("uc", GetStringFromHash(hash));
            }
        }
    
        public static string GetStringFromHash(byte[] hash)
        {
            StringBuilder result = new StringBuilder();
    
            for (int i = 0; i < hash.Length; i++)
            {
                result.Append(hash[i].ToString("X2"));
            }
    
            return result.ToString();
        }
    

    这给了你:

    世界你好

    uc7B502C3A1F48C8609AE212CDFB639DEE39673F5E

    一些用户输入

    uc2503971E0748D1CCBFB2022D3332ACF903EB4B8F

    http://google.com?s=search在这里查询

    ucBBD010B90C6804F25E1B0AF2C1464278AB9BC08C

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2015-12-09
      • 2017-01-17
      • 2019-02-17
      • 2017-08-20
      相关资源
      最近更新 更多