2

假设您在 C# 中有一个函数,它允许您打印出模型的属性,如下所示:

public void Export<T>(List<T> list)
{    
    // get properties of Model
    Type modelType = typeof(T);
    var modelInstance = Activator.CreateInstance(modelType);
    PropertyInfo[] properties = modelInstance.GetType().GetProperties();

    foreach (var property in properties)
    {
        if (property.CanRead)
            PRINTOUT(property.Name);
    }

    foreach (var entity in list)
    {
        foreach (var property in properties)
        {
            if (property.CanRead)
                PRINTOUT(property.GetValue(entity, null));
        }
    }
}

现在,这个函数在一个控制器中,所以,正如我所读到的,它是一个公开的 HTTP 端点!恶意用户是否有可能询问PRINTOUT他不应该看到的属性?

为了避免这种情况,我想从另一个控制器调用这个函数,它传入一个非常特定的类型。

例如,PrintoutCustomers在控制器Customers调用该函数时,控制器Products(使用 action PrintoutProducts)也可以调用相同的函数,但传入产品列表(而不是客户)。

然后,用户将拥有一个可公开访问的 HTTP 端点的详细列表,其中没有一个会允许他做任何有害的事情。

我希望该功能是私有的并在我的所有控制器之间共享:这可能吗?我可以这样做吗?或者我真的必须在我需要的任何地方复制粘贴相同的方法(并且浪费我的时间尝试使用 typeof 和反射使其通用)?

4

2 回答 2

3

你为什么要把这个方法放在控制器中?它属于静态助手类或类似的东西。如果您想花哨的话,甚至可以将其作为扩展方法。

public static class OutputExtensions
{
    public static void Export<T>(this List<T> list)
    {
        // get properties of Model
        PropertyInfo[] properties = typeof(T).GetProperties();

        foreach (var property in properties)
        {
            if (property.CanRead)
                PRINTOUT(property.Name);
        }

        foreach (var entity in list)
        {
            foreach (var property in properties)
            {
                if (property.CanRead)
                    PRINTOUT(property.GetValue(entity, null));
            }
        }
    }
}

(此版本还包含 Trevor Pilley 在他的评论中建议的修复)

您可以在每个控制器中这样使用它:

listOfModels.Export();
于 2013-07-26T07:50:04.397 回答
2

在这种情况下,我认为香农的格言适用:

敌人知道系统。

这通常在密码算法的上下文中被引用,但它也适用于此。是的,这种方法为恶意用户提供了他们可能不知道的内容列表,但理论上,他们也可以只查询您的服务器以获取所有可能的单词组合,然后查看哪些有效;这也会给他们一个开放端点的列表。

当你离开你的房子时,你不会在你的门上伪装 - 你把它锁起来。同样的原则在这里也适用:如果有一些用户不应该做的事情,请确保您的身份验证和授权代码有效,并适当地拒绝访问您想要阻止他们进入的任何内容。简单地隐藏事物被称为通过默默无闻的安全性,简而言之,它不起作用。

当您制作可以连接到网络的软件时,隐藏某些内容以减少攻击者的注意力是可以(通常也是一个好主意),但即便如此,您也应该假设恶意用户在某个时候发现它们存在,您应该保护它们免受恶意使用。

在您的特定情况下,我会说以下内容:

  • 你可以不用这个特殊的功能吗?
  • 你能用另一种方式来减少你的系统暴露吗?
  • 恶意用户能否使用此功能做您不希望他们做的事情?

如果其中任何一个的答案是“是”,那么您可能不应该这样做。当且所有这些都是“否”时,你就没事了。就个人而言,我认为您忘记了一个简单的规则:如果不需要从 Web 访问它,请不要将它放在控制器中!考虑将此方法移至逻辑层中的内部类,只有您受信任的代码才能访问它。

于 2013-07-26T08:32:42.613 回答