Uma API é um contrato entre quem chama e o que se chama. As formas mais comuns de abuso de API ocorrem quando o responsável pela chamada não respeita sua parte do contrato. Por exemplo, se um programa não chama chdir() após chamar chroot(), ele viola o contrato que especifica como alterar o diretório raiz ativo de forma segura. Outro bom exemplo de abuso de biblioteca é esperar que o elemento chamado retorne informações confiáveis de DNS ao responsável pela chamada. Nesse caso, o responsável pela chamada abusa a API do elemento chamado ao fazer certas suposições sobre seu comportamento (isto é, que o valor de retorno pode ser usado para fins de autenticação). A outra parte também pode violar o contrato entre quem chama e o que se chama. Por exemplo, se um programador definir SecureRandom como subclasse e retornar um valor não aleatório, o contrato será violado.
unsecure
especifica uma lista de atributos cujos valores podem ser definidos no cliente.unsecure
desses componentes pode especificar uma lista como essa.unsecure
é disabled
e permite que o cliente defina quais componentes estão habilitados e quais não estão. Nunca é uma boa ideia deixar que o cliente controle os valores de atributos que só devem ser configuráveis no servidor.inputText
que coleta informações de senha do usuário e usa o atributo unsecure
.
...
<af:inputText id="pwdBox"
label="#{resources.PWD}"
value=""#{userBean.password}
unsecure="disabled"
secret="true"
required="true"/>
...
file://
que pode ter implicações de segurança indesejáveis.file://
. Não está claro qual deve ser seu comportamento e quais regras de compartimentalização de segurança devem ser aplicadas. Por exemplo, os arquivos HTML baixados para o disco local da Internet compartilham os mesmos cookies que qualquer código HTML instalado localmente?UseCookiePolicy()
adiciona o middleware de política de cookie ao pipeline de middleware, permitindo políticas de cookie personalizadas. Quando especificado na ordem errada, como mostrado, qualquer política de cookie indicada pelo programador será ignorada.
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseCookiePolicy();
...
UseHttpsRedirection()
adiciona o middleware de redirecionamento HTTPS ao pipeline de middleware, que permite o redirecionamento de solicitações HTTP não seguras para uma solicitação HTTPS segura. Quando especificado na ordem errada, conforme mostrado, nenhum redirecionamento HTTPS significativo ocorrerá antes de processar a solicitação por meio do middleware listado antes do redirecionamento. Isso permitirá que as solicitações HTTP sejam processadas pelo aplicativo antes de serem redirecionadas para a conexão HTTPS segura.
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseHttpsRedirection();
...
UseHttpLogging()
adiciona middleware de registro em log HTTP ao pipeline de middleware que permite que os componentes de middleware sejam registrados em log. Quando especificado na ordem errada, conforme mostrado, nenhum middleware adicionado ao pipeline antes da chamada para UseHttpLogging()
será registrado em log.Exemplo 2: O método
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseHttpLogging();
...
UseWC3Logging()
adiciona o middleware de registro em log do W3C ao pipeline de middleware que permite que os componentes de middleware sejam registrados em log. Quando especificado na ordem errada, conforme mostrado, nenhum middleware adicionado ao pipeline antes da chamada para UseWC3Logging()
será registrado em log.
...
var builder = WebApplication.CreateBuilder(...);
var app = builder.Build(...);
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
...
}
app.UseWC3Logging();
...
public ActionResult UpdateWidget(Model model)
{
// ... controller logic
}
[Required]
) e propriedades opcionais (não marcadas com o atributo [Required]
) pode provocar problemas quando um invasor comunica uma solicitação que contém mais dados que o esperado.[Required]
e propriedades sem [Required]
:
public class MyModel
{
[Required]
public String UserName { get; set; }
[Required]
public String Password { get; set; }
public Boolean IsAdmin { get; set; }
}
[Required]
) pode provocar problemas quando um invasor comunica uma solicitação que contém menos dados do que o esperado.[Required]
. Isso pode provocar o comportamento inesperado do aplicativo.
public enum ArgumentOptions
{
OptionA = 1,
OptionB = 2
}
public class Model
{
[Required]
public String Argument { get; set; }
[Required]
public ArgumentOptions Rounding { get; set; }
}
[Required]
-- e se um invasor não comunicar esse submodelo, então a propriedade pai terá um valor null
, e os campos obrigatórios do modelo filho não serão confirmados pela validação de modelo. Essa é uma das formas de ataque under-posting.
public class ChildModel
{
public ChildModel()
{
}
[Required]
public String RequiredProperty { get; set; }
}
public class ParentModel
{
public ParentModel()
{
}
public ChildModel Child { get; set; }
}
ParentModel.Child
, a propriedade ChildModel.RequiredProperty
terá um [Required]
não confirmado. Isso pode produzir resultados inesperados e indesejáveis.
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:nil
reply:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"Auth was OK");
}
}];
context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "", reply: { (success, error) -> Void in
if (success) {
print("Auth was OK");
}
else {
print("Error received: %d", error!);
}
})
SHARED
, o que permite acesso de leitura e gravação.
results = query.execute(Database.SHARED);
results = query.execute(); //missing query mode
GC.Collect()
às vezes parece fazer com que o problema desapareça.GC.Collect()
é a coisa errada a se fazer. Na verdade, chamar GC.Collect()
pode causar problemas de desempenho isso for feito com demasiada frequência.System.gc()
às vezes parece fazer com que o problema desapareça.System.gc()
é a coisa errada a se fazer. Na verdade, chamar System.gc()
pode causar problemas de desempenho isso for feito com demasiada frequência.Equals()
é chamado em um objeto que não implementa Equals()
.Equals()
em uma classe (ou qualquer superclasse/interface) que não implemente Equals()
explicitamente resulta em uma chamada para o método Equals()
herdada de System.Object
. Em vez de comparar campos membros de objetos ou outras propriedades, o Object.Equals()
compara duas instâncias de objeto para ver se elas são iguais. Embora existam usos legítimos de Object.Equals()
, muitas vezes isso é uma indicação de um código com bug.
public class AccountGroup
{
private int gid;
public int Gid
{
get { return gid; }
set { gid = value; }
}
}
...
public class CompareGroup
{
public bool compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.Equals(group2); //Equals() is not implemented in AccountGroup
}
}
equals()
é chamado em um objeto que não implementa equals()
.equals()
em uma classe (ou qualquer superclasse/interface) que não implemente equals()
explicitamente resulta em uma chamada para o método equals()
herdada de java.lang.Object
. Em vez de comparar campos membros de objetos ou outras propriedades, o Object.equals()
compara duas instâncias de objeto para ver se elas são iguais. Embora existam usos legítimos de Object.equals()
, muitas vezes isso é uma indicação de um código com bug.
public class AccountGroup
{
private int gid;
public int getGid()
{
return gid;
}
public void setGid(int newGid)
{
gid = newGid;
}
}
...
public class CompareGroup
{
public boolean compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.equals(group2); //equals() is not implemented in AccountGroup
}
}
finalize()
deve chamar super.finalize()
.finalize()
chamar super.finalize()
[1].super.finalize()
.
protected void finalize() {
discardNative();
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
getWriter()
depois de chamar getOutputStream
, ou vice-versa.HttpServletRequest
, redirecionar uma HttpServletResponse
ou descarregar o fluxo de saída do servlet faz com que o fluxo associado seja confirmado. Quaisquer redefinições de buffer ou confirmações de fluxo subsequentes, como descarregamentos ou redirecionamentos adicionais, resultarão em IllegalStateException
s.ServletOutputStream
ou PrintWriter
, mas não ambos. Chamar getWriter()
depois de ter chamado getOutputStream()
, ou vice-versa, também causará uma IllegalStateException
.IllegalStateException
impede que o manipulador de resposta seja executado até sua conclusão, eliminando eficientemente a resposta. Isso pode causar instabilidade no servidor, o que é um sinal de um servlet inadequadamente aplicado.Exemplo 2: Por outro lado, o código a seguir tenta gravar e descarregar o buffer de
public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
OutputStream out = res.getOutputStream();
...
// flushes, and thereby commits, the output stream
out.flush();
out.close(); // redirecting the response causes an IllegalStateException
res.sendRedirect("http://www.acme.com");
}
}
PrintWriter
depois que a solicitação foi encaminhada.
public class FlushServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
// forwards the request, implicitly committing the stream
getServletConfig().getServletContext().getRequestDispatcher("/jsp/boom.jsp").forward(req, res);
...
// IllegalStateException; cannot redirect after forwarding
res.sendRedirect("http://www.acme.com/jsp/boomboom.jsp");
PrintWriter out = res.getWriter();
// writing to an already-committed stream will not cause an exception,
// but will not apply these changes to the final output, either
out.print("Writing here does nothing");
// IllegalStateException; cannot flush a response's buffer after forwarding the request
out.flush();
out.close();
}
}
Content-Length
é definido como negativo.Content-Length
de um pedido indica que um programador está interessado na0
ou umContent-Length
incorreto.
URL url = nova URL("http://www.exemplo.com");
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
huc.setRequestProperty("Content-Length", "-1000");
Content-Length
é definido como negativo.Content-Length
de uma solicitação indica que um programador está interessado na0
ou umContent-Length
incorretamente como negativo:
xhr.setRequestHeader("Content-Length", "-1000");
ToString()
é chamado em um array.ToString()
em um array indica que um desenvolvedor está interessado em retornar o conteúdo do array como um String. No entanto, uma chamada direta para ToString()
em um array retornará um valor de cadeia de caracteres contendo o tipo do array.System.String[]
.
String[] stringArray = { "element 1", "element 2", "element 3", "element 4" };
System.Diagnostics.Debug.WriteLine(stringArray.ToString());
toString()
é chamado em um array.toString()
em um array indica que um desenvolvedor está interessado em retornar o conteúdo do array como um String. No entanto, uma chamada direta para toString()
em um array retornará um valor de string contendo o tipo do array e o código hash na memória.[Ljava.lang.String;@1232121
.
String[] strList = new String[5];
...
System.out.println(strList);