Segurança de software não é o mesmo que software de segurança. Aqui, estamos interessados em tópicos como autenticação, controle de acesso, confidencialidade, criptografia e gestão de privilégios.
[Authorize]
com o uso de um atributo [AllowAnonymous]
no nível de classe ou método.[Authorize]
a uma classe ou método. Além disso, o requisito de autorização especificado de uma classe ou método de aplicativo pode ser ignorado adicionando o atributo [AllowAnonymous]
. Quando ambos são especificados, o atributo [AllowAnonymous]
tem precedência e ignora o atributo [Authorize]
. Isso pode resultar no acesso arbitrário e anônimo de dados e ações confidenciais por um invasor.[AllowAnonymous]
no nível de classe substituindo um atributo [Authorize]
definido no método. O método secretAction()
não requer autorização apesar de ter o atributo [Authorize]
.Exemplo 2: O exemplo a seguir mostra o atributo
...
[AllowAnonymous]
public class Authorization_Test
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[AllowAnonymous]
no nível de classe de uma superclasse substituindo um atributo [Authorize]
definido no método de uma subclasse. Como a classe herdada Inherit_AA
tem o atributo [AllowAnonymous]
, o método secretAction()
não requer autorização, apesar de especificar o atributo [Authorize]
.Exemplo 3: A seguir é mostrado o atributo
...
[AllowAnonymous]
public abstract class Inherit_AA
{
}
public class Authorization_Test:Inherit_AA
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[AllowAnonymous]
substituindo um atributo [Authorize]
no nível do método com herança. Como o método herdado secretAction()
tem o atributo [AllowAnonymous]
, o método secretAction()
não requer autorização, apesar de especificar o atributo [Authorize]
no método de substituição.
...
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
seja selecionado em um conjunto limitado, um invasor pode defini-lo como public-read-write
e conceder acesso anônimo completo ao bucket.
...
String selectedInvoice = request.getParameter("invoiceDate");
...
AmazonSimpleDBClient sdbc = new AmazonSimpleDBClient(appAWSCredentials);
GetAttributesResult sdbResult = sdbc.getAttributes(new GetAttributesRequest("invoices", selectedInvoice));
...
Example 1
gere uma lista de faturas que pertencem ao usuário atual, um invasor pode contornar esse comportamento para solicitar qualquer fatura desejada. Como o código neste exemplo não faz nenhuma verificação para garantir que o usuário tem permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.
...
id = this.getIntent().getExtras().getInt("id");
cursor = db.query(Uri.parse(invoices), columns, "id = ? ", {id}, null, null, null);
...
id
. Embora a consulta gere uma lista de identificadores de fatura que pertencem ao usuário atual, um invasor pode ignorar esse comportamento para solicitar qualquer fatura desejada. Como o código neste exemplo não garante que o usuário tenha permissão para acessar a fatura solicitada, ele exibirá qualquer fatura, mesmo que ela não pertença ao usuário atual.DirectoryEntry de
usando uma associação anônima.
...
de = new DirectoryEntry("LDAP://ad.example.com:389/ou=People,dc=example,dc=com");
...
de
serão realizadas sem autenticação e controle de acesso. Um invasor pode ser capaz de manipular uma dessas consultas de maneira inesperada para obter acesso a registros que, de outra forma, seriam protegidos pelo mecanismo de controle de acesso do diretório.ldap_simple_bind_s()
para se associar anonimamente a um diretório LDAP.
...
rc = ldap_simple_bind_s( ld, NULL, NULL );
if ( rc != LDAP_SUCCESS ) {
...
}
...
ld
serão realizadas sem autenticação e controle de acesso. Um invasor pode ser capaz de manipular uma dessas consultas de maneira inesperada para obter acesso a registros que, de outra forma, seriam protegidos pelo mecanismo de controle de acesso do diretório.DirContext ctx
usando uma associação anônima.
...
env.put(Context.SECURITY_AUTHENTICATION, "none");
DirContext ctx = new InitialDirContext(env);
...
ctx
serão realizadas sem autenticação e controle de acesso. Um invasor pode ser capaz de manipular uma dessas consultas de maneira inesperada para obter acesso a registros que, de outra forma, seriam protegidos pelo mecanismo de controle de acesso do diretório.
...
$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
, nenhuma verificação de autorização será realizada antes do retorno das informações pessoais e de contato de um funcionário.