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验证”。

posted on 2005-05-24 11:18  Notus|南色的风  阅读(1421)  评论(0编辑  收藏  举报