La seguridad de un software no es un software de seguridad. Nos preocupamos de cuestiones como la autenticación, el control de acceso, la confidencialidad, la criptografía y la gestión de privilegios.
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
\A/secure/.*\Z=REQUIRES_SECURE_CHANNEL
\A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL
\A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL
\A.*\Z=REQUIRES_INSECURE_CHANNEL
</value>
</property>
<bean id="bankManagerSecurity" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
...
<property name="objectDefinitionSource">
<value>
com.example.service.PrivateCatalog.getData=ROLE_PEON,RUN_AS_UBER_BOSS
...
</value>
</property>
</bean>
writePermission
definido.writePermission
podría ser engañoso. Debido a la naturaleza de SQL, generar consultas verdaderas de solo escritura es generalmente imposible: incluso cuando el usuario no tiene acceso directo a los datos, un atacante puede reconstruir los datos almacenados manipulando la cláusula where
.writePermission
.<provider android:name=".ContentProvider" android:writePermission="content.permission.WRITE_CONTENT"/>
...
context.registerReceiver(broadcastReceiver, intentFilter);
...
exported
de los componentes de actividad, receptor y servicio de una aplicación Android depende de la presencia o ausencia de un intent-filter
. La presencia de un intent-filter
implica que el componente ha sido diseñado para uso externo, por lo que define el atributo exported
como verdadero. Este componente es ahora accesible a cualquier otra aplicación de la plataforma Android.intent-filter
y sin permiso de acceso explícito definido.<activity android:name=".AndroidActivity"/>
<intent-filter android:label="activityName"/>
<action android:name=".someFunAction"/>
</intent-filter>
...
</activity>
<provider android:name=".ContentProvider"/>
...
context.sendBroadcast(intent);
...
normal
.normal
, dangerous
, signature
, y signature or system
. Los permisos Normal
se otorgan a cualquier aplicación que los solicite. Los permisos Dangerous
se otorgan solo después de la confirmación del usuario. Los permisos Signature
se otorgan solo a las aplicaciones firmadas por la misma clave de desarrollador que el paquete que define el permiso. Los permisos Signature or system
son similares a permisos signature
, pero también se otorgan a paquetes en la imagen del sistema Android.normal
.<permission android:name="custom.PERMISSION"
android:label="@string/label_permission"
android:description="@string/desc_permission"
android:protectionLevel="normal">
</permission>
permission
de acceso combinado de lectura y escritura.permission
de lectura y escritura combinadas estará accesible para las entidades que soliciten acceso de lectura o escritura al proveedor. Sin embargo, en muchos casos, al igual que en el caso de los archivos en un sistema de archivos, las entidades que necesitan acceso de lectura a los datos almacenados por el proveedor no deberían poder modificar los datos. Establecer el atributo permission
no permite distinguir entre usuarios de datos e interacciones que afectan la integridad de los datos.permission
(permiso) de acceso combinado de lectura y escritura.<provider android:name=".ContentProvider" android:permission="content.permission.READ_AND_WRITE_CONTENT"/>
...
context.sendStickyBroadcast(intent);
...
android.permission
.android.permission
puede tener consecuencias inesperadas cuando se actualiza el sistema operativo. Si la versión más reciente del sistema operativo define exactamente el mismo permiso, el Servicio de administración de paquetes de Android (PMS) otorgará silenciosamente el permiso a la aplicación sin pedirle al usuario que permita los ataques de elevación de privilegios.
myModule.config(function($compileProvider){
$compileProvider.imgSrcSanitizationWhitelist(/^(http(s)?|javascript):.*/);
});
myModule.config(function($sceProvider){
$sceProvider.enabled(false);
});
DangerousEnableCompression
en true
para habilitar la extensión "per-message-deflate":Ejemplo 2: El siguiente código utiliza
app.Run(async context => {
using var websocket = await context.WebSockets.AcceptWebSocketAsync(new WebSocketAcceptContext() { DangerousEnableCompression = true });
await websocket.SendAsync(...);
await websocket.ReceiveAsync(...);
await websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, null, default);
});
DangerousDeflateOptions
para configurar las opciones para la extensión "per-message-deflate":
using ClientWebSocket ws = new() {
Options = {
CollectHttpResponseDetails = true,
DangerousDeflateOptions = new WebSocketDeflateOptions() {
ClientMaxWindowBits = 10,
ServerMaxWindowBits = 10
}
}
};
WindowsIdentity.Impersonate()
.
using System.Security.Principal;
...
//Get the identity of the current user
IIdentity contextId = HttpContext.Current.User.Identity;
WindowsIdentity userId = (WindowsIdentity)contextId;
//Temporarily impersonate
WindowsImpersonationContext imp = userId.Impersonate();
//Perform tasks using the caller's security context
DoSecuritySensitiveTasks();
//Clean up and restore our old security context
impersonate.Undo();
Example 1
suplanta el contexto de seguridad del usuario actual y lo utiliza para realizar una operación con privilegios. Después de llamar a DoSecuritySensitiveTasks()
, el código intenta restablecer el contexto de seguridad original, pero, si DoSecuritySensitiveTasks()
genera una excepción, no se llamará nunca al método Undo()
, por lo que el programa seguirá usando el contexto de seguridad suplantado.