Los problemas de validación y representación de entradas están causados por metacaracteres, codificaciones alternativas y representaciones numéricas. Los problemas de seguridad surgen de entradas en las que se confía. Estos problemas incluyen: «desbordamientos de búfer», ataques de «scripts de sitios», "SQL injection" y muchas otras acciones.
select()
de SimpleDB que busca facturas que coincidan con una categoría de productos especificada por el usuario. El usuario también puede especificar la columna por la que se ordenarán los resultados. Imagine que la aplicación ya ha autenticado y establecido correctamente el valor de customerID
antes de este 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
y price
no contienen caracteres de comillas simples. Sin embargo, si un usuario malintencionado proporciona la cadena "Fax Machines' or productCategory = \"
" para productCategory
y la cadena "\" order by 'price
" para sortColumn
, la consulta se convierte en lo siguiente:
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
y ver los registros de facturas que coinciden con 'Fax Machines'
de todos los clientes.customerID
que antecede a este 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
. Por lo tanto, la consulta solo presentará el comportamiento correcto si productCategory
y sortColumn
no contienen caracteres de comillas simples. Si un usuario malintencionado proporciona la cadena "Fax Machines' or productCategory = \"
" para productCategory
, y la cadena "\" order by 'price
" para sortColumn
, la consulta se convierte en:
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
y ver registros de facturas que coincidan con 'Fax Machines'
de todos los clientes.HttpRequest
proporciona acceso programático a las variables procedentes de las colecciones QueryString
, Form
, Cookies
o ServerVariables
en la forma de un acceso de matriz (p. ej. Request["myParam"]
). Cuando existe más de una variable con el mismo nombre, .NET Framework devuelve el valor de la variable que aparece primero cuando se buscan las colecciones en el siguiente orden: QueryString
, Form
, Cookies
y ServerVariables
. Como QueryString
está primero en el orden de búsqueda, los parámetros QueryString
pueden sustituir los valores de variables de servidor, cookies y formularios. Del mismo modo, los valores de formularios pueden reemplazar las variables de las colecciones Cookies
y ServerVariables
, y las variables de la colección Cookies
pueden reemplazar las de ServerVariables
.
...
String toAddress = Request["email"]; //Expects cookie value
Double balance = GetBalance(userID);
SendAccountBalance(toAddress, balance);
...
Example 1
se ejecuta al visitar http://www.example.com/GetBalance.aspx
. Si un atacante puede hacer que un usuario autenticado haga clic en un enlace que solicite http://www.example.com/GetBalance.aspx?email=evil%40evil.com
, se enviará un mensaje de correo electrónico con el balance de cuentas del usuario a evil@evil.com
.HttpRequest
proporciona acceso programático a las variables procedentes de las colecciones QueryString
, Form
, Cookies
o ServerVariables
en la forma de un acceso de matriz (p. ej. Request["myParam"]
). Cuando existe más de una variable con el mismo nombre, .NET Framework devuelve el valor de la variable que aparece primero cuando se buscan las colecciones en el siguiente orden: QueryString
, Form
, Cookies
y ServerVariables
. Como QueryString
está primero en el orden de búsqueda, los parámetros QueryString
pueden sustituir los valores de variables de servidor, cookies y formularios. Del mismo modo, los valores de formularios pueden reemplazar las variables de las colecciones Cookies
y ServerVariables
, y las variables de la colección Cookies
pueden reemplazar las de ServerVariables
.www.example.com
antes de proporcionar contenido.
...
if (Request["HTTP_REFERER"].StartsWith("http://www.example.com"))
ServeContent();
else
Response.Redirect("http://www.example.com/");
...
Example 1
se ejecuta al visitar http://www.example.com/ProtectedImages.aspx
. Si un atacante realiza una solicitud directa a la URL, no se establecerá el encabezado de referencia correspondiente y la solicitud no se cumplirá. No obstante, si el atacante envía un parámetro HTTP_REFERER
artificial con el valor requerido, como http://www.example.com/ProtectedImages.aspx?HTTP_REFERER=http%3a%2f%2fwww.example.com
, la búsqueda devolverá el valor de QueryString
en lugar de ServerVariables
y se realizará la comprobación.