清理注册输入?

时间:2015-04-08 11:43:08

标签: c# asp.net .net webforms

这可能是一个非常愚蠢的问题,但到目前为止,互联网已经让我失望了,所以我希望你们的优秀人才会有所帮助。基本上我有一个网站,其中有使用.net会员提供商的会员功能(注册/登录/忘记密码等)。接下来,我将用户注册数据转换为XML,然后在逻辑中使用其他地方。不幸的是,我经常会遇到XML格式的问题,而不是hexadecimal value 0x1C, is an invalid character。我确实找到了一篇关于解决方案的方便的博客文章,但它让我思考,是否有关于如何对数据进行消毒的标准?什么让注册和什么不通过?

1 个答案:

答案 0 :(得分:1)

假设您(手动?)反序列化注册输入,在进一步处理之前需要encode it as XML,以便正确转义具有XML特殊含义的字符。

请注意,它们中只有5个,因此通过手动替换完成此操作非常合理:

  • < = &lt;
  • > = &gt;
  • & = &amp;
  • " = &quot;
  • ' = &apos;

您可以使用内置.NET函数HttpUtility.HtmlEncode(input)为您执行此操作。

<强>更新

我刚刚意识到我没有真正回答你的问题,你似乎正在寻找一种方法将Unicode字符转换为ASCII支持的Html实体。

我不知道.NET中有任何内置函数可以做到这一点,所以我写了一个小实用程序方法来说明这个概念:

public static class StringUtilities
{
    public static string HtmlEncode(string input, Encoding source, Encoding destination)
    {
        var sourceChars = HttpUtility.HtmlEncode(input).ToArray();
        var sb = new StringBuilder();

        foreach (var sourceChar in sourceChars)
        {
            byte[] sourceBytes = source.GetBytes(new[] { sourceChar });
            char destChar = destination.GetChars(sourceBytes).FirstOrDefault();

            if (destChar != sourceChar)
                sb.AppendFormat("&#{0};", (int)sourceChar);
            else
                sb.Append(sourceChar);
        }

        return sb.ToString();
    }
}

然后,如果输入字符串中包含保留的XML字符和Unicode字符,您可以像这样使用它:

string unicode = "<tag>some proӸematic text<tag>";

string escapedASCII = StringUtilities.HtmlEncode(
    unicode, Encoding.Unicode, Encoding.ASCII);

// Result: &lt;tag&gt;some pro&#1272;ematic text&lt;tag&gt;

如果您需要在多个地方执行此操作,为了清理它,您可以为特定方案添加扩展方法:

public static class StringExtensions
{
    public static string ToEncodedASCII(this string input, Encoding sourceEncoding)
    {
        return StringUtilities.HtmlEncode(input, sourceEncoding, Encoding.ASCII);
    }
    public static string ToEncodedASCII(this string input)
    {
        return StringUtilities.HtmlEncode(input, Encoding.Unicode, Encoding.ASCII);
    }
}

然后你可以这样做:

string unicode = "<tag>some proӸematic text<tag>";

// Default to Unicode as input
string escapedASCII1 = unicode.ToEncodedASCII();

// Pass in a different encoding for your input
string escapedASCII2 = unicode.ToEncodedASCII(Encoding.BigEndianUnicode);

更新#2

由于您还要求提供有关遵守标准的建议,我可以告诉您的最多是您需要考虑输入文本实际结束的位置。

如果某个用户的输入只会显示给该用户(例如,当他们在您的应用中管理他们的个人资料/帐户设置时),并且您的数据库支持Unicode,那么您可以按原样保留所有内容。 / p>

另一方面,如果信息可以显示给其他用户(例如,当用户可以查看彼此的公开个人资料信息时),那么您需要考虑到并非所有用户都将在设备上访问您的网站/支持Unicode的浏览器。在这种情况下,UTF-8可能是您最好的选择。

这也是您无法真正找到有用信息的原因。如果世界能够就标准达成一致,那么我们就不必首先处理所有这些编码变化。想想你的目标群体以及他们需要什么。

关于编码主题的有用博文:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)