gpt4 book ai didi

c# - 反射会导致安全漏洞吗?

转载 作者:行者123 更新时间:2023-12-02 21:55:34 24 4
gpt4 key购买 nike

假设您有一个 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));
}
}
}

现在,这个函数位于 Controller 中,因此,正如我所读到的,它是一个公开的 HTTP 端点!恶意用户是否有可能请求PRINTOUT他不应该看到的属性?

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

例如, Controller Customers 中的 PrintoutCustomers 调用该函数,同时 Controller Products 也调用该函数(使用操作 PrintoutProducts code>) 可以调用完全相同的函数,但传入产品列表(而不是客户)。

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

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

最佳答案

为什么要将该方法放入 Controller 中?它属于静态帮助器类或类似的类。如果您愿意,您甚至可以将其作为扩展方法。

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 在评论中建议的修复)

您可以在每个 Controller 中这样使用它:

listOfModels.Export();

关于c# - 反射会导致安全漏洞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17875743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com