C# 如何验证字符串是否为';不包含使用C的HTML#

C# 如何验证字符串是否为';不包含使用C的HTML#,c#,html,validation,C#,Html,Validation,有没有人有一种简单有效的方法来检查字符串是否不包含HTML?基本上,我想检查某些字段是否只包含纯文本。我曾考虑过寻找new{tag=x,hastag=text.containsHtmlTag(x)})。其中(x=>x.hastag); 返回ba.Count()>0; } 公共静态bool包含shtmltags(此字符串文本) { 返回 text.containsHtmlTags( “a”a”a”a”a”a”a”a”b”b”a”a”a”a”a”a”a”b”b”b”b”b”b”a”a”a”a”a”a

有没有人有一种简单有效的方法来检查字符串是否不包含HTML?基本上,我想检查某些字段是否只包含纯文本。我曾考虑过寻找<字符,但它很容易在纯文本中使用。另一种方法可能是使用以下内容创建新的System.Xml.Linq.XElement:

XElement.Parse("<wrapper>" + MyString + "</wrapper>")
XElement.Parse(“+MyString+”)

并检查XElement是否不包含子元素,但对于我所需要的内容,这似乎有点重。

以下内容将匹配任何匹配的标记集。i、 e.这个

给你:

using System.Text.RegularExpressions;
private bool ContainsHTML(string checkString)
{
  return Regex.IsMatch(checkString, "<(.|\n)*?>");
}
使用System.Text.regular表达式;
私有bool ContainsHTML(字符串校验字符串)
{
返回Regex.IsMatch(checkString,“”);
}

这是最简单的方法,因为括号中的项目不太可能自然出现

尖括号可能不是你唯一的挑战。其他字符也可能是潜在的有害脚本注入。例如常见的双连字符“-”,也可用于SQL注入。还有其他的

在ASP.Net页面上,如果machine.config、web.config或page指令中的validateRequest=true,则如果检测到HTML标记或各种其他潜在脚本注入攻击,用户将获得一个错误页面,说明“从客户端检测到潜在危险的请求.Form值”。您可能希望避免这种情况,并提供更优雅、不那么可怕的UI体验

您可以使用正则表达式测试开始标记和结束标记,如果其中只有一个出现,则允许使用文本。按顺序允许<或>,但不允许<后跟一些文本,然后>


可以允许尖括号和HtmlEncode在数据持久化时保留文本

您可以通过使用对输入进行编码来确保纯文本

事实上,根据您希望检查的严格程度,您可以使用它来确定字符串是否包含HTML:

bool containsHTML = (myString != HttpUtility.HtmlEncode(myString));

我刚刚尝试了我的XElement.Parse解决方案。我在string类上创建了一个扩展方法,以便可以轻松地重用代码:

public static bool ContainsXHTML(this string input)
{
    try
    {
        XElement x = XElement.Parse("<wrapper>" + input + "</wrapper>");
        return !(x.DescendantNodes().Count() == 1 && x.DescendantNodes().First().NodeType == XmlNodeType.Text);
    }
    catch (XmlException ex)
    {
        return true;
    }
}

我不确定这是否是防弹的,但我认为它对我的情况来说已经足够好了。

使用上面提到的HttpUtility.HtmlEncode方法时要小心。如果您正在检查某些带有特殊字符的文本,而不是HTML,则它的计算结果将不正确。也许这就是为什么JC使用“…取决于您希望检查的严格程度…”

这也检查带有可选空白的自封闭标记之类的内容。该列表不包含新的html5标记

