La encapsulación consiste en crear límites fuertes. En un explorador web esto puede suponer la seguridad de que tu codificación móvil no se vea comprometido por otro código móvil. En el servidor puede significar la diferenciación entre los datos validados y los que no lo están, entre los datos de un usuario y los de otro, o entre los diferentes usuarios, los datos que pueden ver y los que no.
localStorage
y sessionStorage
puede exponer información confidencial inintencionadamente.localStorage
y sessionStorage
de manera que los desarrolladores pueden conservar valores de programa. El mapa sessionStorage
proporciona almacenamiento para la página de invocación y dura solo el tiempo de la instancia de la página y de la sesión inmediata del explorador. El mapa localStorage
, sin embargo, proporciona almacenamiento al que se puede acceder mediante varias instancias de página y varias instancias de explorador. Esta funcionalidad permite a una aplicación conservar y utilizar la misma información en varias pestañas o ventanas de explorador.sessionStorage
al ámbito localStorage
y viceversa.sessionStorage
. No obstante, el desarrollador también almacena la información en el objeto localStorage
.
...
try {
sessionStorage.setItem("userCCV", currentCCV);
} catch (e) {
if (e == QUOTA_EXCEEDED_ERR) {
alert('Quota exceeded.');
}
}
...
...
var retrieveObject = sessionStorage.getItem("userCCV");
try {
localStorage.setItem("userCCV",retrieveObject);
} catch (e) {
if (e == QUOTA_EXCEEDED_ERR) {
alert('Quota exceeded.');
}
...
var userCCV = localStorage.getItem("userCCV");
...
}
...
localStorage
, la información del número CCV ahora está disponible en otras pestañas del explorador además de en las invocaciones nuevas del explorador. Esto omitirá la lógica de la aplicación para el flujo de trabajo previsto.MyAccountActions
y un método de acción de página pageAction()
. El método pageAction()
se ejecuta al visitar la URL de la página y el servidor no comprueba los tokens anti-CSRF.
<apex:page controller="MyAccountActions" action="{!pageAction}">
...
</apex:page>
public class MyAccountActions {
...
public void pageAction() {
Map<String,String> reqParams = ApexPages.currentPage().getParameters();
if (params.containsKey('id')) {
Id id = reqParams.get('id');
Account acct = [SELECT Id,Name FROM Account WHERE Id = :id];
delete acct;
}
}
...
}
<img src="http://my-org.my.salesforce.com/apex/mypage?id=YellowSubmarine" height=1 width=1/>
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, "/new_user");
body = addToPost(body, new_username);
body = addToPost(body, new_passwd);
rb.sendRequest(body, new NewAccountCallback(callback));
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, "http://www.example.com/new_user");
body = addToPost(body, "attacker";
body = addToPost(body, "haha");
rb.sendRequest(body, new NewAccountCallback(callback));
example.com
visita la página malintencionada mientras tiene una sesión activa en el sitio, creará involuntariamente una cuenta para el atacante. Esto es lo que se denomina un ataque CSRF. Este ataque es posible porque la aplicación no tiene forma de determinar la procedencia de la solicitud. Todas las solicitudes podrían ser acciones válidas elegidas por el usuario o acciones engañosas determinadas por un atacante. El atacante no ve la página web que la solicitud falsa genera, por lo que esta técnica de ataque solo es útil para las solicitudes que alteran el estado de la aplicación.
<http auto-config="true">
...
<csrf disabled="true"/>
</http>
var req = new XMLHttpRequest();
req.open("POST", "/new_user", true);
body = addToPost(body, new_username);
body = addToPost(body, new_passwd);
req.send(body);
var req = new XMLHttpRequest();
req.open("POST", "http://www.example.com/new_user", true);
body = addToPost(body, "attacker");
body = addToPost(body, "haha");
req.send(body);
example.com
visita la página malintencionada mientras tiene una sesión activa en el sitio, creará sin quererlo una cuenta para el usuario malintencionado. Esto es lo que se denomina un ataque CSRF. Este ataque es posible porque la aplicación no tiene forma de determinar la procedencia de la solicitud. Todas las solicitudes podrían ser acciones válidas elegidas por el usuario o acciones engañosas llevadas a cabo por un atacante. El atacante no ve la página web que la solicitud falsa genera, por lo que esta técnica de ataque solo es útil para las solicitudes que alteran el estado de la aplicación.
<form method="POST" action="/new_user" >
Name of new user: <input type="text" name="username">
Password for new user: <input type="password" name="user_passwd">
<input type="submit" name="action" value="Create User">
</form>
<form method="POST" action="http://www.example.com/new_user">
<input type="hidden" name="username" value="hacker">
<input type="hidden" name="user_passwd" value="hacked">
</form>
<script>
document.usr_form.submit();
</script>
example.com
visita la página malintencionada mientras tiene una sesión activa en el sitio, creará sin quererlo una cuenta para el usuario malintencionado. Esto es lo que se denomina un ataque CSRF. Este ataque es posible porque la aplicación no tiene forma de determinar la procedencia de la solicitud. Todas las solicitudes podrían ser acciones válidas elegidas por el usuario o acciones engañosas llevadas a cabo por un atacante. El atacante no ve la página web que la solicitud falsa genera, por lo que esta técnica de ataque solo es útil para las solicitudes que alteran el estado de la aplicación.buyItem
.
+ nocsrf
POST /buyItem controllers.ShopController.buyItem
shop.com
, comprará sin quererlo artículos para el atacante. Esto es lo que se denomina un ataque CSRF. Este ataque es posible porque la aplicación no tiene forma de determinar la procedencia de la solicitud. Todas las solicitudes podrían ser acciones válidas elegidas por el usuario o acciones engañosas determinadas por un atacante. El atacante no ve la página web que la solicitud falsa genera, por lo que esta técnica de ataque solo es útil para las solicitudes que alteran el estado de la aplicación.
<form method="POST" action="/new_user" >
Name of new user: <input type="text" name="username">
Password for new user: <input type="password" name="user_passwd">
<input type="submit" name="action" value="Create User">
</form>
<form method="POST" action="http://www.example.com/new_user">
<input type="hidden" name="username" value="hacker">
<input type="hidden" name="user_passwd" value="hacked">
</form>
<script>
document.usr_form.submit();
</script>
example.com
visita la página malintencionada mientras tiene una sesión activa en el sitio, creará sin quererlo una cuenta para el usuario malintencionado. Esto es lo que se denomina un ataque CSRF. Este ataque es posible porque la aplicación no tiene forma de determinar la procedencia de la solicitud. Todas las solicitudes podrían ser acciones válidas elegidas por el usuario o acciones engañosas llevadas a cabo por un atacante. El atacante no ve la página web que la solicitud falsa genera, por lo que esta técnica de ataque solo es útil para las solicitudes que alteran el estado de la aplicación.X-Download-Options
que se define como noopen
permite que las páginas HTML descargadas se ejecuten en el contexto de seguridad del sitio que las proporciona.
var express = require('express');
var app = express();
var helmet = require('helmet');
app.use(helmet({
ieNoOpen: false
}));
...
Origin
, permitirá que cualquier sitio malintencionado suplante al usuario y establezca una conexión WebSocket bidireccional sin que el usuario se dé cuenta.Origin
, permitirá que cualquier sitio malintencionado suplante al usuario y establezca una conexión WebSocket bidireccional sin que el usuario se dé cuenta.exclude
. Esto es difícil de mantener y es susceptible a errores. Si los desarrolladores agregan campos nuevos al formulario o al Model
que respalda el formulario y olvidan actualizar el filtro exclude
, podrían estar exponiendo campos confidenciales a los atacantes. Los atacantes podrán enviar y enlazar datos malintencionados a cualquier campo no excluido.User
, pero controla en una lista de rechazados el id
del usuario:
from myapp.models import User
...
class UserForm(ModelForm):
class Meta:
model = User
exclude = ['id']
...
User
se actualizó con un atributo role
nuevo y el UserForm
asociado no se actualizó, el atributo role
se expondría en el formulario.
...
myWebView.loadUrl("file:///android_asset/www/index.html");
...
Example 1
, el representador de WebView de Android considera que todo aquello cargado con loadUrl()
con una dirección URL que empiece por file:// procede del mismo origen.
<script src="http://www.example.com/js/fancyWidget.js"></script>
Example 2
, se utiliza un protocolo inseguro, que podría permitir que la secuencia de comandos resultante fuera modificada por una persona malintencionada. De forma alternativa, se podrían realizar otros ataques para volver a enrutar el equipo al sitio del usuario malintencionado.file://
).UIWebView.loadRequest(_:)
para cargar un archivo local:
...
NSURL *url = [[NSBundle mainBundle] URLForResource: filename withExtension:extension];
[webView loadRequest:[[NSURLRequest alloc] initWithURL:url]];
...
Example 1
, el motor WebView considera que todo aquello cargado con UIWebView.loadRequest(_:)
con una dirección URL que empiece por file://
procede del mismo archivo local con privilegios.file://
, la política del mismo origen permitirá que los scripts de este archivo accedan a cualquier otro archivo del mismo origen, lo que puede permitir que un atacante acceda a cualquier archivo local que contenga información confidencial.file://
).UIWebView.loadRequest(_:)
para cargar un archivo local:
...
let url = Bundle.main.url(forResource: filename, withExtension: extension)
self.webView!.load(URLRequest(url:url!))
...
Example 1
, el motor WebView considera que todo aquello cargado con UIWebView.loadRequest(_:)
con una dirección URL que empiece por file://
procede del mismo archivo local con privilegios.file://
, la política del mismo origen permitirá que los scripts de este archivo accedan a cualquier otro archivo del mismo origen, lo que puede permitir que un atacante acceda a cualquier archivo local que contenga información confidencial.crossdomain.xml
. Sin embargo, es necesario tener cuidado al cambiar la configuración porque una directiva entre dominios demasiado permisiva permitirá que una aplicación malintencionada se comunique con la aplicación víctima de manera inadecuada, lo que provocará suplantación de identidad, robo de datos, retransmisión y otros ataques.
flash.system.Security.allowDomain("*");
*
como el argumento de allowDomain()
indica que otras aplicaciones SWF pueden tener acceso a los datos desde cualquier dominio.