IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
...
author = request->get_form_field( 'author' ).
response->set_cookie( name = 'author' value = author ).
...
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, de uma solicitação HTTP, e o define em um cabeçalho de cookie de uma resposta HTTP.
...
Cookie cookie = new Cookie('author', author, '/', -1, false);
ApexPages.currentPage().setCookies(new Cookie[] {cookie});
...
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
author
não contiver caracteres de CR e LF. Se um invasor enviar uma cadeia de caracteres mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
protected System.Web.UI.WebControls.TextBox Author;
...
string author = Author.Text;
Cookie cookie = new Cookie("author", author);
...
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
<cfcookie name = "author"
value = "#Form.author#"
expires = "NOW">
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
...
author := request.FormValue("AUTHOR_PARAM")
cookie := http.Cookie{
Name: "author",
Value: author,
Domain: "www.example.com",
}
http.SetCookie(w, &cookie)
...
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma cadeia de caracteres mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
String author = request.getParameter(AUTHOR_PARAM);
...
Cookie cookie = new Cookie("author", author);
cookie.setMaxAge(cookieExpiration);
response.addCookie(cookie);
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
Example 1
à plataforma Android.Desfiguração entre Usuários: Um invasor poderá fazer uma única solicitação a um servidor vulnerável, fazendo com que esse servidor crie duas respostas. A segunda pode ser interpretada como uma resposta a uma solicitação diferente, possivelmente feita por outro usuário que compartilha a mesma conexão TCP com o servidor. Isso pode ser feito, convencendo o usuário a enviar a solicitação mal-intencionada por conta própria ou remotamente em situações nas quais o invasor e o usuário compartilham uma conexão TCP comum com o servidor, como um servidor proxy compartilhado. Na melhor das hipóteses, um invasor pode aproveitar essa habilidade para convencer os usuários de que o aplicativo foi invadido, fazendo com que eles percam a confiança na segurança deste último. Na pior das hipóteses, um invasor pode fornecer um conteúdo especialmente elaborado, projetado para imitar o comportamento do aplicativo, mas redirecionar informações privadas, como números de contas e senhas, de volta para ele.
...
CookieManager webCookieManager = CookieManager.getInstance();
String author = this.getIntent().getExtras().getString(AUTHOR_PARAM);
String setCookie = "author=" + author + "; max-age=" + cookieExpiration;
webCookieManager.setCookie(url, setCookie);
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
author = form.author.value;
...
document.cookie = "author=" + author + ";expires="+cookieExpiration;
...
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
<?php
$author = $_GET['AUTHOR_PARAM'];
...
header("author: $author");
?>
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
location = req.field('some_location')
...
response.addHeader("location",location)
HTTP/1.1 200 OK
...
location: index.html
...
some_location
não tiver nenhum caractere CR e LF. Se um invasor enviar uma cadeia de caracteres mal-intencionada, como "index.html\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas da seguinte forma:
HTTP/1.1 200 OK
...
location: index.html
HTTP/1.1 200 OK
...
IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impedir a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não será vulnerável à HTTP Response Splitting. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Cookie Manipulation ou Open Redirects e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.IllegalArgumentException
se você tentar definir um cabeçalho com caracteres proibidos. Se o seu servidor de aplicativos impede a definição de cabeçalhos com caracteres de nova linha, seu aplicativo não é vulnerável à Divisão de Respostas HTTP. No entanto, uma simples filtragem em busca de caracteres de nova linha pode deixar um aplicativo vulnerável à Manipulação de Cookie ou a Redirecionamentos Abertos e, por isso, ainda é necessário ter cautela ao definir cabeçalhos HTTP com entradas do usuário.author
, a partir de uma solicitação HTTP e o define em um cabeçalho de cookie de uma resposta HTTP.
...
author = Request.Form(AUTHOR_PARAM)
Response.Cookies("author") = author
Response.Cookies("author").Expires = cookieExpiration
...
HTTP/1.1 200 OK
...
Set-Cookie: author=Jane Smith
...
AUTHOR_PARAM
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Wiley Hacker\r\nHTTP/1.1 200 OK\r\n...", a resposta HTTP será dividida em duas respostas com o seguinte formato:
HTTP/1.1 200 OK
...
Set-Cookie: author=Wiley Hacker
HTTP/1.1 200 OK
...
CC
ou BCC
, que eles podem usar para vazar o conteúdo do e-mail para eles mesmos ou usar o servidor de correio como um bot de spam.CC
com uma lista de endereços de e-mail para distribuição anônima como spam, já que o e-mail será enviado a partir do servidor da vítima.
func handler(w http.ResponseWriter, r *http.Request) {
subject := r.FormValue("subject")
body := r.FormValue("body")
auth := smtp.PlainAuth("identity", "user@example.com", "password", "mail.example.com")
to := []string{"recipient@example.net"}
msg := []byte("To: " + recipient1 + "\r\n" + subject + "\r\n" + body + "\r\n")
err := smtp.SendMail("mail.example.com:25", auth, "sender@example.org", to, msg)
if err != nil {
log.Fatal(err)
}
}
...
subject: [Contact us query] Page not working
...
subject
não contiver caracteres de CR e LF. Se um invasor enviar uma string mal-intencionada, como "Parabéns!! Você ganhou na loteria!!!\r\ncc:victim1@mail.com,victim2@mail.com ...", os cabeçalhos SMTP serão:
...
subject: [Contact us query] Congratulations!! You won the lottery
cc: victim1@mail.com,victim2@mail.com
...
CC
ou BCC
, que eles podem usar para deixar vazar o conteúdo de e-mails para si ou que podem usar o servidor de e-mail como um robô de spam.CC
com uma lista de endereços de e-mail para distribuição anônima como spam, já que o e-mail será enviado a partir do servidor da vítima.
String subject = request.getParameter("subject");
String body = request.getParameter("body");
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("webform@acme.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("support@acme.com"));
message.setSubject("[Contact us query] " + subject);
message.setText(body);
Transport.send(message);
...
subject: [Contact us query] Page not working
...
subject
não contiver caracteres de CR e LF. Se um invasor enviasse uma string mal-intencionada, como "Parabéns!!! Você ganhou na loteria!!!\r\ncc:victim1@mail.com,victim2@mail.com ...", os cabeçalhos SMTP teriam o seguinte formato:
...
subject: [Contact us query] Congratulations!! You won the lottery
cc: victim1@mail.com,victim2@mail.com
...
CC
ou BCC
, que eles podem usar para deixar vazar o conteúdo de e-mails para si ou que podem usar o servidor de e-mail como um robô de spam.CC
com uma lista de endereços de e-mail para distribuição anônima como spam, já que o e-mail será enviado a partir do servidor da vítima.
$subject = $_GET['subject'];
$body = $_GET['body'];
mail("support@acme.com", "[Contact us query] " . $subject, $body);
...
subject: [Contact us query] Page not working
...
subject
não contiver caracteres de CR e LF. Se um invasor enviasse uma string mal-intencionada, como "Parabéns!!! Você ganhou na loteria!!!\r\ncc:victim1@mail.com,victim2@mail.com ...", os cabeçalhos SMTP teriam o seguinte formato:
...
subject: [Contact us query] Congratulations!! You won the lottery
cc: victim1@mail.com,victim2@mail.com
...
CC
ou BCC
, que eles podem usar para deixar vazar o conteúdo de e-mails para si ou que podem usar o servidor de e-mail como um robô de spam.CC
com uma lista de endereços de e-mail para distribuição anônima como spam, já que o e-mail será enviado a partir do servidor da vítima.
body = request.GET['body']
subject = request.GET['subject']
session = smtplib.SMTP(smtp_server, smtp_tls_port)
session.ehlo()
session.starttls()
session.login(username, password)
headers = "\r\n".join(["from: webform@acme.com",
"subject: [Contact us query] " + subject,
"to: support@acme.com",
"mime-version: 1.0",
"content-type: text/html"])
content = headers + "\r\n\r\n" + body
session.sendmail("webform@acme.com", "support@acme.com", content)
...
subject: [Contact us query] Page not working
...
subject
não contiver caracteres de CR e LF. Se um invasor enviasse uma string mal-intencionada, como "Parabéns!!! Você ganhou na loteria!!!\r\ncc:victim1@mail.com,victim2@mail.com ...", os cabeçalhos SMTP teriam o seguinte formato:
...
subject: [Contact us query] Congratulations!! You won the lottery
cc: victim1@mail.com,victim2@mail.com
...
HtmlInputHidden hidden = new HtmlInputHidden();
Hidden hidden = new Hidden(element);
<input>
do tipo hidden
indica o uso de um campo oculto.
<input type="hidden">
X-XSS-Protection
normalmente é habilitado por padrão em navegadores modernos. Quando o valor do cabeçalho está definido como false (0), a proteção contra cross-site scripting está desabilitada.X-XSS-Protection
é explicitamente desabilitado, o que pode aumentar o risco de ataques de cross-site scripting.X-XSS-Protection
normalmente é habilitado por padrão em navegadores modernos. Quando o valor do cabeçalho está definido como false (0), a proteção contra cross-site scripting está desabilitada.
<http auto-config="true">
...
<headers>
...
<xss-protection xss-protection-enabled="false" />
</headers>
</http>
X-XSS-Protection
é explicitamente desabilitado, o que pode aumentar o risco de ataques de cross-site scripting.X-XSS-Protection
normalmente é habilitado por padrão em navegadores modernos. Quando o valor do cabeçalho está definido como false (0), a proteção contra cross-site scripting está desabilitada.X-XSS-Protection
é explicitamente desabilitado, o que pode aumentar o risco de ataques de cross-site scripting.X-XSS-Protection
normalmente é habilitado por padrão em navegadores modernos. Quando o valor do cabeçalho está definido como false (0), a proteção contra cross-site scripting está desabilitada.Application_BeginRequest
está vazio ou não inclui uma chamada de função para definir X-Content-Type-Options
como nosniff
, ou tenta remover esse cabeçalho.X-Content-Type-Options: nosniff
.X-Content-Type-Options
como nosniff
..X-Content-Type-Options: nosniff
para cada página que possa ter conteúdo controlável pelo usuário.net.http.DetectContentType()
para determinar a resposta Content-Type:
...
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
content_type := DetectContentType(body)
...
X-Content-Type-Options
como nosniff
ou desabilita esse cabeçalho de segurança explicitamente.X-Content-Type-Options: nosniff
.
<http auto-config="true">
...
<headers>
...
<content-type-options disabled="true"/>
</headers>
</http>
X-Content-Type-Options
como nosniff
ou desabilita esse cabeçalho de segurança explicitamente.X-Content-Type-Options: nosniff
em cada página que poderia conter conteúdo controlado pelo usuário.X-Content-Type-Options
como nosniff
ou desabilita esse cabeçalho de segurança explicitamente.X-Content-Type-Options: nosniff
em cada página que poderia conter conteúdo controlado pelo usuário.X-Frame-Options
para indicar ao navegador se o aplicativo deve ser enquadrado. Se você desabilitar ou não definir esse cabeçalho, isso poderá levar a vulnerabilidades entre quadros.X-Frame-Options
:
<http auto-config="true">
...
<headers>
...
<frame-options disabled="true"/>
</headers>
</http>
script-src
, img-src
, object-src
, style_src
, font-src
, media-src
, frame-src
, connect-src
. Essas oito diretivas usam uma lista de fontes como um valor que especifica domínios que o site pode acessar para um recurso abrangido por essa diretiva. Os desenvolvedores podem usar um curinga *
para indicar a totalidade da fonte ou parte dela. Palavras-chave adicionais da lista de fontes, como 'unsafe-inline'
e 'unsafe-eval'
, fornecem um controle mais granular sobre a execução do script, mas são potencialmente prejudiciais. Nenhuma das diretrizes é obrigatória. Os navegadores permitem todas as fontes para uma diretiva não listada ou derivam seu valor da diretiva opcional default-src
. Ademais, a especificação para esse cabeçalho tem evoluído ao longo do tempo. Ela foi implementada como X-Content-Security-Policy
no Firefox até a versão 23 e no IE até a versão 10, e foi implementada como X-Webkit-CSP
no Chrome até a versão 25. Esses dois nomes foram substituídos pelo atual nome padrão Content Security Policy
. Dada a quantidade de diretivas, dois nomes alternativos obsoletos, e a forma como várias ocorrências do mesmo cabeçalho e diretivas repetidas em um único cabeçalho são tratados, há uma alta probabilidade de que um desenvolvedor possa configurar mal esse cabeçalho.default-src
excessivamente flexível e insegura:
<http auto-config="true">
...
<headers>
...
<content-security-policy policy-directives="default-src '*'" />
</headers>
</http>
script-src
, img-src
, object-src
, style_src
, font-src
, media-src
, frame-src
, connect-src
. Essas oito diretivas usam uma lista de fontes como um valor que especifica domínios que o site pode acessar para um recurso abrangido por essa diretiva. Os desenvolvedores podem usar um curinga *
para indicar a totalidade da fonte ou parte dela. Palavras-chave adicionais da lista de fontes, como 'unsafe-inline'
e 'unsafe-eval'
, fornecem um controle mais granular sobre a execução do script, mas são potencialmente prejudiciais. Nenhuma das diretrizes é obrigatória. Os navegadores permitem todas as fontes para uma diretiva não listada ou derivam seu valor da diretiva opcional default-src
. Ademais, a especificação para esse cabeçalho tem evoluído ao longo do tempo. Ela foi implementada como X-Content-Security-Policy
no Firefox até a versão 23 e no IE até a versão 10, e foi implementada como X-Webkit-CSP
no Chrome até a versão 25. Esses dois nomes foram substituídos pelo atual nome padrão Content Security Policy
. Dada a quantidade de diretivas, dois nomes alternativos obsoletos, e a forma como várias ocorrências do mesmo cabeçalho e diretivas repetidas em um único cabeçalho são tratados, há uma alta probabilidade de que um desenvolvedor possa configurar mal esse cabeçalho.*-src
foi configurada com uma política excessivamente permissiva, como *
Exemplo 1: Esta configuração django-csp
define uma diretiva default-src
excessivamente permissiva e insegura:
...
MIDDLEWARE = (
...
'csp.middleware.CSPMiddleware',
...
)
...
CSP_DEFAULT_SRC = ("'self'", '*')
...
Access-Control-Allow-Origin
é definido. Com esse cabeçalho, um servidor Web define quais outros domínios podem acessar seu domínio usando solicitações entre origens. No entanto, tenha cuidado ao definir o cabeçalho, pois uma política de CORS excessivamente flexível pode permitir que um aplicativo mal-intencionado se comunique inadequadamente com o aplicativo vítima, o que pode levar a falsificação, roubo de dados, retransmissão e outros ataques.
Response.AppendHeader("Access-Control-Allow-Origin", "*");
*
como valor do cabeçalho Access-Control-Allow-Origin
indica que os dados do aplicativo são acessíveis ao JavaScript em execução em qualquer domínio.Access-Control-Allow-Origin
está definido. Com esse cabeçalho, um servidor Web define quais outros domínios podem acessar seu domínio usando solicitações entre origens. No entanto, tenha cuidado ao definir o cabeçalho, pois uma política de CORS excessivamente flexível pode permitir que um aplicativo mal-intencionado se comunique inadequadamente com o aplicativo vítima, o que pode levar a falsificação, roubo de dados, retransmissão e outros ataques.
<websocket:handlers allowed-origins="*">
<websocket:mapping path="/myHandler" handler="myHandler" />
</websocket:handlers>
*
como o valor do cabeçalho Access-Control-Allow-Origin
indica que os dados do aplicativo podem ser acessados pelo JavaScript em execução em qualquer domínio.Access-Control-Allow-Origin
é definido. Com esse cabeçalho, um servidor Web define quais outros domínios podem acessar seu domínio usando solicitações entre origens. No entanto, tenha cuidado ao definir o cabeçalho, pois uma política de CORS excessivamente flexível pode permitir que um aplicativo mal-intencionado se comunique inadequadamente com o aplicativo vítima, o que pode levar a falsificação, roubo de dados, retransmissão e outros ataques.
<?php
header('Access-Control-Allow-Origin: *');
?>
*
como valor do cabeçalho Access-Control-Allow-Origin
indica que os dados do aplicativo são acessíveis ao JavaScript em execução em qualquer domínio.Access-Control-Allow-Origin
é definido. Com esse cabeçalho, um servidor Web define quais outros domínios podem acessar seu domínio usando solicitações entre origens. No entanto, tenha cuidado ao definir o cabeçalho, pois uma política de CORS excessivamente flexível pode permitir que um aplicativo mal-intencionado se comunique inadequadamente com o aplicativo vítima, o que pode levar a falsificação, roubo de dados, retransmissão e outros ataques.
response.addHeader("Access-Control-Allow-Origin", "*")
*
como valor do cabeçalho Access-Control-Allow-Origin
indica que os dados do aplicativo são acessíveis ao JavaScript em execução em qualquer domínio.Access-Control-Allow-Origin
é definido. Com esse cabeçalho, um servidor Web define quais outros domínios podem acessar seu domínio usando solicitações entre origens. No entanto, tenha cuidado ao definir o cabeçalho, pois uma política de CORS excessivamente flexível pode permitir que um aplicativo mal-intencionado se comunique inadequadamente com o aplicativo vítima, o que pode levar a falsificação, roubo de dados, retransmissão e outros ataques.
play.filters.cors {
pathPrefixes = ["/some/path", ...]
allowedOrigins = ["*"]
allowedHttpMethods = ["GET", "POST"]
allowedHttpHeaders = ["Accept"]
preflightMaxAge = 3 days
}
*
como valor do cabeçalho Access-Control-Allow-Origin
indica que os dados do aplicativo são acessíveis ao JavaScript em execução em qualquer domínio.Access-Control-Allow-Origin
é definido. Com esse cabeçalho, um servidor Web define quais outros domínios podem acessar seu domínio usando solicitações entre origens. No entanto, tenha cuidado ao definir o cabeçalho, pois uma política de CORS excessivamente flexível pode permitir que um aplicativo mal-intencionado se comunique inadequadamente com o aplicativo vítima, o que pode levar a falsificação, roubo de dados, retransmissão e outros ataques.
Response.AddHeader "Access-Control-Allow-Origin", "*"
*
como valor do cabeçalho Access-Control-Allow-Origin
indica que os dados do aplicativo são acessíveis ao JavaScript em execução em qualquer domínio.
WebMessage message = new WebMessage(WEBVIEW_MESSAGE);
webview.postWebMessage(message, Uri.parse("*"));
*
como o valor da origem pretendida indica que o script está enviando uma mensagem a uma janela, independentemente da respectiva origem.
o.contentWindow.postMessage(message, '*');
*
como o valor da origem pretendida indica que o script está enviando uma mensagem a uma janela, independentemente da respectiva origem.Unsafe-URL
, isso poderá fazer com que os aplicativos exponham dados confidenciais de sites e de usuários (incluindo token de sessão, nomes de usuário e senhas) a sites de terceiros.Referrer-Policy
é introduzido para controlar o comportamento do navegador em relação ao cabeçalho do referenciador. A opção Unsafe-URL
remove todas as restrições e envia o cabeçalho do referenciador com cada solicitação.
<http auto-config="true">
...
<headers>
...
<referrer-policy policy="unsafe-url"/>
</headers>
</http>
Content-Security-Policy-Report-Only
fornece a autores e administradores de aplicativos Web a capacidade de monitorar políticas de segurança, em vez de impô-las. Esse cabeçalho geralmente é usado ao serem experimentadas e/ou desenvolvidas políticas de segurança para um site. Quando uma política é considerada efetiva, você pode impô-la usando o campo de cabeçalho Content-Security-Policy
.Report-Only
:
<http auto-config="true">
...
<headers>
...
<content-security-policy report-only="true" policy-directives="default-src https://content.cdn.example.com" />
</headers>
</http>
Content-Security-Policy-Report-Only
fornece a autores e administradores de aplicativos Web a capacidade de monitorar políticas de segurança, em vez de impô-las. Esse cabeçalho geralmente é usado ao serem experimentadas e/ou desenvolvidas políticas de segurança para um site. Quando uma política é considerada efetiva, você pode impô-la usando o cabeçalho Content-Security-Policy
.Report-Only
:
response.content_security_policy_report_only = "*"
...
String lang = Request.Form["lang"];
WebClient client = new WebClient();
client.BaseAddress = url;
NameValueCollection myQueryStringCollection = new NameValueCollection();
myQueryStringCollection.Add("q", lang);
client.QueryString = myQueryStringCollection;
Stream data = client.OpenRead(url);
...
lang
como en&poll_id=1
e, em seguida, conseguisse alterar poll_id
à vontade.
...
String lang = request.getParameter("lang");
GetMethod get = new GetMethod("http://www.example.com");
get.setQueryString("lang=" + lang + "&poll_id=" + poll_id);
get.execute();
...
lang
como en&poll_id=1
e, em seguida, fosse capaz de alterar poll_id
à vontade.
<%
...
$id = $_GET["id"];
header("Location: http://www.host.com/election.php?poll_id=" . $id);
...
%>
name=alice
, mas adicionou name=alice&
e, se isso estiver em uso em um servidor que obtém a primeira ocorrência, ele poderá representar alice
para obter mais informações sobre a conta dela.
<authorization>
<allow verbs="GET,POST" users="admin"/>
<deny verbs="GET,POST"users="*" />
</authorization>
<security-constraint>
<display-name>Admin Constraint</display-name>
<web-resource-collection>
<web-resource-name>Admin Area</web-resource-name>
<url-pattern>/pages/index.jsp</url-pattern>
<url-pattern>/admin/*.do</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>only admin</description>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<http-method>
nessa configuração, pode ser possível exercer a funcionalidade administrativa substituindo as solicitações GET ou POST por solicitações HEAD. Para que as solicitações HEAD exerçam a funcionalidade administrativa, a condição 3 deve ser mantida - o aplicativo deve executar comandos baseados em verbos diferentes de POST. Alguns servidores web/de aplicativos aceitarão verbos HTTP não padrão arbitrários e responderão como se tivessem recebido uma solicitação GET. Se for esse o caso, um invasor poderá ver as páginas administrativas usando um verbo arbitrário em uma solicitação.
GET /admin/viewUsers.do HTTP/1.1
Host: www.example.com
FOO /admin/viewUsers.do HTTP/1.1
Host: www.example.com
private
e final
e, em seguida, cria erroneamente um método que transforma o Set.
@Immutable
public final class ThreeStooges {
private final Set stooges = new HashSet>();
...
public void addStooge(String name) {
stooges.add(name);
}
...
}
final
.Immutable
do pacote de anotações JCIP. Um campo não final viola a imutabilidade da classe permitindo que o valor seja alterado.public
e não final
.
@Immutable
public class ImmutableInteger {
public int value;
}
public
e final
.
@Immutable
public final class ThreeStooges {
public final Set stooges = new HashSet();
...
}
FORM GenerateReceiptURL CHANGING baseUrl TYPE string.
DATA: r TYPE REF TO cl_abap_random,
var1 TYPE i,
var2 TYPE i,
var3 TYPE n.
GET TIME.
var1 = sy-uzeit.
r = cl_abap_random=>create( seed = var1 ).
r->int31( RECEIVING value = var2 ).
var3 = var2.
CONCATENATE baseUrl var3 ".html" INTO baseUrl.
ENDFORM.
CL_ABAP_RANDOM->INT31
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como CL_ABAP_RANDOM
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
string GenerateReceiptURL(string baseUrl) {
Random Gen = new Random();
return (baseUrl + Gen.Next().toString() + ".html");
}
Random.Next()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Random.Next()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
char* CreateReceiptURL() {
int num;
time_t t1;
char *URL = (char*) malloc(MAX_URL);
if (URL) {
(void) time(&t1);
srand48((long) t1); /* use time to set seed */
sprintf(URL, "%s%d%s", "http://test.com/", lrand48(), ".html");
}
return URL;
}
lrand48()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como lrand48()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis.
<cfoutput>
Receipt: #baseUrl##Rand()#.cfm
</cfoutput>
Rand()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Rand()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
import "math/rand"
...
var mathRand = rand.New(rand.NewSource(1))
rsa.GenerateKey(mathRand, 2048)
rand.New()
para gerar aleatoriedade para uma chave RSA. Como rand.New()
é um PRNG estatístico, é fácil para um invasor adivinhar o valor que ele gera.
String GenerateReceiptURL(String baseUrl) {
Random ranGen = new Random();
ranGen.setSeed((new Date()).getTime());
return (baseUrl + ranGen.nextInt(400000000) + ".html");
}
Random.nextInt()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Random.nextInt()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
function genReceiptURL (baseURL){
var randNum = Math.random();
var receiptURL = baseURL + randNum + ".html";
return receiptURL;
}
Math.random()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Math.random()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
fun GenerateReceiptURL(baseUrl: String): String {
val ranGen = Random(Date().getTime())
return baseUrl + ranGen.nextInt(400000000).toString() + ".html"
}
Random.nextInt()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Random.nextInt()
é um PRNG estatístico, é fácil para um invasor adivinhar as cadeias de caracteres que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
function genReceiptURL($baseURL) {
$randNum = rand();
$receiptURL = $baseURL . $randNum . ".html";
return $receiptURL;
}
rand()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como rand()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
CREATE or REPLACE FUNCTION CREATE_RECEIPT_URL
RETURN VARCHAR2
AS
rnum VARCHAR2(48);
time TIMESTAMP;
url VARCHAR2(MAX_URL)
BEGIN
time := SYSTIMESTAMP;
DBMS_RANDOM.SEED(time);
rnum := DBMS_RANDOM.STRING('x', 48);
url := 'http://test.com/' || rnum || '.html';
RETURN url;
END
DBMS_RANDOM.SEED()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como DBMS_RANDOM.SEED()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis.
def genReceiptURL(self,baseURL):
randNum = random.random()
receiptURL = baseURL + randNum + ".html"
return receiptURL
rand()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como rand()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
def generateReceiptURL(baseUrl) {
randNum = rand(400000000)
return ("#{baseUrl}#{randNum}.html");
}
Kernel.rand()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Kernel.rand()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera.
def GenerateReceiptURL(baseUrl : String) : String {
val ranGen = new scala.util.Random()
ranGen.setSeed((new Date()).getTime())
return (baseUrl + ranGen.nextInt(400000000) + ".html")
}
Random.nextInt()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Random.nextInt()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.
sqlite3_randomness(10, &reset_token)
...
Function genReceiptURL(baseURL)
dim randNum
randNum = Rnd()
genReceiptURL = baseURL & randNum & ".html"
End Function
...
Rnd()
para gerar identificadores "exclusivos" para as páginas de recibo que ele gera. Como Rnd()
é um PRNG estatístico, é fácil para um invasor adivinhar as strings que ele gera. Embora o design subjacente do sistema de recibos também tenha suas falhas, ele seria mais seguro se utilizasse um gerador de números aleatórios que não produzisse identificadores de recibo previsíveis, como um PRNG criptográfico.CL_ABAP_RANDOM
ou suas variantes) for propagado com um valor constante específico, os valores retornados por GET_NEXT
, INT
e métodos semelhantes que retornam ou atribuem valores serão previsíveis para um invasor, que poderá coletar várias saídas PRNG.random_gen2
são previsíveis por meio do objeto random_gen1
.
DATA: random_gen1 TYPE REF TO cl_abap_random,
random_gen2 TYPE REF TO cl_abap_random,
var1 TYPE i,
var2 TYPE i.
random_gen1 = cl_abap_random=>create( seed = '1234' ).
DO 10 TIMES.
CALL METHOD random_gen1->int
RECEIVING
value = var1.
WRITE:/ var1.
ENDDO.
random_gen2 = cl_abap_random=>create( seed = '1234' ).
DO 10 TIMES.
CALL METHOD random_gen2->int
RECEIVING
value = var2.
WRITE:/ var2.
ENDDO.
random_gen1
e random_gen2
foram semeados de forma idêntica, então var1 = var2
rand()
) for propagado com um valor específico (usando uma função como srand(unsigned int)
), os valores retornados por rand()
e métodos semelhantes que retornam ou atribuem valores serão previsíveis para um invasor, que poderá coletar várias saídas de PRNG.
srand(2223333);
float randomNum = (rand() % 100);
syslog(LOG_INFO, "Random: %1.2f", randomNum);
randomNum = (rand() % 100);
syslog(LOG_INFO, "Random: %1.2f", randomNum);
srand(2223333);
float randomNum2 = (rand() % 100);
syslog(LOG_INFO, "Random: %1.2f", randomNum2);
randomNum2 = (rand() % 100);
syslog(LOG_INFO, "Random: %1.2f", randomNum2);
srand(1231234);
float randomNum3 = (rand() % 100);
syslog(LOG_INFO, "Random: %1.2f", randomNum3);
randomNum3 = (rand() % 100);
syslog(LOG_INFO, "Random: %1.2f", randomNum3);
randomNum1
e randomNum2
foram identicamente propagados e, portanto, cada chamada para rand()
após a chamada que propaga o gerador de números pseudoaleatórios srand(2223333)
resultará nas mesmas saídas, na mesma ordem de chamada. Por exemplo, a saída pode ser semelhante à seguinte:
Random: 32.00
Random: 73.00
Random: 32.00
Random: 73.00
Random: 15.00
Random: 75.00
math.Rand.New(Source)
), os valores retornados por math.Rand.Int()
e métodos semelhantes que retornam ou atribuem valores serão previsíveis para um invasor, que poderá coletar várias saídas do PRNG.
randomGen := rand.New(rand.NewSource(12345))
randomInt1 := randomGen.nextInt()
randomGen.Seed(12345)
randomInt2 := randomGen.nextInt()
nextInt()
após a chamada que iniciou a propagação do gerador de números pseudoaleatórios (randomGen.Seed(12345)
) resultará nas mesmas saídas, na mesma ordem.Random
) for propagado com um valor específico (usando uma função como Random.setSeed()
), os valores retornados por Random.nextInt()
e métodos semelhantes que retornam ou atribuem valores serão previsíveis para um invasor, que poderá coletar várias saídas de PRNG.Random
randomGen2
são previsíveis com base no objeto Random
randomGen1
.
Random randomGen1 = new Random();
randomGen1.setSeed(12345);
int randomInt1 = randomGen1.nextInt();
byte[] bytes1 = new byte[4];
randomGen1.nextBytes(bytes1);
Random randomGen2 = new Random();
randomGen2.setSeed(12345);
int randomInt2 = randomGen2.nextInt();
byte[] bytes2 = new byte[4];
randomGen2.nextBytes(bytes2);
randomGen1
e randomGen2
foram propagados de forma idêntica e, portanto, randomInt1 == randomInt2
e os valores correspondentes dos arrays bytes1[]
e bytes2[]
são iguais.Random
) for propagado com um valor específico (usando uma função como Random(Int)
), os valores retornados por Random.nextInt()
e métodos semelhantes que retornam ou atribuem valores serão previsíveis para um invasor, que poderá coletar várias saídas de PRNG.Random
randomGen2
são previsíveis com base no objeto Random
randomGen1
.
val randomGen1 = Random(12345)
val randomInt1 = randomGen1.nextInt()
val byteArray1 = ByteArray(4)
randomGen1.nextBytes(byteArray1)
val randomGen2 = Random(12345)
val randomInt2 = randomGen2.nextInt()
val byteArray2 = ByteArray(4)
randomGen2.nextBytes(byteArray2)
randomGen1
e randomGen2
foram propagados de forma idêntica e, portanto, randomInt1 == randomInt2
e os valores correspondentes dos arrays byteArray1
e byteArray2
são iguais.
...
import random
random.seed(123456)
print "Random: %d" % random.randint(1,100)
print "Random: %d" % random.randint(1,100)
print "Random: %d" % random.randint(1,100)
random.seed(123456)
print "Random: %d" % random.randint(1,100)
print "Random: %d" % random.randint(1,100)
print "Random: %d" % random.randint(1,100)
...
randint()
feita depois da chamada que semeou o gerador de números pseudoaleatórios (random.seed(123456)
), resulte nas mesmas saídas na mesma ordem. Por exemplo, a saída pode ser semelhante à seguinte:
Random: 81
Random: 80
Random: 3
Random: 81
Random: 80
Random: 3
Random
) for propagado com um valor específico (usando uma função como Random.setSeed()
), os valores retornados por Random.nextInt()
e métodos semelhantes que retornam ou atribuem valores serão previsíveis para um invasor, que poderá coletar várias saídas de PRNG.Random
randomGen2
são previsíveis com base no objeto Random
randomGen1
.
val randomGen1 = new Random()
randomGen1.setSeed(12345)
val randomInt1 = randomGen1.nextInt()
val bytes1 = new byte[4]
randomGen1.nextBytes(bytes1)
val randomGen2 = new Random()
randomGen2.setSeed(12345)
val randomInt2 = randomGen2.nextInt()
val bytes2 = new byte[4]
randomGen2.nextBytes(bytes2)
randomGen1
e randomGen2
foram propagados de forma idêntica e, portanto, randomInt1 == randomInt2
e os valores correspondentes dos arrays bytes1[]
e bytes2[]
são iguais.CL_ABAP_RANDOM
(ou suas variantes) não deve ser inicializada com um argumento corrompido. Se isso for feito, um invasor poderá controlar o valor usado para propagar o gerador de números pseudoaleatórios e, portanto, prever a sequência de valores produzidos por chamadas para métodos, incluindo, sem limitações: GET_NEXT
, INT
, FLOAT
, PACKED
.rand()
), que são transmitidos para um propagador (como srand()
), não devem ser chamadas com um argumento corrompido. Se isso for feito, um invasor poderá controlar o valor usado para propagar o gerador de números pseudoaleatórios e, portanto, prever a sequência de valores (geralmente números inteiros) produzidos por chamadas para esse gerador.ed25519.NewKeyFromSeed()
, não devem ser chamadas com um argumento impróprio. Caso contrário, um invasor poderá controlar o valor usado para propagar o gerador de números pseudoaleatórios e prever a sequência de valores produzidos por esse gerador.Random.setSeed()
não devem ser chamadas com um argumento de número inteiro corrompido. Se isso for feito, um invasor poderá controlar o valor usado para propagar o gerador de números pseudoaleatórios e, portanto, prever a sequência de valores (geralmente números inteiros) produzidos por chamadas para Random.nextInt()
, Random.nextShort()
, Random.nextLong()
, retornadas por Random.nextBoolean()
ou definidas em Random.nextBytes(byte[])
.Random.setSeed()
não devem ser chamadas com um argumento de número inteiro corrompido. Se isso for feito, um invasor poderá controlar o valor usado para propagar o gerador de números pseudoaleatórios e, portanto, prever a sequência de valores (geralmente números inteiros) produzidos por chamadas para Random.nextInt()
, Random.nextLong()
, Random.nextDouble()
, retornadas por Random.nextBoolean()
ou definidas em Random.nextBytes(ByteArray)
.random.randint()
); não deve ser chamado com um argumento contaminado. Isso permite a um invasor controlar o valor usado para semear o gerador de números pseudoaleatórios, e, portanto, ser capaz de prever a sequência de valores (geralmente inteiros) produzida pelas chamadas do gerador de números pseudoaleatórios.Random.setSeed()
não devem ser chamadas com um argumento de número inteiro corrompido. Se isso for feito, um invasor poderá controlar o valor usado para propagar o gerador de números pseudoaleatórios e, portanto, prever a sequência de valores (geralmente números inteiros) produzidos por chamadas para Random.nextInt()
, Random.nextShort()
, Random.nextLong()
, retornadas por Random.nextBoolean()
ou definidas em Random.nextBytes(byte[])
.