More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  Easy Start To The DayProfileFriendsBlogMore Tools Explore the Spaces community
View space
Yings
View space
Ed
View space
小三
View space
Rosiness
View space
Jay
View space
Stephanie
View space
maple
View space
賤兔の家

Easy Start To The Day

祝您平安, 快乐, 幸福! Please stay in touch. Thanks for all the memories!

致各位:


各位兄弟姐妹:

在春暖花开, 祖国两会召开的日子里, 我的空间竟然奇迹般的解禁了, 访问量也立刻上去了, 奇怪...
 
但是, 劳烦各位有问题还是到我的新家  -- 是的, 我开了分基地, 人族虽然比不上虫族的扩张速度, 但是开个分基地造俩防控啥的还是有必要的, 免得主基地再被我们伟大的神族掐断网络传输...
 
如果有站内信件, 请到  http://belemview.spaces.live.com/ 发送.

TRUE●爱

情人节又悄然而至。

节日总是残酷的,有人欢歌就注定有人悲泣。

不过无论以怎样的方式,都是因了有爱存在。

好像我,这一刻的心,不想哭,不想笑,无爱,所以无悲亦无喜。

广播,电视,一遍遍的情歌,一遍遍的真情告白,听了,一笑而过。

难得有爱,尤其真爱。

今晚,此刻,衷心祝愿真爱中的人幸福。

最后一篇日志


这是在 http://gb2312.spaces.live.com 的最后一篇日志.

由于种种原因, BELEM的gb2312的空间固定链接/评论页面中国大陆用户完全不能访问, 因此只得开辟新战场, 全新的 Easy Start To The Day (http://belemview.spaces.live.com)  真诚地欢迎您!!!

值此搬新家之际, 特发布 http://lieb.cn/PublishEntry/ (发布日志到您的共享空间) 工具, 以帮助"日志发布按钮为灰色不能激活"的用户.

刚做没几分钟, 没有做任何debug 工作 (Opera/Firefox支持不好 - Known Issue - Won't Fix).

警告:为了安全请不要随意将ASP.Net的validateRequest="false"


Quote:

ASP.Net 1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用<xxxx>之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个 HttpRequestValidationExceptioin。默认情况下会返回如下文字的页面:

Server Error in '/YourApplicationPath' Application

A potentially dangerous Request.Form value was detected from the client
(txtName="<b>").


Description: Request Validation has detected a potentially dangerous client input value, and processing of the request has been aborted. This value may indicate an attempt to compromise the security of your application, such as a cross-site scripting attack. You can disable request validation by setting validateRequest=false in the Page directive or in the configuration section. However, it is strongly recommended that your application explicitly check all inputs in this case.

Exception Details: System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (txtName="<b>").

....


这是ASP.Net提供的一个很重要的安全特性。因为很多程序员对安全没有概念,甚至都不知道XSS这种攻击的存在,知道主动去防护的就更少了。ASP.Net在这一点上做到默认安全。这样让对安全不是很了解的程序员依旧可以写出有一定安全防护能力的网站。

但是,当我Google搜索 HttpRequestValidationException 或者 "A potentially dangerous Request.Form value was detected from the client"的时候,惊奇的发现大部分人给出的解决方案竟然是在ASP.Net页面描述中通过设置 validateRequest=false 来禁用这个特性,而不去关心那个程序员的网站是否真的不需要这个特性。看得我这叫一个胆战心惊。安全意识应该时时刻刻在每一个程序员的心里,不管你对安全的概念了解多少,一个主动的意识在脑子里,你的站点就会安全很多。

为什么很多程序员想要禁止 validateRequest 呢?有一部分是真的需要用户输入"<>"之类的字符。这就不必说了。还有一部分其实并不是用户允许输入那些容易引起XSS的字符,而是讨厌这种报错的形式,毕竟一大段英文加上一个ASP.Net典型异常错误信息,显得这个站点出错了,而不是用户输入了非法的字符,可是自己又不知道怎么不让它报错,自己来处理报错。

对于希望很好的处理这个错误信息,而不使用默认ASP.Net异常报错信息的程序员们,你们不要禁用validateRequest=false。

正确的做法是在你当前页面添加Page_Error()函数,来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。如果当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。

举例而言,处理这个异常其实只需要很简短的一小段代码就够了。在页面的Code-behind页面中加入这么一段代码:
 
protected void Page_Error(object sender, EventArgs e)
...{
    Exception ex 
= Server.GetLastError();
    
if (ex is HttpRequestValidationException)
    
...{
        Response.Write(
"请您输入合法字符串。");
        Server.ClearError(); 
// 如果不ClearError()这个异常会继续传到Application_Error()。
    }

}


这样这个程序就可以截获 HttpRequestValidationException 异常,而且可以按照程序员的意愿返回一个合理的报错信息。

这段代码很简单,所以我希望所有不是真的要允许用户输入<xxx>之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。

而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。

关于存在Rich Text Editor的页面应该如何处理?

如果页面有富文本编辑器的控件的,那么必然会导致有<xxx>类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?

根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。

首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。

然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有"<b>"标签,那么我们就将"&lt;b&gt;"显式的替换回"<b>"。

示例代码如下:
  void submitBtn_Click(object sender, EventArgs e)
  
...{
    
// 将输入字符串编码,这样所有的HTML标签都失效了。
    StringBuilder sb = new StringBuilder(
                            HttpUtility.HtmlEncode(htmlInputTxt.Text));
    
// 然后我们选择性的允许<b> 和 <i>
    sb.Replace("&lt;b&gt;", "<b>");
    sb.Replace("&lt;/b&gt;", "");
    sb.Replace("&lt;i&gt;", "<i>");
    sb.Replace("&lt;/i&gt;", ""
);
    Response.Write(sb.ToString());
  }

这样我们即允许了部分HTML标签,又禁止了危险的标签。

根据微软提供的建议,我们要慎重允许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。

  • <applet>
  • <body>
  • <embed>
  • <frame>
  • <script>
  • <frameset>
  • <html>
  • <iframe>
  • <img>
  • <style>
  • <layer>
  • <link>
  • <ilayer>
  • <meta>
  • <object>
可能这里最让人不能理解的是<img>。但是,看过下列代码后,就应该明白其危险性了。

<img src="javascript:alert('hello');">
<img src="java&#010;script:alert('hello');">
<img src="java&#X0A;script:alert('hello');">


通过<img>标签是有可能导致Javascript执行的,这样攻击者就可以做他想伪装的任何事情。

关于<style>也是一样:

<style TYPE="text/javascript">...
  alert('hello');
</style>


参考:

HOW TO: 使用 Visual C# .NET 在 ASP.NET 中创建自定义错误报告
http://support.microsoft.com/kb/306355/zh-cn

HttpRequestValidationException 类 (System.Web)
http://msdn2.microsoft.com/zh-cn/library/system.web.httprequestvalidationexception(VS.80).aspx


MSDN: How To: Prevent Cross-Site Scripting in ASP.NET
http://msdn2.microsoft.com/en-us/library/ms998274.aspx

推荐大家阅读微软关于.Net安全的一系列文章:
http://msdn2.microsoft.com/en-us/library/ms978512.aspx

关于跨站脚本攻击请参考:

Wikipedia 维基大百科全书
http://en.wikipedia.org/wiki/Cross_site_scripting

Xfocus
http://www.xfocus.org/articles/200607/874.html

Google
http://www.google.com/search?q=%E8%B7%A8%E7%AB%99%E8%84%9A%E6%9C%AC%E6%94%BB%E5%87%BB


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1560171

View more entries