软件安全不是安全软件。此处我们关注的主题包括身份验证、Access Control、机密性、加密和权限管理。
[Authorize]
属性授予的授权,同时在类或方法级别使用 [AllowAnonymous]
属性。[Authorize]
属性,使应用程序操作需要授权。此外,通过添加 [AllowAnonymous]
属性,可以绕过应用程序类或方法的指定授权要求。当同时指定两个属性时,[AllowAnonymous]
属性优先并绕过 [Authorize]
属性。这可能会导致攻击者对敏感数据和操作进行任意匿名访问。[AllowAnonymous]
属性覆盖在方法级别设置的 [Authorize]
属性的示例。尽管具有 [Authorize]
属性,secretAction()
方法也不需要授权。示例 2:以下是在超类的类级别设置的
...
[AllowAnonymous]
public class Authorization_Test
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[AllowAnonymous]
属性覆盖在子类的方法级别设置的 [Authorize]
属性的示例。由于继承的类 Inherit_AA
具有 [AllowAnonymous]
属性,因此尽管指定了 [Authorize]
属性,secretAction()
方法也不需要授权。示例 3:以下是
...
[AllowAnonymous]
public abstract class Inherit_AA
{
}
public class Authorization_Test:Inherit_AA
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[AllowAnonymous]
属性覆盖在继承的方法级别设置的 [Authorize]
属性的示例。由于继承的方法 secretAction()
具有 [AllowAnonymous]
属性,因此尽管在覆盖方法级别指定了 [Authorize]
属性,secretAction()
方法也不需要授权。
...
public abstract class Inherit_AA
{
[AllowAnonymous]
public abstract IActionResult secretAction()
{
}
}
public class Authorization_Test:Inherit_AA
{
[Authorize]
public override IActionResult secretAction()
{
}
}
...
<apex:page controller="accessControl">
<apex:pageBlock >
<apex:pageBlockSection >
<apex:outputText value="Survey Name: "/>
<apex:inputText value="{!surveyName}"/>
</apex:pageBlockSection>
<apex:pageBlockSection >
<apex:outputText value="New Name: "/>
<apex:inputText value="{!newSurveyName}"/>
</apex:pageBlockSection>
<apex:pageBlockSection >
<apex:commandButton value="Update" action="{!updateName}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:page>
public String surveyName { get; set; }
public String newSurveyName { get; set; }
public PageReference updateName() {
Survey__c s = [SELECT Name FROM Survey__c WHERE Name=:surveyName];
s.Name = newSurveyName;
update s;
PageReference page = ApexPages.currentPage();
page.setRedirect(true);
return page;
}
String canned_acl = request.getParameter("acl");
CreateBucketRequest createBucketRequest = CreateBucketRequest.builder()
.bucket("foo")
.acl(canned_acl)
.createBucketConfiguration(CreateBucketConfiguration.builder().locationConstraint(region.id()).build())
.build();
acl
参数,攻击者也可以将其设置为 public-read-write
并授予对存储桶的完全匿名访问权限。
...
String selectedInvoice = request.getParameter("invoiceDate");
...
AmazonSimpleDBClient sdbc = new AmazonSimpleDBClient(appAWSCredentials);
GetAttributesResult sdbResult = sdbc.getAttributes(new GetAttributesRequest("invoices", selectedInvoice));
...
Example 1
中的代码生成了属于当前用户的清单列表,但是攻击者可以绕过此行为来请求任何所需的清单。由于此示例中的代码没有执行检查以确保用户具有访问所请求清单的权限,因此它会显示任何清单,即使此清单不属于当前用户。
...
id = this.getIntent().getExtras().getInt("id");
cursor = db.query(Uri.parse(invoices), columns, "id = ? ", {id}, null, null, null);
...
id
值。虽然查询生成了一个当前用户的标识符清单,但是攻击者可以绕过这一行为,从而获取所需的任意清单。因为此例中的代码没有确保用户有权访问需要的清单,所以代码会显示所有清单,即使这些清单并不属于当前用户。DirectoryEntry de
。
...
de = new DirectoryEntry("LDAP://ad.example.com:389/ou=People,dc=example,dc=com");
...
de
执行的所有 LDAP 查询都会在未经 authentication 和 access control 的情况下执行。攻击者可能会采取意想不到的方式操纵其中的某个查询,以便可以访问本应受目录 access control 机制保护的记录。ldap_simple_bind_s()
匿名绑定到一个 LDAP 目录。
...
rc = ldap_simple_bind_s( ld, NULL, NULL );
if ( rc != LDAP_SUCCESS ) {
...
}
...
ld
执行的所有 LDAP 查询都会在未经 authentication 和 access control 的情况下执行。攻击者可能会采取意想不到的方式操纵其中的某个查询,以便可以访问本应受目录 access control 机制保护的记录。DirContext ctx
。
...
env.put(Context.SECURITY_AUTHENTICATION, "none");
DirContext ctx = new InitialDirContext(env);
...
ctx
执行的所有 LDAP 查询都会在未经 authentication 和 access control 的情况下执行。攻击者可能会采取意想不到的方式操纵其中的某个查询,以便可以访问本应受目录 access control 机制保护的记录。
...
$ldapbind = ldap_bind ($ldap, $dn, $password = "" );
...
...
PARAMETERS: p_xfeld TYPE xfeld.
...
CALL FUNCTION 'BAPI_EMPLOYEE_GETDATA'
EXPORTING
employee_id = emp_id
authority_check = p_xfeld
IMPORTING
return = ret
TABLES
org_assignment = org_data
personal_data = pers_data
internal_control = con_data
communication = comm_data
archivelink = arlink.
...
p_xfeld
提供空格,则在返回员工的个人和联系信息之前不执行授权检查。