internal static class HtmlExts
{
    public static bool containsHtmlTag(this string text, string tag)
    {
        var pattern = @"<\s*" + tag + @"\s*\/?>";
        return Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase);
    }

    public static bool containsHtmlTags(this string text, string tags)
    {
        var ba = tags.Split('|').Select(x => new {tag = x, hastag = text.containsHtmlTag(x)}).Where(x => x.hastag);

        return ba.Count() > 0;
    }

    public static bool containsHtmlTags(this string text)
    {
        return
            text.containsHtmlTags(
                "a|abbr|acronym|address|area|b|base|bdo|big|blockquote|body|br|button|caption|cite|code|col|colgroup|dd|del|dfn|div|dl|DOCTYPE|dt|em|fieldset|form|h1|h2|h3|h4|h5|h6|head|html|hr|i|img|input|ins|kbd|label|legend|li|link|map|meta|noscript|object|ol|optgroup|option|p|param|pre|q|samp|script|select|small|span|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|ul|var");
    }
}
内部静态类HtmlExts
{
公共静态bool containsHtmlTag(此字符串文本,字符串标记)
{
var模式=@;
返回Regex.IsMatch(文本、模式、RegexOptions.IgnoreCase);
}
公共静态bool包含shtmltags(此字符串文本、字符串标记)
{
var ba=tags.Split('|')。选择(x=>new{tag=x,hastag=text.containsHtmlTag(x)})。其中(x=>x.hastag);
返回ba.Count()>0;
}
公共静态bool包含shtmltags(此字符串文本)
{
返回
text.containsHtmlTags(
“a”a”a”a”a”a”a”a”b”b”a”a”a”a”a”a”a”b”b”b”b”b”b”a”a”a”a”a”a”b”a”b”b”a”b”b”b”b”a”a”a”a”a”b”b”b”b”b”b”b”基地”b”b”b”b”b”b”b”b”基地”b”b”大,b”b”大,b”大,b”b”b”围报价,b”b”大,b”封锁报价报价,b”b”b”b”本体”b”b”b”b”b”b”b”b”b”b”本体”b”b”b”b”b”方方”本体”围围报价报价报价,b”本体”本体”b”本体”本体”本体”本体”b”b”b”b”b”b”b”html | hr | i | img | input | ins | kbd | label | legend | li | link | map | meta | noscript | object | ol | optgroup | option | p | param | pre q | samp | script select | select | small | span | span | span | span | strong style | sub table | sub td | subea | tfoot | th | thead | title | tr | tt | ul | var |;
}
}

要做到这一点,您可能必须定义“HTML”和“纯文本”的含义,例如:您是否允许某人在纯文本中放入“”,它看起来像HTML元素,但不是,以及您允许哪些字符……在我的情况下,我可以说根本没有标记,所以不允许。我的用户是有限数量的员工,他们在公司网站上输入产品。他们开始有点滥用这些字段,并在不包含HTML的字段中包含HTML。如果你处理SQL注入的策略是“从输入中剥离”--“你有一个更大的问题。很好的一点,Robert,但我认为这不是全面解释SQL注入防御的地方,或者其他脚本注入技术。我反对SQL注入的第一道防线是使用参数化SQL。你的是什么?你正在检查以确保它不包含XHTML。您没有检查以确保它不包含HTML,HTML不必是格式良好的XML。此外,您的代码不会捕获“这是XHTML”。实际上,格式不正确的旧式HTML将导致XElement.Parse方法失败。我的方法假设解析方法失败意味着字符串包含某种形式的HTML。我猜我的代码真的在寻找任何形式的标记。我们也可以使用正则表达式patten来检查开始和结束标记。一个简单但有效的答案!不幸的是,如果字符串中包含撇号、符号和,则不起作用etc@PeteG好的一点,是的,从.NET4开始,这个方法实际上编码了比以前更多的东西,比如单引号。这使得这项技术变得不那么有用。这意味着文本“abcdThe second one matches”ac括号不太可能自然出现?!我不这么认为。如果有人键入“if x<0或y>10”,这个正则表达式将捕获“<0或y>”,但在我的示例中没有HTML。正则表达式作为HTML解析器通常是不受欢迎的。
bool containsHTML = (myString != HttpUtility.HtmlEncode(myString));
public static bool ContainsXHTML(this string input)
{
    try
    {
        XElement x = XElement.Parse("<wrapper>" + input + "</wrapper>");
        return !(x.DescendantNodes().Count() == 1 && x.DescendantNodes().First().NodeType == XmlNodeType.Text);
    }
    catch (XmlException ex)
    {
        return true;
    }
}
public static string ConvertXHTMLEntities(this string input)
{
    // Convert all ampersands to the ampersand entity.
    string output = input;
    output = output.Replace("&amp;", "amp_token");
    output = output.Replace("&", "&amp;");
    output = output.Replace("amp_token", "&amp;");

    // Convert less than to the less than entity (without messing up tags).
    output = output.Replace("< ", "&lt; ");
    return output;
}
bool ContainsHTML = UserEnteredString.ConvertXHTMLEntities().ContainsXHTML();
internal static class HtmlExts
{
    public static bool containsHtmlTag(this string text, string tag)
    {
        var pattern = @"<\s*" + tag + @"\s*\/?>";
        return Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase);
    }

    public static bool containsHtmlTags(this string text, string tags)
    {
        var ba = tags.Split('|').Select(x => new {tag = x, hastag = text.containsHtmlTag(x)}).Where(x => x.hastag);

        return ba.Count() > 0;
    }

    public static bool containsHtmlTags(this string text)
    {
        return
            text.containsHtmlTags(
                "a|abbr|acronym|address|area|b|base|bdo|big|blockquote|body|br|button|caption|cite|code|col|colgroup|dd|del|dfn|div|dl|DOCTYPE|dt|em|fieldset|form|h1|h2|h3|h4|h5|h6|head|html|hr|i|img|input|ins|kbd|label|legend|li|link|map|meta|noscript|object|ol|optgroup|option|p|param|pre|q|samp|script|select|small|span|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|ul|var");
    }
}