MIDDLEWARE = (
...
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.gzip.GZipMiddleware',
...
)
...
HKHealthStore healthStore = new HKHealthStore();
HKBloodTypeObject blood = healthStore.GetBloodType(null);
NSLog("%@", blood.BloodType);
var urlWithParams = String.format(TOKEN_URL, block.BloodType);
var responseString = await client.GetStringAsync(urlWithParams);
...
NSLog
, permite que un diseñador cree una aplicación que pueda leer todos los registros del dispositivo (aunque no sea propietario de las otras aplicaciones).
...
HKHealthStore healthStore = new HKHealthStore();
HKBloodTypeObject blood = healthStore.GetBloodType(null);
// Add blood type to user defaults
NSUserDefaults.StandardUserDefaults.SetString(blood.BloodType, "bloodType");
...
...
HKHealthStore *healthStore = [[HKHealthStore alloc] init];
HKBloodTypeObject *blood = [healthStore bloodTypeWithError:nil];
NSLog(@"%@", [blood bloodType]);
NSString *urlWithParams = [NSString stringWithFormat:TOKEN_URL, [blood bloodType]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlWithParams]];
[request setHTTPMethod:@"GET"];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
...
NSLog
, permite que un diseñador cree una aplicación que pueda leer todos los registros del dispositivo (aunque no sea propietario de las otras aplicaciones).
...
HKHealthStore *healthStore = [[HKHealthStore alloc] init];
HKBloodTypeObject *blood = [healthStore bloodTypeWithError:nil];
// Add blood type to user defaults
[defaults setObject:[blood bloodType] forKey:@"bloodType"];
[defaults synchronize];
...
...
let healthStore = HKHealthStore()
let blood = try healthStore.bloodType()
print(blood.bloodType)
let urlString : String = "http://myserver.com/?data=\(blood.bloodType)"
let url : NSURL = NSURL(string:urlString)
let request : NSURLRequest = NSURLRequest(URL:url)
var err : NSError?
var response : NSURLResponse?
var data : NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error:&err)
...
NSLog
, permite que un diseñador cree una aplicación que pueda leer todos los registros del dispositivo (aunque no sea propietario de las otras aplicaciones).
...
let healthStore = HKHealthStore()
let blood = try healthStore.bloodType()
print(blood.bloodType)
// Add blood type to user defaults
defaults.setObject("BloodType" forKey:blood.bloodType)
defaults.synchronize()
...
String
inseguro.
public static String getPassword() {
String inputPassword = "";
ConsoleKeyInfo nextKey = Console.ReadKey(true);
while (nextKey.Key != Console.ReadKey(true)) {
inputPassword.AppendChar(nextKey.KeyChar);
Console.Write("*");
nextKey = Console.ReadKey(true);
}
return inputPassword;
}
String
es un objeto inmutable, el contenido no se puede anular, lo que significa que los datos confidenciales están abiertos a cualquiera que pueda inspeccionar el montón antes de la recolección de elementos no utilizados.String
impide purgar los datos de forma fiable de la memoria.String
s para almacenar datos confidenciales porque los objetos String
son inmutables; solo el recopilador de elementos no utilizados JVM puede eliminar el valor de un String
de la memoria. No es necesario ejecutar el recopilador de elementos no utilizados a menos que la JVM tenga poca memoria, por lo que no hay garantía de cuándo se llevará a cabo la recopilación de elementos no utilizados. En caso de que una aplicación falle, un volcado de memoria de la misma podría revelar datos confidenciales.String
.
private JPasswordField pf;
...
final char[] password = pf.getPassword();
...
String passwordAsString = new String(password);
String
impide purgar los datos de forma fiable de la memoria.String
se usan para almacenar datos confidenciales; sin embargo, como estos objetos String
son inmutables, al asignarles un valor nuevo se creará un objeto String
nuevo y se asignará una referencia a este al objeto anterior. El valor original se conservará en la memoria hasta que ARC
(el recuento automático de referencias) desasigne el objeto y libera su memoria. Swift no garantiza el tiempo de vida de un objeto hasta el final del alcance de su entorno más próximo. Si un usuario malintencionado vuelca el contenido de la memoria antes de que se desasigne el objeto, el contenido será legible.String
.
let password = passwordTextField.text!
// use the password
GET
de HTTP en vez de POST
para enviar datos al servidor.GET
permiten que los parámetros de solicitud y URL se almacenen en los registros del servidor, los proxies intermedios y la caché de direcciones URL del explorador. Esto podría exponer la información confidencial a personas que no tienen los derechos adecuados a los datos.Ejemplo 2: si la aplicación utiliza NSURLRequest, el método HTTP predeterminado será GET.
...
NSString * const USER_URL = @"https://www.somesvr.com/someapp/user";
...
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:USER_URL]];
[request setHTTPMethod:@"GET"];
...
...
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
// Create the NSMutableData to hold the received data.
// receivedData is an instance variable declared elsewhere.
receivedData = [[NSMutableData data] retain];
} else {
...
GET
de HTTP en vez de POST
para enviar datos al servidor.GET
permiten que los parámetros de solicitud y URL se almacenen en los registros del servidor, los proxies intermedios y la caché de direcciones URL del explorador. Esto podría exponer la información confidencial a personas que no tienen los derechos adecuados a los datos.
...
$client = new Zend_Http_Client('https://www.example.com/fetchdata.php');
$client->request(Zend_Http_Client::GET);
...
GET
de HTTP en vez de POST
para enviar datos al servidor.GET
permiten que los parámetros de solicitud y URL se almacenen en los registros del servidor, los proxies intermedios y la caché de direcciones URL del explorador. Esto podría exponer la información confidencial a personas que no tienen los derechos adecuados a los datos.Ejemplo 2: si la aplicación utiliza NSURLRequest, el método HTTP predeterminado será GET.
...
let url = NSURL(string: "https://www.somesvr.com/someapp/user")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "GET"
let connection = NSURLConnection(request:request, delegate:self)
...
...
let url = NSURL(string: "https://www.somesvr.com/someapp/user")
let request = NSURLRequest(URL: url!)
let connection = NSURLConnection(request:request, delegate:self)
...
NSURLCredential
que puede sincronizarse y que se distribuirá a todos los dispositivos sincronizados y se almacenará en el entorno iCloud de Apple.NSURLCredential
que contiene las credenciales del usuario en forma de un par nombre de usuario/contraseña o un certificado de cliente, debe definirse un atributo de persistencia. Los valores posibles son los siguientes:NSURLCredentialPersistenceNone
: no se debe almacenar la credencial.NSURLCredentialPersistenceForSession
: solo se debe almacenar la credencial para esta sesión.NSURLCredentialPersistencePermanent
: la credencial debe almacenarse en las llaves.NSURLCredentialPersistenceSynchronizable
: la credencial debe almacenarse de manera permanente en las llaves y, además, debe distribuirse a otros dispositivos basándose en la ID de Apple de propietario.NSURLCredentialPersistenceSynchronizable
implica la distribución de la credencial y su almacenamiento en el entorno de la nube de Apple. Según los requisitos de privacidad de la aplicación, el almacenamiento de la credencial en el entorno de la nube de Apple puede no ser aceptable.
...
NSURLCredential *credential = [NSURLCredential credentialWithUser:user password:password persistence:NSURLCredentialPersistenceSynchronizable];
NSURLCredentialStorage *shared = [NSURLCredentialStorage sharedCredentialStorage];
[shared setDefaultCredential:credential forProtectionSpace:protectionSpace];
...
NSURLCredential
que puede sincronizarse y que se distribuirá a todos los dispositivos sincronizados y se almacenará en el entorno iCloud de Apple.NSURLCredential
que contiene las credenciales del usuario en forma de un par nombre de usuario/contraseña o un certificado de cliente, debe definirse un atributo de persistencia. Los valores posibles son los siguientes:NSURLCredentialPersistenceNone
: no se debe almacenar la credencial.NSURLCredentialPersistenceForSession
: solo se debe almacenar la credencial para esta sesión.NSURLCredentialPersistencePermanent
: la credencial debe almacenarse en las llaves.NSURLCredentialPersistenceSynchronizable
: la credencial debe almacenarse de manera permanente en las llaves y, además, debe distribuirse a otros dispositivos basándose en la ID de Apple de propietario.NSURLCredentialPersistenceSynchronizable
implica la distribución de la credencial y su almacenamiento en el entorno de la nube de Apple. Según los requisitos de privacidad de la aplicación, el almacenamiento de la credencial en el entorno de la nube de Apple puede no ser aceptable.
...
let credential = NSURLCredential(user:foo, password:password, persistence:.Synchronizable)
let shared = NSURLCredentialStorage.sharedCredentialStorage()
shared.setCredential(credential, forProtectionSpace:protectionSpace)
...
DataVisualization
que genera un gráfico de información financiera confidencial del origen de datos XML SensitiveXMLData
:
<asp:Chart ID="Chart1" runat="server" ImageLocation="~/Temporary/Graph"
ImageType="Jpeg" DataSourceID="SensitiveXMLData" ImageStorageMode="UseImageLocation">
<series>
.
.
.
</series>
<chartareas>
<asp:ChartArea Name="ChartArea1">
</asp:ChartArea>
</chartareas>
</asp:Chart>
Example 1
indica al control de Chart
que genere una imagen JPEG del gráfico de barras y lo escriba en el directorio temporal ~/Temporary/Graph
. Una vez que el control escribe la imagen en el disco, el explorador del usuario realizará la consiguiente solicitud del archivo y lo mostrará al usuario. La imagen no se escribe de forma segura en el disco. Además, el código presupone que la infraestructura subyacente protegerá el archivo frente al acceso no autorizado por parte de otro usuario.NSURLCredential
de manera local, pero no quita la copia almacenada en otros dispositivos y en iCloud.NSURLCredential
que contiene las credenciales del usuario en forma de un par nombre de usuario/contraseña o un certificado de cliente, debe definirse un atributo de persistencia. Los valores posibles son los siguientes:NSURLCredentialPersistenceNone
: no se debe almacenar la credencial.NSURLCredentialPersistenceForSession
: solo se debe almacenar la credencial para esta sesión.NSURLCredentialPersistencePermanent
: la credencial debe almacenarse en las llaves.NSURLCredentialPersistenceSynchronizable
: la credencial debe almacenarse de manera permanente en las llaves y, además, debe distribuirse a otros dispositivos basándose en la ID de Apple de propietario.NSURLCredentialPersistenceSynchronizable
se distribuyen a otros dispositivos y en iCloud, si no se quitan completamente de todos los sitios, quedarán instancias que podrían filtrarse.
...
// Create the credential
NSURLCredential *credential = [NSURLCredential credentialWithUser:user password:password persistence:NSURLCredentialPersistenceSynchronizable];
NSURLCredentialStorage *shared = [NSURLCredentialStorage sharedCredentialStorage];
[shared setDefaultCredential:credential forProtectionSpace:protectionSpace];
// Use the credential as needed
...
// Removes the credential
[shared removeCredential:credential forProtectionSpace:protectionSpace];
...
NSURLCredential
de manera local, pero no quita la copia almacenada en otros dispositivos y en iCloud.NSURLCredential
que contiene las credenciales del usuario en forma de un par nombre de usuario/contraseña o un certificado de cliente, debe definirse un atributo de persistencia. Los valores posibles son los siguientes:NSURLCredentialPersistenceNone
: no se debe almacenar la credencial.NSURLCredentialPersistenceForSession
: solo se debe almacenar la credencial para esta sesión.NSURLCredentialPersistencePermanent
: la credencial debe almacenarse en las llaves.NSURLCredentialPersistenceSynchronizable
: la credencial debe almacenarse de manera permanente en las llaves y, además, debe distribuirse a otros dispositivos basándose en la ID de Apple de propietario.NSURLCredentialPersistenceSynchronizable
se distribuyen a otros dispositivos y en iCloud, si no se quitan completamente de todos los sitios, quedarán instancias que podrían filtrarse.
...
// Create the credential
let credential = NSURLCredential(user:foo, password:password, persistence:.Synchronizable)
let shared = NSURLCredentialStorage.sharedCredentialStorage()
shared.setCredential(credential, forProtectionSpace:protectionSpace)
// Use the credential as needed
...
// Removes the credential
shared.removeCredential(credential, forProtectionSpace:protectionSpace)
...
MyCreditCard
almacena un número de tarjeta de crédito en texto sin cifrar que ha suministrado el usuario asociado a la cuenta.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>password</key>
<string>BASICSECRET</string>
<key>credentials</key>
<dict>
<key>pin</key>
<string>2345</string>
<key>MyCreditCard</key>
<string>1111 11 2321 1112</string>
<key>MysSn</key>
<string>1111-22-3333</string>
<key>ssn</key>
<string>2345-22-3345</string>
<key>userid</key>
<string>12345</string>
</dict>
</dict>
</plist>
Example 1
almacena información de usuario privada del dispositivo móvil en un archivo Lista de propiedades desprotegido almacenado en el dispositivo. Aunque muchos desarrolladores confían en los archivos Lista de propiedades como ubicaciones de almacenamiento seguro para cualquier dato y para todos los datos, no se debería depender implícitamente de ellos, en concreto cuando la privacidad del sistema es una preocupación, ya que estos archivos los puede leer cualquiera que esté en posesión del dispositivo.
ViewController.h
...
@property (nonatomic, retain) IBOutlet UITextField *ssnField;
...
Example 1
indica que la aplicación utiliza un control de entrada diseñado para recopilar información confidencial. Cuando iOS almacena en caché las entradas en campos de texto para mejorar el rendimiento de la característica de autocorrección, puede que la información introducida recientemente en tal control de entrada se almacene en un archivo caché del teclado, el cual se guarda en el sistema de archivos. Debido a que el archivo caché de teclado se almacena en el dispositivo, este archivo se puede recuperar si se extravía el dispositivo, lo cual revela la información confidencial que contiene.
...
@IBOutlet weak var ssnField: UITextField!
...
Example 1
indica que la aplicación utiliza un control de entrada diseñado para recopilar información confidencial. Cuando iOS almacena en caché las entradas en campos de texto para mejorar el rendimiento de la característica de autocorrección, puede que la información introducida recientemente en tal control de entrada se almacene en un archivo caché del teclado, el cual se guarda en el sistema de archivos. Debido a que el archivo caché de teclado se almacena en el dispositivo, este archivo se puede recuperar si se extravía el dispositivo, lo cual revela la información confidencial que contiene.
ViewController.h
...
@property (nonatomic, retain) IBOutlet UITextField *ssnField;
...
Example 1
indica que la aplicación utiliza un control de entrada diseñado para recopilar información confidencial. Cuando iOS realiza una captura de pantalla de la vista activa de una aplicación al pasar a segundo plano para mejorar el rendimiento de la animación, la información que se muestra en tales controles de entrada durante el evento de segundo plano se puede almacenar en caché en una imagen que se guarda en el sistema de archivos. Debido a que las capturas de caché de pantalla se almacenan en el dispositivo, estas capturas de pantalla se puede recuperar si se extravía el dispositivo, lo cual revela la información confidencial que contiene.
...
@IBOutlet weak var ssnField: UITextField!
...
Example 1
indica que la aplicación utiliza un control de entrada diseñado para recopilar información confidencial. Cuando iOS realiza una captura de pantalla de la vista activa de una aplicación al pasar a segundo plano para mejorar el rendimiento de la animación, la información que se muestra en tales controles de entrada durante el evento de segundo plano se puede almacenar en caché en una imagen que se guarda en el sistema de archivos. Debido a que las capturas de caché de pantalla se almacenan en el dispositivo, estas capturas de pantalla se puede recuperar si se extravía el dispositivo, lo cual revela la información confidencial que contiene.Documents
sin enmascararlos correctamente primero.Documents
es almacenar datos de aplicaciones no transitorios, como el contenido creado por el usuario o información local que le permite a la aplicación ejecutarse en modo sin conexión. Si se establece UIFileSharingEnabled
en el archivo Info.plist
de su aplicación, se podrá acceder a los archivos de esta ubicación a través de iTunes. Cuando se escriben datos confidenciales en el directorio Documents
, es posible que los datos queden expuestos en las copias de seguridad no cifradas o a través de la interfaz de iTunes.Documents
:
...
NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *passwd_path = [docsDirectory stringByAppendingPathComponent:@"passwords.txt"];
NSString *password = [user password];
[password writeToFile:passwd_path atomically:YES encoding:NSUTF8StringEncoding error:nil];
...
Documents
sin enmascararlos correctamente primero.Documents
es almacenar datos de aplicaciones no transitorios, como el contenido creado por el usuario o información local que le permite a la aplicación ejecutarse en modo sin conexión. Si se establece UIFileSharingEnabled
en el archivo Info.plist
de su aplicación, se podrá acceder a los archivos de esta ubicación a través de iTunes. Cuando se escriben datos confidenciales en el directorio Documents
, es posible que los datos queden expuestos en las copias de seguridad no cifradas o a través de la interfaz de iTunes.Documents
:
let documents = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let passwd_path = NSURL(fileURLWithPath: documents).URLByAppendingPathComponent("secret.txt")
let password = getUserPassword()
try password.writeToURL(passwd_path, atomically:true, encoding: NSUTF8StringEncoding)
DataType
, por lo que, de forma predeterminada, no se ocultará en la visualización:
public class User
{
[Required]
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime DateOfEmployment { get; set; }
[DataType(DataType.Currency)]
public decimal Salary { get; set; }
[Required]
public string Username { get; set; }
[Required]
public string Password { get; set; }
...
}
Password
en el Example 1
no especificó el atributo [DataType(DataType.Password)]
, no se ocultará de forma predeterminada en la interfaz de usuario.TextField
no oculta la contraseña de un usuario cuando la escribe en el indicador de entrada:
class SelectionContainerDisabledExampleApp extends StatelessWidget {
const SelectionContainerDisabledExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Column(
children: <Widget>[
TextField(
decoration: InputDecoration(
hintText: "Please enter your password",
),
),
],
),
),
),
);
}
}
TextField
del Example 1
no había creado una instancia con la propiedad obscureText
establecida en true
, la contraseña del usuario no se ocultará cuando la introduzca en el mensaje "Introduzca su contraseña:" .PasswordCallback pc = new PasswordCallback("Please enter your password: ", true);
pc
en el Example 1
había creado una instancia con su segundo parámetro, onEcho
, establecido en true
, la contraseña del usuario no se ocultará cuando la introduzca en el mensaje "Introduzca su contraseña:" .
ViewController.h:
...
@property (nonatomic, retain) IBOutlet UITextField *passwordField;
...
ViewController.m:
...
NSString *password = _passwordField.text;
...
passwordField
en el Example 1
no tenía la propiedad secureTextEntry
establecida como true
, la contraseña del usuario no se ocultará mientras la introduce en el campo de texto.
...
@IBOutlet weak var passwordField: UITextField!
...
let password = passwordField.text
...
passwordField
en el Example 1
no tenía la propiedad secureTextEntry
establecida como true
, la contraseña del usuario no se ocultará mientras la introduce en el campo de texto.
from oslo_config import cfg
...
opts = [
cfg.StrOpt('admin_password',secret=False,
help="User's password")]
...
grp = cfg.OptGroup('mygroup')
cfg.CONF.register_opts(opts, group=grp)
...
logger.warning("Adding %s" % cfg.CONF.mygroup.admin_password)
Example 1
escribe admin_password
en texto sin formato (sin ofuscar) en la salida del registro, ya que el valor de secret
se establece en False
. Aunque muchos desarrolladores confían en el registro de eventos como una ubicación segura de almacenamiento para los datos, el usuario no debería confiar absolutamente, en especial, cuando la privacidad es una preocupación.<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de ACTIVITY_RECOGNITION
, que permite a una aplicación introducir reconocer la actividad física del usuario.<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de READ_CALENDAR
, que permite a una aplicación leer los datos del calendario del usuario.<uses-permission android:name="android.permission.READ_CALENDAR"/>Ejemplo 2: El elemento
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de WRITE_CALENDAR
, que permite a una aplicación introducir datos en los datos del calendario del usuario.<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de READ_CALL_LOG
, que permite a una aplicación leer el registro de llamadas del usuario.<uses-permission android:name="android.permission.READ_CALL_LOG"/>Ejemplo 2: El elemento
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de WRITE_CALL_LOG
, que permite a una aplicación introducir datos en el registro de llamadas del usuario.<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de CAMERA
, que permite a una aplicación acceder a la cámara del dispositivo.<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de READ_CONTACTS
, que permite a una aplicación leer los datos de los contactos del usuario.<uses-permission android:name="android.permission.READ_CONTACTS"/>Ejemplo 2: El elemento
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de WRITE_CONTACTS
, que permite a una aplicación introducir datos en los datos de los contactos del usuario.<uses-permission android:name="android.permission.WRITE_CONTACTS"/>Ejemplo 3: El elemento
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de GET_ACCOUNTS
, que permite a una aplicación acceder al correo electrónico del usuario y a las cuentas en línea almacenadas en el Gestor de cuentas. Con este permiso se puede acceder a datos confidenciales, como identificadores de cuentas, direcciones de correo electrónico y números de teléfono.<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de WRITE_EXTERNAL_STORAGE
, que permite a una aplicación introducir datos en un almacenamiento externo.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>Ejemplo 2: El elemento
<uses-permission .../>
de AndroidManifest.xml declara el uso del permiso de READ_EXTERNAL_STORAGE
, que permite a una aplicación leer en un almacenamiento externo.<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>