Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
NET
Esta página pretende fornecer dicas básicas rápidas de segurança para desenvolvedores.
O .NET Framework
O .NET Framework é a principal plataforma da Microsoft para desenvolvimento
corporativo. É a API de suporte para ASP.NET, aplicativos de área de trabalho do
Windows, serviços do Windows Communication Foundation, SharePoint, Visual Studio
Tools para Office e outras tecnologias.
Atualizando o Framework
O .NET Framework é mantido atualizado pela Microsoft com o serviço Windows
Update. Os desenvolvedores normalmente não precisam executar atualizações separadas
no Framework. A atualização do Windows pode ser acessada no Windows Update ou no
programa Windows Update em um computador Windows.
Estruturas individuais podem ser mantidas atualizadas usando o NuGet . Como o Visual
Studio solicita atualizações, construa-as em seu ciclo de vida.
Lembre-se de que as bibliotecas de terceiros precisam ser atualizadas separadamente e
nem todas usam o Nuget. O ELMAH, por exemplo, requer um esforço de atualização
separado.
Data de acesso
Use comandos SQL parametrizados para todos os dados de acesso, sem exceção.
Não use o SqlCommand com um parâmetro de cadeia de caracteres composto de
uma cadeia SQL concatenada .
Whitelist valores permitidos provenientes do usuário. Use enums, TryParse ou valores
de pesquisa para garantir que os dados provenientes do usuário sejam os esperados.
Enums ainda são vulneráveis a valores inesperados porque o .NET só valida uma
conversão bem-sucedida para o tipo de dados subjacente, integer por
padrão. Enum.IsDefined pode validar se o valor de entrada é válido dentro da lista
de constantes definidas.
Aplique o princípio do menor privilégio ao configurar o usuário do banco de dados no
banco de dados de sua escolha. O usuário do banco de dados só deve poder acessar
itens que façam sentido para o caso de uso.
O uso do Entity Framework é um mecanismo de prevenção de injeção de SQL muito
eficaz . Lembre-se de que criar suas próprias consultas ad hoc no EF é tão suscetível
ao SQLi quanto uma consulta SQL simples.
Ao usar o SQL Server, prefira a autenticação integrada pela autenticação do SQL.
Use Sempre Criptografado sempre que possível para dados confidenciais (SQL Server
2016 e SQL Azure),
Encriptação
Para aplicativos Click Once, o .Net Framework deve ser atualizado para usar a versão
4.6.2 para garantir o suporte ao TLS 1.1 / 1.2.
Se você não usar o Viewstate, consulte a página mestra padrão do modelo padrão do
ASP.NET Web Forms para obter um token anti-CSRF manual usando um cookie de envio
duplo.
private const string AntiXsrfTokenKey = "__AntiXsrfToken";
private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
private string _antiXsrfTokenValue;
protected void Page_Init (object sender, EventArgs e) {
// The code below helps to protect against XSRF attacks
var requestCookie = Request.Cookies[AntiXsrfTokenKey];
Guid requestCookieGuidValue;
if (requestCookie != null && Guid.TryParse (requestCookie.Value, out
requestCookieGuidValue)) {
// Use the Anti-XSRF token from the cookie
_antiXsrfTokenValue = requestCookie.Value;
Page.ViewStateUserKey = _antiXsrfTokenValue;
} else {
// Generate a new Anti-XSRF token and save to the cookie
_antiXsrfTokenValue = Guid.NewGuid ().ToString ("N");
Page.ViewStateUserKey = _antiXsrfTokenValue;
var responseCookie = new HttpCookie (AntiXsrfTokenKey) {
HttpOnly = true,
Value = _antiXsrfTokenValue
};
if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
{
responseCookie.Secure = true;
}
Response.Cookies.Set (responseCookie);
}
Page.PreLoad += master_Page_PreLoad;
}
(string) ViewState[AntiXsrfUserNameKey] !=
(Context.User.Identity.Name ?? String.Empty)) {
throw new InvalidOperationException ("Validation of Anti-XSRF
token failed.");
}
}
}
Considere o HSTS no IIS.
No painel Conexões, acesse o site, aplicativo ou diretório para o qual você deseja
definir um cabeçalho HTTP personalizado.
No painel Início, clique duas vezes em Cabeçalhos de Resposta HTTP.
No painel Cabeçalhos de Resposta HTTP, clique em Adicionar ... no painel Ações.
Na caixa de diálogo Adicionar cabeçalho de resposta HTTP personalizado, defina o
nome e o valor do cabeçalho personalizado e clique em OK.
Esta é uma configuração web.config recomendada que lida com HSTS entre outras
coisas.
Use cookies para persistência quando possível. O Cookieless Auth será o padrão para
UseDeviceProfile.
Não confie no URI da solicitação de persistência da sessão ou autorização. Pode ser
facilmente falsificado.
Reduza o tempo limite de autenticação de formulários do padrão de 20 minutos para o
período mais curto apropriado para seu aplicativo. Se slidingExpiration for usado, esse
tempo limite será redefinido após cada solicitação, para que os usuários ativos não
sejam afetados.
Se HTTPS não for usado, o slideExpiration deverá ser desativado. Considere
desabilitar o slidingExpiration mesmo com HTTPS.
Sempre implemente controles de acesso adequados.
Compare o nome de usuário fornecido pelo usuário com User.Identity.Name.
Verifique as funções em relação a User.Identity.IsInRole.
Use o provedor de associação do ASP.NET e o provedor de função, mas revise o
armazenamento de senha. O armazenamento padrão hashes a senha com uma única
iteração de SHA-1, que é bastante fraca. O modelo ASP.NET MVC4 usa o ASP.NET
Identity em vez de ASP.NET Membership e o ASP.NET Identity usa PBKDF2 por
padrão, o que é melhor. Revise a folha de dicas do OWASP Password Storagepara
obter mais informações.
Explicitamente autorize solicitações de recursos.
Utilize a autorização baseada em função usando User.Identity.IsInRole.
A1 Injeção SQL
DO: O uso de um mapeador relacional de objeto (ORM) ou de procedimentos
armazenados é a maneira mais eficiente de combater a vulnerabilidade de Injeção de
SQL.
DO: Use consultas parametrizadas em que uma consulta SQL direta deve ser usada.
Por exemplo, em estruturas de entidades:
var sql = @"Update [User] SET FirstName = @FirstName WHERE Id = @Id";
context.Database.ExecuteSqlCommand (
sql,
new SqlParameter ("@FirstName", firstname),
new SqlParameter ("@Id", id));
NÃO: concatenar cadeias de caracteres em qualquer parte do código e executá-las no
banco de dados (conhecido como SQL dinâmico). NB: Você ainda pode fazer isso
acidentalmente com ORMs ou procedimentos armazenados, portanto, verifique em todos
os lugares.
por exemplo:
string strQry = "SELECT * FROM Users WHERE UserName='" + txtUser.Text +
"' AND Password='" + txtPassword.Text + "'";
EXEC strQry // SQL Injection vulnerability!
FAZER: Praticar o menor privilégio - Conecte-se ao banco de dados usando uma conta
com um conjunto mínimo de permissões necessárias para executar seu trabalho, ou seja,
não a conta sa
Reduza o período de tempo em que uma sessão pode ser roubada, reduzindo o tempo
limite da sessão e removendo a expiração de deslizamento:
ExpireTimeSpan = TimeSpan.FromMinutes(60),
SlidingExpiration = false
Proteger os métodos Logon, Registro e redefinição de senha contra ataques de força bruta
por meio de solicitações de limitação (consulte o código abaixo), considere também usar o
ReCaptcha.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
[AllowXRequestsEveryXSecondsAttribute (Name = "LogOn", Message = "You
have performed this action more than {x} times in the last {n} seconds.",
Requests = 3, Seconds = 60)]
public async Task<ActionResult> LogOn (LogOnViewModel model, string
returnUrl)
Install-Package AntiXSS
então defina em config:
<system.web>
<httpRuntime targetFramework="4.5"
enableVersionHeader="false"
encoderType="Microsoft.Security.Application.AntiXssEncoder,
AntiXssLibrary" maxRequestLength="4096" />
NÃO: Use o atributo [AllowHTML] ou a classe auxiliar @ Html.Raw, a menos que você
realmente saiba que o conteúdo que está sendo gravado no navegador é seguro e que foi
escapado corretamente.
DO: Habilite uma política de segurança de conteúdo, isso impedirá que suas páginas
acessem ativos que não devem ser capazes de acessar (por exemplo, um script mal-
intencionado):
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="default-
src 'none'; style-src 'self'; img-src 'self'; font-src 'self';
script-src 'self'" />
...
// Secure
public ActionResult Edit (int id) {
var user = _context.Users.FirstOrDefault (e => e.Id == id);
// Establish user has right to edit the details
if (user.Id != _userIdentity.GetUserId ()) {
HandleErrorInfo error = new HandleErrorInfo (new Exception
("INFO: You do not have permission to edit these details"));
return View ("Error", error);
}
return View ("Edit", new UserViewModel (user);
}