【问题标题】:Casting a Parameter into a MVC C# Controller instead of Making a Typed Controller Action将参数强制转换为 MVC C# 控制器,而不是进行类型化控制器操作
【发布时间】:2014-03-28 02:35:08
【问题描述】:

我有一个控制器(我们称之为用户)和一个动作(我们称之为 AxGetUser)-

我想传入一个整数,所以它看起来像:

AxGetUser(int id)

但是,如果有人传入一个字符串或其他任何东西 -

我希望能够捕获它并将其记录为可能的攻击尝试。

所以我想知道。

因此,如果我的模型能够使用 INT,我知道它是一个有效的整数 - 但如果我得到的不是 int - 我想知道它,以便我可以记录它并注意有人可能是试图操纵他们发送给我的参数,以便他们可能攻击系统 -

我有什么选择?

【问题讨论】:

  • 你可以只接受一个字符串或对象,然后立即对它执行int.TryParse()

标签: c# asp.net-mvc


【解决方案1】:

看起来保护性过强,但你肯定有很多选择。

默认情况下,如果有人尝试传入字符串,ASP.NET MVC 模型绑定将传入 0。如果您想查看是否有人试图传递任何东西,您可以随时查看 Request.FormRequest.Params。问题在于该值是 Posted 还是路由的一部分。

我的意思是,您始终可以访问通过 Request 对象传入的所有数据,模型绑定只是围绕它的一种抽象。

【讨论】:

  • 这是错误的。 Method(int id) 如果传递一个字符串,将产生一个The parameters dictionary contains a null entry for parameter 'id' .. An optional parameter must be a reference type, a nullable type...。将其更改为 Method (int? id) 会按照您的建议进行(但不是 OP 所说的)。
【解决方案2】:

你应该非常小心这一点。您不想 A. 以负面的方式影响有效尝试,阻止用户继续使用您的系统,并且 B. 创建一个过于复杂的系统,从而造成实施和维护的噩梦。我建议将这些攻击作为例外而不是规则进行编程。在这种情况下,我会像往常一样构建控制器:

public ActionResult AxGetUser(int id)
{
}

然后我会使用Elmah 在我的应用程序中发生异常时进行记录。

如果您碰巧知道某人可能使用的攻击媒介,您可以构建自己的 custom model binder 并抛出将记录在 Elmah 中的特定异常,以便您可以搜索这些特定问题。

【讨论】:

    【解决方案3】:

    你有两个选择:

    第一个解决方案:为您的参数分配一个默认值,如果该值在您的代码中仍然是默认值,那么瞧,您已经发现了这种特殊情况:

    void AxGetUser(int id = 0)
    {
      if( id == 0)
       {
         //you caught him !!
       }
    }
    

    第二种解决方案:接受一个字符串参数并尝试解析它。如果解析成功,那么一切都很好,否则你有特殊情况:

    void AxGetUser(string id)
     {
      if( !int.TryParse(id))
        {
      //you caught him !!
        }
     }
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 2010-11-23
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多