Stella 知识库--保护你的web程序
(觉得这篇写得还不错,于是就挂到主页来,希望诸高手指教)
-- 系列文章与Stella Forum v2.0搭配使用效果更好 -- 
就我现在掌握的知识并结合sf2来分析一下如何保护web应用程序
      1.限制用户的活动
      2.服务器端的验证
      3.代码安全
1.限制用户的活动
      这是最基本的做法,“永远不要相信用户的输入”是必须要记住的准则。用到web程序,就是要做下面的事情
a.限制用户的输入
在表示层的文本框中加入限制,禁止用户输入危险的内容。一般的做法就是使用javascript配合正则表达式来完成。在sf2中我使用了一个博客园上的
同志发表的一个通用的js方法来验证:checkform.js,这个东西大大简化了验证所需要做的事情,下面是地址:
        http://www.cnblogs.com/ttyp/archive/2005/04/06/132727.html
b.限制用户访问
某些页面是禁止一般用户访问的,比如管理页面。这个时候就需要判断登陆用户是否有权限察看该页面。一般的做法就是使用基于角色的forms验证。这个也是
很简单的几步就可以完成对程序的保护。关于这个的详细信息大家可以看我的主页上该方面的笔记,应该是比较全了。
        在这里我只说一点:
      <allow roles="adminer">
上面那一句是允许角色是adminer的用户访问。经常有人问我:系统怎么知道登陆的用户是什么角色?难道是神奇的……好了,到这里就不要想了,目前来
说.net还没有那么智能,它所能做的就是按照人的设定执行。实际情况是用户在登陆的时候,我们就执行一个操作,把存在数据库中的用户的角色取出来,然后
添加到用户的cookie中去,这样每次请求的时候都会到cookie中去检查角色的值,下面的语句就是执行了“把角色添加到cookie”的操作:
        string role=((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData;
System.Security.Principal.GenericPrincipal gp=new
System.Security.Principal.GenericPrincipal(this.Context.User.Identity,new
string[]{role});
        this.Context.User=gp;
GenericPrincipal是什么可以去看我的笔记了 :)
c.谨慎的展示数据
        有些脚本攻击真是防不胜防,这个时候在显示数据的时候最好就是原样显示,比如用htmlencode。
2.服务器端的验证
        客户端只是一个浏览器,功能有限,所以更重要的验证工作需要放到服务器端,在这里需要做的是
a.检查用户的输入
        不要详细客户端的javascript能给你做什么,如果有人对你的程序有意思,它(!)肯定会把你的网页下载下来,然后把你的javascript等东西清除了,然后把攻击代码通过你的表单传上去,这个时候服务器端的验证就很重要了。
        一般来说要做的和客户端的验证应该差不多,但是有些客户端作不了的,就需要在服务器端作。下面的是发表新帖子的时候要做的检查:
        public static string Check(Model.Art art)
  {
  if( art.Title.Length==0 )
  return "输入的标题不能为空!";
  
  art.Title=SecurityHelper.ClearScript(art.Title);
 if( art.Title.Length >50 )
  return "输入的标题不符合要求!";
  if( art.Body.Length==0 )
  return "输入的内容不能为空!";
  //先检测时间,再检测标题
  if(! checkTime())
  return "本论坛限制发帖时间间隔为"+Config.StellaConfig.NewTopicTimeSpan.ToString()+"秒,请稍候再试!";
  if(! checkCaption(art.Title))
  return "请不要重复提交相同的帖子";
art.Body=SecurityHelper.ClearScript(art.Body);
 return Config.RegExpress.Well;
  }
像检测时间和标题,清除脚本这样的任务,自然是交给服务器端来执行。
b.预防sql注入攻击
        经过前面那么多道关卡,还是会有危险的东西传过来,sql注入攻击就是其中的一个问题。到这里我们能做的,就是尽量使用参数来执行sql操作。这可以有效地防止此类攻击。
3.代码安全
        这是.net的一个特性。通过PrincipalPermission特性来限制代码的调用。
        最基本的,只有登陆用户才可以访问密码修改页面。
        [PrincipalPermission(SecurityAction.Demand,Authenticated=true)]
  public class PwdEdit : BaseSkin
然后是只有管理员才可以访问的管理页面。
        [PrincipalPermission(SecurityAction.Demand,Role="adminer")]
  public class Placard : System.Web.UI.Page
给帖子置顶的操作只有版主可以执行。只有角色是版主的会员可以调用该方法。
        [PrincipalPermission(SecurityAction.Demand,Role="manager")]
  private void topics_ItemCommand(object source, RepeaterCommandEventArgs e)
  {
  Business.TopicManager tm=new TopicManager();
  if(e.CommandName=="up")
  {
  tm.Up(Convert.ToInt32(e.CommandArgument));
  }
          
  }
关于这个得更详细内容,也可以看我的主页上的文章“60.扩展Forms验证”。
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号