2011-07-10 86 views
6

我是xss-proofing我的网站的JavaScript和xss攻击。它是用ASP.NET Webforms编写的。防止Javascript和XSS攻击

我想测试的主要部分是一个带有文本框(附带有tinyMCE)的用户控件。

用户可以通过在此文本框中写入故事到网站。我必须将validateRequest设置为false,因为我想在HMTL(tinyMCE)中获取用户的故事。

我应该如何防止javascript-xss攻击?由于用户的故事是HMTL文本,因此他们的故事不能使用Server.HtmlEncode。一般来说,接收用户的HTML内容的安全方式是什么,保存并显示给用户?

如果一个用户在文本框中放入恶意代码并提交它,这是否有可能会损害其他查看该文本的人?
谢谢。

+2

很好的问题。我不认为一个答案会为这个问题提供正当理由。在一个无关的方面注意你的验证码已过期(两年前更新)。请尝试谷歌的[recaptcha](http://www.google.com/recaptcha)。 – naveen

+0

它也不会伤害也阻止SQL注入攻击。 – Tim

+1

@Tim:EF小心照顾 – Kamyar

回答

4

如果您不清除用户在文本框中提交并提交的内容,那么是的,可能会造成伤害。

您可能想查看Microsoft Anti-Cross Site Scripting Library,因为它旨在帮助开发人员防止这种攻击。

另外值得考虑看看是OWASP的Cross-site Scripting (XSS)

你可能要考虑HttpUtility.HtmlEncode和HttpUtility.HtmlDecode为好。我只写了一个快速测试,它看起来像它可能解决在下面的评论(关于如何以正确的格式显示数据给其他用户)您的关注:

string htmlString = "<b>This is a test string</b><script>alert(\"alert!\")</script> and some other text with markup <ol><li>1234235</li></ol>"; 

string encodedString = HttpUtility.HtmlEncode(htmlString); 
// result = &lt;b&gt;This is a test string&lt;/b&gt;&lt;script&gt;alert(&quot;alert!&quot;)&lt;/script&gt; and some other text with markup &lt;ol&gt;&lt;li&gt;1234235&lt;/li&gt;&lt;/ol&gt; 

string decodedString = HttpUtility.HtmlDecode(encodedString); 
// result = <b>This is a test string</b><script>alert("alert!")</script> and some other text with markup <ol><li>1234235</li></ol> 

ASP.NET控件和的HTMLEncode 我打算发布我的课程信息,但是我发现一个链接列出了完全相同的东西(对于1.1和2.0),所以我会发布链接以便于参考。通过查看MSDN,您可能会获得关于未列出的特定控件的更多信息(如果它们已更改,则为3.0/3.5/4.0版本),但至少应该作为快速入门指南。如果您需要更多信息,请告诉我,我会看看我能找到的。

ASP.NET Controls Default HTML Encoding

下面是从的MSDN博客一个更全面的列表:Which ASP.NET Controls Automatically Encodes?

+0

谢谢。但是,如何以正确的格式将数据显示给其他用户?其实,将validateRequest设置为false让我有点担心! – Kamyar

+3

将页面的validateRequest设置为false ***如果您没有进行任何其他验证,则应该担心***您需要查看.NET中可用的编码/解码方法。我99%肯定有办法做到这一点,但我必须检查一些文档,并且他们正在工作。 – Tim

+0

谢谢。只要你有时间看看你的文档,如果你更新你的答案,我会很高兴。 – Kamyar

3

显示解码,并只与&lt;更换<时,我将与它存储在数据库中进行编码,然后去,如果你说你需要保存其他东西。

据我知道,如果你更换< XSS是不是真的有可能为任何JS代码必须是内<script>标签执行,通过更换,你会在HTML源得到这样的: &lt;script>和用户将在屏幕上看到<script>,因为浏览器将解析&lt;实体。

这就是说,如果你允许用户发布“原始”HTML例如<b>this section is bolded</b>那么你就必须建立合法的标签的“白名单”,则与例如适当的HTML手动替换&lt;

string[] allowedTags = new string[] { "a", "b", "img" }; 
foreach (allowedTag in allowedTags) 
    output = output.Replace("&lt;" + allowedTag, "<" + allowedTag); 
+1

嗯。听起来很合理。替换所有的<标签,然后扭转这个允许的标签... – Kamyar

+0

&#0060和#000000000000000060也工作..你会如何防止呢? –

+0

@Mark'&#0060'与“<”一样 - 无害,直到解码为止,所以用白名单的方式仍然是安全的,据我所知。 –