将参数强制转换为mvc c#控制器,而不是制作类型化控制器动作
本文关键字:控制器 类型化 参数 转换 mvc | 更新日期: 2023-09-27 17:54:39
我有一个控制器(我们叫它Users)和一个Action(我们叫它AxGetUser) -
我想传入一个Integer,它看起来像
AxGetUser (int id)
但是,如果有人传入字符串或其他任何东西-
我希望能够捕获它并将其记录为可能的攻击企图。
所以我想了解一下。
因此,如果我的模型能够使用INT,我知道它是一个有效的整数-但如果我得到的不是INT -我想知道它,以便我可以记录它,并意识到有人可能试图操纵他们发送给我的参数,以便他们可能攻击系统-
我有什么选择?
似乎过于保护了,但你肯定有很多选择。
默认为ASP。. NET MVC模型绑定将传入一个0如果有人试图传入一个字符串。如果你想知道是否有人试图传递任何东西,你总是可以查看Request。Form或Request.Params。问题在于该值是已发布的还是路由的一部分。
我的观点是,您总是可以访问通过请求对象传入的所有数据,模型绑定只是围绕它的抽象。
你应该非常小心。您不希望a .以一种消极的方式影响有效的尝试,从而阻止用户继续使用您的系统;B.创建一个过于复杂的系统,从而造成实现和维护的噩梦。我建议将这些攻击作为例外而不是规则进行编程。在这种情况下,我会像你通常那样构建控制器:
public ActionResult AxGetUser(int id)
{
}
当应用程序中出现异常时,我会使用Elmah来记录。
如果您碰巧知道有人可能使用的攻击向量,您可以构建自己的自定义模型绑定器并抛出特定的异常,这些异常将被记录在Elmah中,以便您可以搜索那些特定的问题。
您有两个选择:
第一个解决方案:为你的参数分配一个默认值,如果这个值在你的代码中仍然是默认值,那么瞧,你已经抓住了这个特殊情况:void AxGetUser(int id = 0)
{
if( id == 0)
{
//you caught him !!
}
}
第二个解决方案:接受一个字符串参数并尝试解析它。如果解析成功,则一切正常,否则您将遇到特殊情况:
void AxGetUser(string id)
{
if( !int.TryParse(id))
{
//you caught him !!
}
}