Problemas de validação e representação da entrada são causados por metacaracteres, codificações alternativas e representações numéricas. Confiar na entrada resulta em problemas de segurança. Os problemas incluem: “Buffer Overflows”, ataques de “Cross-Site Scripting”, “SQL Injection”, entre outros.
select()
SimpleDB que procura faturas correspondentes a uma categoria de produto especificada pelo usuário. O usuário também pode especificar a coluna pela qual os resultados são classificados. Suponha que o aplicativo já tenha sido devidamente autenticado e defina o valor de customerID
antes desse segmento de código.
...
String customerID = getAuthenticatedCustomerID(customerName, customerCredentials);
...
AmazonSimpleDBClient sdbc = new AmazonSimpleDBClient(appAWSCredentials);
String query = "select * from invoices where productCategory = '"
+ productCategory + "' and customerID = '"
+ customerID + "' order by '"
+ sortColumn + "' asc";
SelectResult sdbResult = sdbc.select(new SelectRequest(query));
...
select * from invoices
where productCategory = 'Fax Machines'
and customerID = '12345678'
order by 'price' asc
productCategory
e price
não contiverem caracteres de aspas simples. Porém, se um invasor fornecer a string "Fax Machines' or productCategory = \"
" para productCategory
e a string "\" order by 'price
" para sortColumn
, a consulta se tornará a seguinte:
select * from invoices
where productCategory = 'Fax Machines' or productCategory = "'
and customerID = '12345678'
order by '" order by 'price' asc
select * from invoices
where productCategory = 'Fax Machines'
or productCategory = "' and customerID = '12345678' order by '"
order by 'price' asc
customerID
e permite que ele veja registros de faturas correspondentes a 'Fax Machines'
para todos os clientes.customerID
antes desse segmento de código.
...
productCategory = this.getIntent().getExtras().getString("productCategory");
sortColumn = this.getIntent().getExtras().getString("sortColumn");
customerID = getAuthenticatedCustomerID(customerName, customerCredentials);
c = invoicesDB.query(Uri.parse(invoices), columns, "productCategory = '" + productCategory + "' and customerID = '" + customerID + "'", null, null, null, "'" + sortColumn + "'asc", null);
...
select * from invoices
where productCategory = 'Fax Machines'
and customerID = '12345678'
order by 'price' asc
productCategory
. Portanto, ela se comportará corretamente somente se productCategory
e sortColumn
não contiverem caracteres de aspas simples. Se um invasor fornecer a string "Fax Machines' or productCategory = \"
" para productCategory
e a string "\" order by 'price
" para sortColumn
, a consulta se tornará:
select * from invoices
where productCategory = 'Fax Machines' or productCategory = "'
and customerID = '12345678'
order by '" order by 'price' asc
select * from invoices
where productCategory = 'Fax Machines'
or productCategory = "' and customerID = '12345678' order by '"
order by 'price' asc
customerID
e permite que ele veja registros de faturas correspondentes a 'Fax Machines'
para todos os clientes.HttpRequest
fornece acesso programático a variáveis das coleções QueryString
, Form
, Cookies
ou ServerVariables
sob a forma de um acesso de array (por exemplo, Request["myParam"]
). Quando há mais de uma variável com o mesmo nome, o .NET Framework retorna o valor da variável que aparece primeiro quando as coleções são pesquisadas, na ordem seguinte: QueryString
, Form
, Cookies
e depois ServerVariables
. Como QueryString
vem em primeiro lugar na ordem de pesquisa, é possível que parâmetros QueryString
substituam valores de formulários, cookies e variáveis de servidor. Da mesma forma, valores de formulário podem substituir variáveis nas coleções Cookies
e ServerVariables
, enquanto variáveis da coleção Cookies
podem substituir as de ServerVariables
.
...
String toAddress = Request["email"]; //Expects cookie value
Double balance = GetBalance(userID);
SendAccountBalance(toAddress, balance);
...
Example 1
seja executado durante uma visita a http://www.example.com/GetBalance.aspx
. Se um invasor puder fazer com que um usuário autenticado clique em um link que solicita http://www.example.com/GetBalance.aspx?email=evil%40evil.com
, um e-mail com o saldo da conta desse usuário será enviado para evil@evil.com
.HttpRequest
fornece acesso programático a variáveis das coleções QueryString
, Form
, Cookies
ou ServerVariables
sob a forma de um acesso de array (por exemplo, Request["myParam"]
). Quando há mais de uma variável com o mesmo nome, o .NET Framework retorna o valor da variável que aparece primeiro quando as coleções são pesquisadas, na ordem seguinte: QueryString
, Form
, Cookies
e depois ServerVariables
. Como QueryString
vem em primeiro lugar na ordem de pesquisa, é possível que parâmetros QueryString
substituam valores de formulários, cookies e variáveis de servidor. Da mesma forma, valores de formulário podem substituir variáveis nas coleções Cookies
e ServerVariables
, enquanto variáveis da coleção Cookies
podem substituir as de ServerVariables
.www.example.com
antes de apresentar o conteúdo.
...
if (Request["HTTP_REFERER"].StartsWith("http://www.example.com"))
ServeContent();
else
Response.Redirect("http://www.example.com/");
...
Example 1
seja executado durante uma visita a http://www.example.com/ProtectedImages.aspx
. Se um invasor realizar uma solicitação direta para a URL, o cabeçalho de referência adequado não será definido e a solicitação falhará. No entanto, se o invasor enviar um parâmetro HTTP_REFERER
artificial com o valor necessário, como http://www.example.com/ProtectedImages.aspx?HTTP_REFERER=http%3a%2f%2fwww.example.com
, a pesquisa retornará esse valor de QueryString
em vez de ServerVariables
, e a verificação será bem-sucedida.