在我的典型的应用程序,用户点击一个按钮在aspx页,调用一个C#业务对象,然后运行的存储过程。

应该角色检查被在堆栈的顶部完成的,每一级栈或底部?如此看来,如果恶意用户可以调用一个方法,他可以调用任何,所以对于有效的安全,你需要在每一个方法的检查(这是很多额外的代码来写)。

下面是一个典型的调用栈来说明我的问题:

Page_Load()
{
  if(p.IsInRole("Managers"))  //or equivalent attribute
  {
    AddAccount.Visible =true;
  }
}

AddAccount_OnClick()
{
  if(p.IsInRole("Managers"))  //or equivalent attribute
  {
    //Add the account
    Account.Add(...);  //and maybe another role check...
  }
}

-- TSQL doesn't understand .NET authorization, this call is in a 'trusted' subsystem
create proc Add_Account @user, @account_name
If @user in (Select user from role_table where role='manager')
-- Add the account
有帮助吗?

解决方案

在我看来,你应该把它作为接近数据成为可能。越接近你的数据,就越能保证它是不可能采取一些迂回的路线,通过您的代码库,以规避访问检查。

这参数将要求的安全检查被放置在任一数据源本身,如果它支持它(如你最喜欢的RDBMS),或数据访问层。

然而,一些安全约束具有业务逻辑强的气味;例如“如果用户在此角色,并试图修改符合这些规格数据,操作应被允许,否则不能”。这听起来好像是一个政策,一些属于无论是在各种独立的规则引擎的业务逻辑层。

我写的背景下类似的东西WCF前一段时间

其他提示

从实现的角度来看,它是执行中的检查就向下堆栈作为可能的,因为有那些需要保护,因此最低数目的东西弄乱功能的最低数目的最佳解决方案,并且所有的用户输入有穿过保护层。如果你的基础是受保护的,你不用在意一切建立在这个基础上。

此解决方案具有一个缺点obviouse - 用户界面一无所知认证,授权,数据验证和所有其他的东西。因此每个输入下山堆栈,可能会导致错误,并再次上升栈通知用户。这将导致不愉快的用户体验,因为这会在用户界面很容易地检测到错误的数据传递到后端系统之后才会发现。其结果是,您将许多检查添加到用户接口,也为了给更好的用户体验。

如果您使用接口基于编程,这是没有问题的,因为可以共享应用层之间的验证码。这使您更轻松地验证代码添加到所有应用程序层,这将让你深度防御 - 在一个应用层的漏洞可以被另一层捕获。当然,如果所述验证代码本身是错误的,你分享进行的跨应用层,该错误和HANCE一个错误将可能通过所有应用程序层probagate。

我会放在角色的访问检查,在业务对象实际执行有潜在危险的/敏感的东西。

添加角色检查你的页面加载和按钮单击事件将是多余的,恕我直言。此外,如果你要保护的页面,在你的web.config使用声明的位置指示保护页面...例如把所有的“管理”页面中单独的文件夹,并保护整个文件夹,声明。

但是,你应该始终有你的业务对象方法的检查,作为最低限度。

您需要把它在方法级别。你不能假设你在任何特定的方式达到这一方法。该方法可以通过按钮的处理程序被调用,或者它可以在正常的代码为任何类型的逻辑的结果来调用。有多少次你见过像这样调用按钮处理...

private void MyBypassingCall()
{
  if( myLogic )
  {
    AddAccount_OnClick();
  }
}

所以把它放在Page_Load中是不够的。您也应该检查出装饰用 PrincipalPermissionAttribute <方法/ A>。这减少了对大量的代码。

这是它可以是多么重要,做业务方面的安全验证只是一个传闻发表评论。这是不够好,在我们的案例是有关请求黑客的低预期乐观。我们没有任何校验在我们的业务对象,并以意想不到的方式得到了烧。客户端建立了一个脚本来自动他们对我们网站的使用情况。它结束了下面那些没有实际呈现在他们的脚本预期的链接。它结束了损坏数据。当然,这更多的是一种系统状态和数据完整性问题,对我们来说不是一个安全漏洞,但我想这两个真正适用。

的业务对象。

但在施工时间。让每个实例捕获一个非常特殊的作用。

编辑:更简洁这样

scroll top