反射会发生安全漏洞吗?

时间:2013-07-26 07:46:35

标签: c# security system.reflection

假设您在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(具有操作PrintoutProducts)可以调用相同的确切函数但是传入产品清单(而不是客户)。

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

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

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

  

敌人知道系统。

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

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

当你制作可以连接到网络的软件时,隐藏某些东西以减少他们从攻击者那里得到的关注是可以的(而且通常是一个好主意),但即便如此,你应该假设某个时候是恶意用户< em>将发现它们存在,并且您应该保护它们免遭恶意使用。

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

  • 你能没有这个特殊的功能吗?
  • 你可以采用另一种方式来减少你的系统暴露吗?
  • 恶意用户是否可以使用此功能执行您不希望他们执行的操作?

如果对这些中的任何一个的回答是“是”,那么你可能不应该这样做。如果和如果所有都是“否”,那么你没事。就个人而言,我认为你忘了一条简单的规则:如果不需要从网上访问它,不要把它放在控制器中!考虑将此方法移动到逻辑层中的内部类,只有您的可信代码才能获得它。