从用户输入

时间:2017-04-12 10:34:32

标签: c# asp.net string sanitization

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

  

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

我可以拿一个字符串作为例子:

Hello world

得到类似的东西:

hello_world

我知道我可以写一些习惯来做这件事,但似乎他们应该已经存在这样做了,到目前为止我还没有找到任何东西。

2 个答案:

答案 0 :(得分:0)

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

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", "_"));

}
  

some_user_input

     

HTTP ___ google_com_s_search_query_here

答案 1 :(得分:0)

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

    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;
    }

这会给你:

  

Hello world

     

<强> 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();
    }

这给了你:

  

Hello world

     

<强> uc7B502C3A1F48C8609AE212CDFB639DEE39673F5E

     

一些用户输入

     

<强> uc2503971E0748D1CCBFB2022D3332ACF903EB4B8F

     

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

     

<强> ucBBD010B90C6804F25E1B0AF2C1464278AB9BC08C

相关问题