在C#中转义客户端数据以防止XSS或其他攻击

时间:2018-01-12 12:16:56

标签: javascript c# asp.net security xss

为了防止来自XSS或任何其他攻击的Web应用程序输入,我们想要解码来自客户端(浏览器)的所有输入。

为了绕过标准验证,坏人编码数据。示例:

<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

转换为

<IMG SRC=javascript:alert('XSS')>

在C#中,我们可以使用HttpUtility.HtmlDecode&amp; HttpUtility.UrlDecode解码客户端输入。但是,它并未涵盖所有类型的编码。例如,使用上述方法不会转换以下编码值。但是,所有浏览器都会正确解码并执行它们。也可以在https://mothereff.in/html-entities验证它们。

<img src=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">

它被解码为<img src=x onerror="javascript:alert('XSS')">

还有一些编码文本无法使用HtmlDecode方法解码。在Java中,https://github.com/unbescape/unbescape处理所有这些变种。

我们在.Net中有类似的库或者如何处理这样的场景?

2 个答案:

答案 0 :(得分:0)

通常,您不应允许用户在文本框中输入代码。

客户端

根据您对帖子的评论,我只需添加一些客户端验证,以防止用户添加任何类型的恶意输入(例如验证电子邮件字段包含电子邮件),然后添加相同的验证技术你的服务器。

服务器端

只要您在模型中阅读用户的输入,就应该在进行任何进一步处理之前对其进行验证和消毒。有一个通用的AntiXSS()类,可以通过检查<>myString.Contains("<")来删除myString.Contains(">")符号等任何恶意字符。如果是,请删除该字符。验证您的类型。如果您要检查userEmail字段,请确保其符合电子邮件语法。

一般的想法是,您可以将数据传递给客户端,但绝不会信任从客户端返回的任何数据,而无需先清理和清理所有内容。

答案 1 :(得分:0)

我找到了解决方案。 HtmlUtility.HtmlDecode对&符号&amp;&amp;&#39;之间的字符进行解码。和分号&#39 ;;&#39;。但是,浏览器并不打扰后缀&#39 ;;&#39;。

就我而言,分号&#39 ;;&#39;失踪。我编写了简单的代码来在调用HtmlDecode方法之前插入分号。现在,它按预期正确解码。