Esta seção contém tudo o que fica fora do código-fonte, porém que é essencial para a segurança do produto que está sendo criado. Como os problemas tratados neste domínio não são diretamente relacionados com o código-fonte, nós o separamos dos demais domínios.
{}
na definição security
para uma operação confidencial. Isso substitui os requisitos de segurança definidos globalmente e torna a operação createUsers
vulnerável a acesso não autorizado e não autenticado.
{
"openapi": "3.0.0",
"info": {
...
},
"paths": {
"/users": {
"post": {
"security": [
{},
{
"my_auth": [
"write:users"
]
}
],
"summary": "Create a user",
"operationId": "createUsers",
...
}
...
}
}
{}
na definição security
para uma operação confidencial. Isso substitui os requisitos de segurança definidos globalmente e torna a operação createUsers
vulnerável a acesso não autorizado e não autenticado.
openapi: 3.0.0
info:
...
paths:
/users:
post:
operationId: createUsers
security:
- {}
- oauth_auth:
- write:users
- read:users
responses:
'201':
...
allow_url_fopen
permite que funções PHP que aceitam um nome de arquivo operem em arquivos remotos usando uma URL HTTP ou FTP. A opção, que foi introduzida no PHP 4.0.4 e está habilitada por padrão, é perigosa porque pode permitir que os invasores introduzam conteúdo mal-intencionado em um aplicativo. Na melhor das hipóteses, operar em arquivos remotos deixa o aplicativo suscetível a invasores que alteram o arquivo remoto para incluir conteúdo mal-intencionado. Na pior das hipóteses, se os invasores puderem controlar uma URL na qual o aplicativo opera, eles poderão injetar conteúdo mal-intencionado arbitrário no aplicativo fornecendo uma URL para um servidor remoto.$file
é controlado por um parâmetro de solicitação, um invasor pode violar as premissas do programador fornecendo uma URL para um arquivo remoto.
<?php
$file = fopen ($_GET["file"], "r");
if (!$file) {
// handle errors
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
// operate on file content
}
fclose($file);
?>
allow_url_include
permite que funções PHP que especificam um arquivo para inclusão na página atual, como include()
e require()
, aceitem uma URL HTTP ou FTP para um arquivo remoto. A opção, que foi introduzida no PHP 5.2.0 e está desabilitada por padrão, é perigosa porque pode permitir que os invasores introduzam conteúdo mal-intencionado em um aplicativo. Na melhor das hipóteses, incluir arquivos remotos deixa o aplicativo suscetível a invasores que alteram o arquivo remoto para incluir conteúdo mal-intencionado. Na pior das hipóteses, se os invasores puderem controlar uma URL que o aplicativo utiliza para especificar o arquivo remoto a ser incluído, eles poderão injetar conteúdo mal-intencionado arbitrário nesse aplicativo fornecendo uma URL para um servidor remoto.cgi.force_redirect
, que está habilitado por padrão, estiver desabilitado, os invasores com acesso a /cgi-bin/php poderão usar as permissões do interpretador PHP para acessar documentos da Web arbitrários, ignorando assim qualquer verificação de controle de acesso que teria sido realizada pelo servidor.dl
pode ser usado para contornar as restrições open_basedir
.enable_dl
permite o carregamento dinâmico de bibliotecas. Isso poderia permitir que um invasor contornasse as restrições definidas com a configuração open_basedir e, possivelmente, permitir o acesso a qualquer arquivo no sistema.enable_dl
pode tornar mais fácil para os invasores explorarem outras vulnerabilidades.file_uploads
permite que os usuários do PHP carreguem arquivos arbitrários no servidor. Permitir que os usuários carreguem arquivos não representa uma vulnerabilidade de segurança por si só. No entanto, essa capacidade pode possibilitar uma variedade ataques, pois dá aos usuários mal-intencionados um meio de introduzir dados no ambiente do servidor.
<?php
$udir = 'upload/'; // Relative path under Web root
$ufile = $udir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $ufile)) {
echo "Valid upload received\n";
} else {
echo "Invalid upload rejected\n";
} ?>
open_basedir
tenta impedir que programas PHP operem em arquivos fora das árvores de diretório especificadas em php.ini. Se nenhum diretório for especificado usando a opção open_basedir
, então os programas executados em PHP recebem acesso total a arquivos arbitrários no sistema de arquivos local, o que pode permitir que invasores leiam, gravem ou criem arquivos que eles não deveriam ser capazes de acessar.open_basedir
pode tornar mais fácil para os invasores explorarem outras vulnerabilidades.open_basedir
ser um trunfo geral para a segurança, a implementação sofre de uma condição de corrida que pode permitir que os invasores contornem suas restrições em algumas circunstâncias [2]. Existe uma condição de corrida de tempo de verificação e tempo de uso (TOCTOU) entre o momento em que o PHP executa a verificação de permissão de acesso e quando o arquivo é aberto. Tal como acontece com as condições de corrida do sistema de arquivos em outras linguagens, essa condição de corrida pode permitir que os invasores substituam um link simbólico para um arquivo que transfere uma verificação de controle de acesso por outro, sendo que de outra forma, o teste falharia, obtendo acesso ao arquivo protegido.safe_mode
está habilitada, a opção safe_mode_exec_dir
impede que o PHP execute comandos apenas dos diretórios especificados. Embora a ausência da entrada safe_mode_exec_dir
não represente por si só uma vulnerabilidade de segurança, essa complacência adicional pode ser explorada por invasores em conjunto com outras vulnerabilidades para tornar as explorações ainda mais perigosas.open_basedir
especifica o diretório de trabalho que pode ser alterado.open_basedir
tenta impedir que programas PHP operem em arquivos fora das árvores de diretórios especificadas em php.ini. Se o diretório de trabalho for especificado com .
, isso poderá ser alterado por um invasor com o uso de chdir()
.open_basedir
seja uma vantagem geral para a segurança, a implementação é afetada por uma condição de corrida que pode permitir que os invasores se esquivem de suas restrições em algumas circunstâncias [2]. Existe uma condição de corrida TOCTOU (tempo de verificação/tempo de uso) entre o momento em que o PHP realiza a verificação de permissão de acesso e o momento em que o arquivo é aberto. Tal como acontece com condições de corrida no sistema de arquivos em outras linguagens, essa condição de corrida pode permitir que os invasores substituam um link simbólico para um arquivo, aprovado em uma verificação de controle de acesso, por outro para o qual o teste seria reprovado de outra forma, obtendo assim acesso ao arquivo protegido.register_globals
faz com que o PHP registre todas as variáveis EGPCS (Ambiente, GET, POST, Cookie e Servidor) em um nível global, em que elas podem ser acessadas em qualquer escopo de qualquer programa PHP. Essa opção incentiva os programadores a escrever programas mais ou menos inconscientes da origem dos valores dos quais eles dependem, o que pode provocar comportamentos inesperados em ambientes bem-intencionados e deixar as portas abertas para invasores em ambientes mal-intencionados. Reconhecendo as perigosas implicações de segurança de register_globals
, essa opção foi desabilitada por padrão no PHP 4.2.0 e foi preterida e removida no PHP 6.$username
origina-se da sessão controlada pelo servidor, mas, em vez disso, um invasor pode fornecer um valor mal-intencionado para $username
como um parâmetro de solicitação. Com a opção register_globals
habilitada, esse código incluirá um valor mal-intencionado enviado por um invasor no conteúdo HTML dinâmico que ele gera.
<?php
if (isset($username)) {
echo "Hello <b>$username</b>";
} else {
echo "Hello <b>Guest</b><br />";
echo "Would you like to login?";
}
?>
safe_mode
é um dos recursos de segurança mais importantes no PHP. Quando safe_mode
está desabilitada, o PHP opera em arquivos com as permissões do usuário que a invocou, que muitas vezes é um usuário privilegiado. Embora a configuração do PHP com a opção safe_mode
desabilitada por si só não introduza uma vulnerabilidade de segurança, essa complacência adicional pode ser explorada por invasores em conjunto com outras vulnerabilidades para tornar as explorações ainda mais perigosas.session.use_trans_sid
faz com que o PHP transmita a ID de sessão na URL, tornando muito mais fácil para os invasores sequestrar sessões ativas ou enganar os usuários a usarem uma sessão existente que já está sob controle desses invasores.open_basedir
contém uma falha de design que a deixa vulnerável a condições de corrida de acesso a arquivos que, por sua vez, podem permitir que um invasor se esquive de verificações de controle de acesso no sistema de arquivos.open_basedir
tenta impedir que programas PHP operem em arquivos fora das árvores de diretórios especificadas em php.ini. Embora a opção open_basedir
seja uma vantagem geral para a segurança, a implementação é afetada por uma condição de corrida que pode permitir que os invasores se esquivem de suas restrições em algumas circunstâncias [2]. Existe uma condição de corrida TOCTOU (tempo de verificação/tempo de uso) entre o momento em que o PHP realiza a verificação de permissão de acesso e o momento em que o arquivo é aberto. Tal como acontece com condições de corrida no sistema de arquivos em outras linguagens, essa vulnerabilidade pode permitir que os invasores substituam um link simbólico para um arquivo, aprovado na verificação de controle de acesso, por outro para o qual o teste seria reprovado de outra forma, obtendo assim acesso ao arquivo protegido.form-bean
com o mesmo nome. Nomes duplicados de form-bean
geralmente indicam código de depuração remanescente ou um erro tipográfico.form-bean
não têm qualquer utilidade, pois apenas a última entrada será registrada quando o mesmo nome é usado em várias tags <form-bean>
.form-bean
com o mesmo nome.
<form-beans>
<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="name" type="java.lang.String" />
<form-property name="password" type="java.lang.String" />
</form-bean>
<form-bean name="loginForm" type="org.apache.struts.validator.DynaActionForm">
<form-property name="favoriteColor" type="java.lang.String" />
</form-bean>
</form-beans>
path
para localizar o recurso necessário para lidar com uma solicitação. Como o caminho é uma localização relativa ao módulo, é um erro se não começar com um caractere "/".Exemplo 2: A configuração a seguir usa um caminho que não começa com um caractere "/".
<global-exceptions>
<exception key="global.error.invalidLogin" path="" scope="request" type="InvalidLoginException" />
</global-exceptions>
<global-forwards>
<forward name="login" path="Login.jsp" />
</global-forwards>
input
para ações nomeadas do Struts que podem retornar erros de validação.input
sempre que uma ação nomeada retorna erros de validação [2]. O atributo input
especifica a página usada para exibir mensagens de erro quando ocorrem erros de validação.input
.
<action-mappings>
<action path="/Login"
type="com.LoginAction"
name="LoginForm"
scope="request"
validate="true" />
</action-mappings>
<exception>
que não contém um atributo type
não será usada.<exception>
exige que um tipo de exceção seja definido. Um atributo type
ausente ou em branco é indicativo de um manipulador de exceção supérfluo ou uma omissão acidental. Se um desenvolvedor pretendia lidar com uma exceção, mas se esqueceu de definir o tipo de exceção, o aplicativo pode vazar informações confidenciais sobre o sistema.<exception>
.
<global-exceptions>
<exception
key="error.key"
handler="com.mybank.ExceptionHandler"/>
</global-exceptions>