軟體安全性並非安全性軟體。我們關注驗證、Access Control、保密性、加密以及權限管理之類的主題。
[AllowAnonymous]
屬性略過 [Authorize]
屬性授予的授權。[Authorize]
屬性新增到類別或方法,允許應用程式動作要求授權。此外,應用程式類別或方法的指定授權需求也可以透過新增 [AllowAnonymous]
屬性予以略過。當 [AllowAnonymous]
屬性和 [Authorize]
屬性兩者都指定時,會以前者為優先,並略過後者。這可能導致攻擊者對敏感資料和動作進行任意且匿名的存取。[AllowAnonymous]
屬性覆寫在方法上設定的 [Authorize]
屬性。secretAction()
方法不需要授權,儘管有 [Authorize]
屬性。範例 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
提供空白字元,則在傳回員工的個人和聯絡人資訊之前不會執行授權檢查。