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事件。