1

我将 RavenDb 与 ASP.NET Web Api 一起使用,我注意到,可以使用该Load<Type>方法查询其他文档。

例如:

public class Person
{
    public string Id { get; set; }
    public string FullName { get; set; }
    /* Other properties */
}

public class Pet
{
    public string Id { get; set; }
    public string FullName { get; set; }
}

[HttpGet]
public Person FindById(string id)
{
    using (IDocumentSession session = _docStore.OpenSession())
    {
        return session.Load<Person>(id);
    }
}

如果我通过 web api 方法上的 ajax 调用 FindById("pets/13") ,我将返回一个带有 Pet 实体数据的 Person 对象,因为它们共享公共属性。我怎样才能避免这种情况?这可能会将机密数据暴露给攻击者。

即使属性不匹配,也会返回具有空属性的对象,从而暴露具有给定 id 的实体的存在。

我目前的解决方法是:

[HttpGet]
public Person FindById(string id)
{
    using (IDocumentSession session = _docStore.OpenSession())
    {
        return session.Load<Person>("people/" + id.Split('/')[1]);
    }
}
4

2 回答 2

1

来自http://ravendb.net/kb/3/using-ravendb-in-an-asp-net-mvc-website部分“路由”:

解决这个问题的最简单方法是让您的控制器使用 session.Load<>() 接受整数的版本。此函数会自动将整数值转换为完全限定的文档 ID,然后使用它执行加载操作。

public ActionResult Read(int id)
{
    var obj = RavenSession.Load<MyClass>(id);
    return View(obj);
}
于 2013-05-10T18:40:45.903 回答
1

ID 在文档中是唯一的。不要滥用这一点:您正在调用 session.Load<Person>,但您传递的是 Pet 的 ID。不要那样做。

在内部,Raven 可能正在做这样的事情:

  1. “查找 id = 'pets/13' 的 JSON 文档”
  2. 知道了!现在,把那个 JSON 文档变成……呃……开发人员要求一个人。
  3. 它有点像一个人。退回那个,因为开发商告诉我们。

基本上,您告诉 Raven 返回一个 Person,它尽其所能,将 Pet JSON 文档转换为一个 Person 对象,这正是您告诉它要做的事情。

如果您担心恶意使用 FindById 方法,如果 ID 不是 Person 对象,只需抛出异常:

[HttpGet]
public Person FindById(string id)
{
    // We're concerned someone might call FindById and fish for non-Person objects.
    if (!id.StartsWith("people/"))
    {
        throw new ArgumentException("Naughty!");
    }

    using (IDocumentSession session = _docStore.OpenSession())
    {
        return session.Load<Person>(id);
    }
}
于 2013-05-09T19:13:19.463 回答