假设您在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和反射使其通用)?
答案 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>将发现它们存在,并且您应该保护它们免遭恶意使用。
在您的特定情况下,我会说以下内容:
如果对这些中的任何一个的回答是“是”,那么你可能不应该这样做。如果和仅如果所有都是“否”,那么你没事。就个人而言,我认为你忘了一条简单的规则:如果不需要从网上访问它,不要把它放在控制器中!考虑将此方法移动到逻辑层中的内部类,只有您的可信代码才能获得它。