玄铁剑

成功的途径:抄,创造,研究,发明...
posts - 128, comments - 42, trackbacks - 0, articles - 174

Asp.net mvc中创建Form令牌

Posted on 2010-06-27 11:35 玄铁剑 阅读(328) 评论(0)  编辑 收藏 引用 所属分类: ASP.NET相关

在Asp.net mvc中创建Form令牌

0 star

Ruby中有提供表单的令牌token,struts中也有提供token
今天为了增加表单提交的安全性,于是也想着在mvc里面模拟一个类似token的东西。
做 法很简单,写两个filter就可以了,第一个用来产生token,并且将这个token存入Session或者Cookies中,这个filter在 action产生前触发,于是生成的页面就可以在表单里面写一个hidden域来存放这个生成的token;另外还要再写一个filter来验证表单提交 的时候hidden域中的token跟服务器端保存的token是否一致,这里可以在filter里面重写两个事件,一个在action触发之前判断,一 个在action之后,让这个token失效或者重置。

先在提交页的表单中写
<%=Html.AntiForgeryToken() %>
这样就会在客户端页面上生成一个类似


<input name="__MVC_AntiForgeryToken" type="hidden" value="FaSCzN4P+6Hg977mdOX4z9pCKOy4vlP6whi0RGD+2L9mbTNGGx4GmN36sE4klJZf" />
的隐藏域。然后只需要在action头部加上一个系统提供的过滤器,就可以达到目的了,如:

        /// <summary>
        /// /Home/Login 登陆
        /// </summary>
        [Microsoft.Web.Mvc.ValidateAntiForgeryToken]
        public void Login()
其 实这种令牌形式只是让安全性稍稍提高了一下,如果别人要外部提交表单,实际上这种方式照样可以被拦截下来。所有Request信息都是可以伪造的,所以最 好的方法还是增加底层的安全性,如果用Linq to SQL生成实体的话,那么在model那里实际上就可以做过滤了,如:

    partial class tips : ModelFilter
    {

        
partial void OntitleChanged
        {
            _title
= FilterContent(_title);
            
if (_title == string.Empty)
            {
             
  throw new Exception("not null!");
            }
        }

        partial void OncontentChanged()
        {
            _content = FilterJS(_content);
            if (_content == string.Empty)
            {
                throw new Exception("not null!");
            }
        }
    }


有 一个tips的实体,只需要写一个过滤的基类,然后tips实体继承这个基类就可以了,上面只是简单的把title过滤掉HTML标签,把content 过滤掉JS脚本,过滤一般是在Changed事件,如果放在changing事件中,赋值的时候又会把value重新赋给实体了。你也可以根据你的字段来 做过滤,如写邮件格式或者电话号码格式的验证,这些格式验证的话就可以写在changing事件。