如何使用C#来清理html页面上的输入?

是否有用于清理html页面输入的库或可接受的方法?

在这种情况下,我有一个只有姓名,电话号码和电子邮件地址的表单。

代码必须是C#。

例如:

"John Doe"应成为"John Doe"

这是一个较旧但仍然相关的问题。

我们正在使用HtmlSanitizer .Net库,其中:

  • 是开源(MIT) – GitHub链接
  • 积极维护
  • 没有像Microsoft Anti-XSS库这样的问题 ,
  • 使用OWASP XSS Filter Evasion Cheat Sheet进行unit testing
  • 是专门为此而构建的(与HTML Agility Pack相比 ,它是一个解析器 – 而不是一个清理程序)
  • 不使用正则表达式(HTML不是常规语言!)

也在NuGet上

如果通过清理你的意思是完全删除标签,那么Bryant引用的RegEx示例就是你想要的解决方案类型。

如果您只是想确保代码不会弄乱您的设计并呈现给用户。 您可以使用HttpUtility.HtmlEncode方法来防止这种情况!

根据您对此答案所做的评论,您可能会在此问题中找到一些有用的信息:
https://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site

这是一个参数化查询示例。 而不是这个:

 string sql = "UPDATE UserRecord SET FirstName='" + txtFirstName.Text + "' WHERE UserID=" + UserID; 

做这个:

 SqlCommand cmd = new SqlCommand("UPDATE UserRecord SET FirstName= @FirstName WHERE UserID= @UserID"); cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 50).Value = txtFirstName.Text; cmd.Parameters.Add("@UserID", SqlDbType.Integer).Value = UserID; 

编辑:由于没有注入,我删除了处理该问题的部分答案。 我离开了基本的参数化查询示例,因为这对于阅读问题的其他人来说仍然有用。
–Joel

使用Microsoft Anti-Cross Site Scripting Library怎么样?

听起来你有用户提交内容但你不能完全信任它们,但你仍然希望将它们提供的内容呈现为超级安全的HTML。 这里有三种技术:HTML编码所有内容,HTML编码和/或仅删除邪恶部分,或使用编译为您熟悉的HTML的DSL。

  1. 它应该成为“John Doe”吗? 我会对该字符串进行HTML编码 ,然后让用户“John Doe”(如果确实这是他的真名……)有一个看似愚蠢的名字 。 他不应该首先在脚本标签或任何标签中包装他的名字。 这是我在所有情况下使用的方法,除非其他技术之一存在非常好的商业案例。

  2. 接受来自用户的HTML,然后使用白名单方法(在输出上)清理它,如@Bryant提到的清理方法 。 做到这一点是非常困难的,我推迟到更大的思想。 请注意,一些清洁剂将HTML编码邪恶,其他人将完全删除有问题的位。

  3. 另一种方法是使用“编译”到HTML的DSL。 确保你的DSL编译器是白帽的,因为有些(如MarkdownSharp )会允许任意HTML,如标签和邪恶属性通过未编码(顺便说一句,这可能不是需要或期望的)。 如果是这种情况,您将需要使用技术#2并清理编译器输出的内容。

结束思路:

  • 如果技术#2或#3没有强大的商业案例,那么降低风险并节省自己的努力和使用后顾之忧,请使用技术#1。
  • 因为你使用了DSL,所以不要认为你的安全。 例如:Markdown的原始实现允许HTML通过,未编码。 “对于Markdown语法未涵盖的任何标记,您只需使用HTML本身。无需预先设置或分隔它以表明您正在从Markdown切换到HTML;您只需使用标记。”
  • 输出时编码。 您也可以对输入进行编码,但这样做会让您陷入困境。 如果您编码错误并保存了该文件,您将如何获得原始输入,以便在修复故障编码器后重新编码?

您正在寻找RegEx类以及类似<(.|\n)*?>

你可以在谷歌上找到 很多 考试 。