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.
pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.
...
webview.setWebViewClient(new WebViewClient() {
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
String username = credentials[0];
String password = credentials[1];
Intent i = new Intent();
i.setAction("SEND_CREDENTIALS");
i.putExtra("username", username);
i.putExtra("password", password);
view.getContext().sendBroadcast(i);
}
});
...
SEND_CREDENTIALS
recibirá el mensaje. La difusión ni siquiera está protegida con un permiso para limitar el número de destinatarios, aunque en este caso no recomendamos el uso de permisos como solución.FileIOPermissions
necesarios en la aplicación.
...
String permissionsXml = GetPermissionsFromXmlFile();
FileIOPermission perm = new FileIOPermission(PermissionState.None);
perm.FromXml(permissionsXml);
perm.Demand();
...
...
CrytoKeyAuditRule auditRule = new CryptoKeyAuditRule(IdRef, (CryptoKeyRights) input, AuditFlags.Success);
...
input
, podrá especificar el tipo de operación que se registrará. Si el usuario puede manipular esto para CryptoKeyRights.Delete
, podrá leer la clave de cifrado sin que se lo registre, por lo que no quedará constancia de que un usuario malintencionado haya robado las claves de cifrado.
...
uid = 'scott'.
password = 'tiger'.
WRITE: / 'Default username for FTP connection is: ', uid.
WRITE: / 'Default password for FTP connection is: ', password.
...
pass = getPassword();
...
trace(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.
...
ResetPasswordResult passRes = System.resetPassword(id1, true);
System.Debug('New password: '+passRes.getPassword());
...
pass = GetPassword();
...
dbmsLog.WriteLine(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.get_password()
devuelve la contraseña de texto sin formato que ha suministrado el usuario asociada a la cuenta.
pass = get_password();
...
fprintf(dbms_log, "%d:%s:%s:%s", id, pass, type, tstamp);
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos como una ubicación segura de almacenamiento para todos los datos, el usuario no debería confiar absolutamente, en especial, cuando la privacidad es una preocupación.
...
MOVE "scott" TO UID.
MOVE "tiger" TO PASSWORD.
DISPLAY "Default username for database connection is: ", UID.
DISPLAY "Default password for database connection is: ", PASSWORD.
...
Session.pword
contiene la contraseña de texto sin formato asociada a la cuenta.
<cflog file="app_log" application="No" Thread="No"
text="#Session.uname#:#Session.pword#:#type#:#Now()#">
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.
var pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.GetPassword()
, que devuelve la contraseña en texto sin formato que ha suministrado el usuario asociada a la cuenta.
pass = GetPassword();
...
if err != nil {
log.Printf('%s: %s %s %s', id, pass, type, tsstamp)
}
Example 1
registra una contraseña de texto sin formato en el registro de eventos de la aplicación. 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.
pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.
...
webview.setWebViewClient(new WebViewClient() {
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
String username = credentials[0];
String password = credentials[1];
Intent i = new Intent();
i.setAction("SEND_CREDENTIALS");
i.putExtra("username", username);
i.putExtra("password", password);
view.getContext().sendBroadcast(i);
}
});
...
SEND_CREDENTIALS
recibirá el mensaje. La difusión ni siquiera está protegida con un permiso para limitar el número de destinatarios, aunque en este caso no recomendamos el uso de permisos como solución.
localStorage.setItem('password', password);
pass = getPassword()
...
dbmsLog.println("$id:$pass:$type:$tstamp")
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.
...
webview.webViewClient = object : WebViewClient() {
override fun onReceivedHttpAuthRequest(view: WebView,
handler: HttpAuthHandler, host: String, realm: String
) {
val credentials = view.getHttpAuthUsernamePassword(host, realm)
val username = credentials!![0]
val password = credentials[1]
val i = Intent()
i.action = "SEND_CREDENTIALS"
i.putExtra("username", username)
i.putExtra("password", password)
view.context.sendBroadcast(i)
}
}
...
SEND_CREDENTIALS
recibirá el mensaje. La difusión ni siquiera está protegida con un permiso para limitar el número de destinatarios, aunque en este caso no recomendamos el uso de permisos como solución.
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];
CLLocation *location = [locationManager location];
// Configure the new event with information from the location
CLLocationCoordinate2D coordinate = [location coordinate];
NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];
NSLog(@"dLatitude : %@", latitude);
NSLog(@"dLongitude : %@",longitude);
NSString *urlWithParams = [NSString stringWithFormat:TOKEN_URL, latitude, longitude];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlWithParams]];
[request setHTTPMethod:@"GET"];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// Add password to user defaults
[defaults setObject:@"Super Secret" forKey:@"passwd"];
[defaults synchronize];
getPassword()
, que devuelve la contraseña en texto sin formato que ha suministrado el usuario asociada a la cuenta.
<?php
$pass = getPassword();
trigger_error($id . ":" . $pass . ":" . $type . ":" . $tstamp);
?>
Example 1
registra una contraseña de texto simple en el registro de eventos de la aplicación. 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.OWA_SEC.get_password()
devuelve la contraseña de texto simple proporcionada por el usuario asociada a la cuenta, que se imprime a continuación en la respuesta HTTP.
...
HTP.htmlOpen;
HTP.headOpen;
HTP.title (.Account Information.);
HTP.headClose;
HTP.bodyOpen;
HTP.br;
HTP.print('User ID: ' ||
OWA_SEC.get_user_id || '');
HTP.print('User Password: ' ||
OWA_SEC.get_password || '');
HTP.br;
HTP.bodyClose;
HTP.htmlClose;
...
getPassword()
, que devuelve la contraseña en texto sin formato que ha suministrado el usuario asociada a la cuenta.
pass = getPassword();
logger.warning('%s: %s %s %s', id, pass, type, tsstamp)
Example 1
registra una contraseña de texto simple en el registro de eventos de la aplicación. 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.get_password()
devuelve la contraseña de texto sin formato que ha suministrado el usuario asociada a la cuenta.
pass = get_password()
...
dbms_logger.warn("#{id}:#{pass}:#{type}:#{tstamp}")
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.
val pass = getPassword()
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp)
Example 1
registra una contraseña de texto sin formato en el sistema de archivos. Aunque muchos desarrolladores confían en el sistema de archivos 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.
import CoreLocation
...
var locationManager : CLLocationManager!
var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"
seenError = false
locationFixAchieved = false
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.locationServicesEnabled
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
...
if let location: CLLocation! = locationManager.location {
var coordinate : CLLocationCoordinate2D = location.coordinate
let latitude = NSString(format:@"%f", coordinate.latitude)
let longitude = NSString(format:@"%f", coordinate.longitude)
NSLog("dLatitude : %@", latitude)
NSLog("dLongitude : %@",longitude)
let urlString : String = "http://myserver.com/?lat=\(latitude)&lon=\(longitude)"
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)
} else {
println("no location...")
}
let defaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
// Add password to user defaults
defaults.setObject("Super Secret" forKey:"passwd")
defaults.synchronize()
getPassword
devuelve la contraseña de texto sin formato que ha suministrado el usuario asociada a la cuenta.
pass = getPassword
...
App.EventLog id & ":" & pass & ":" & type & ":" &tstamp, 4
...
Example 1
registra una contraseña de texto simple en el registro de eventos de la aplicación. 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.AppSearch
.
...
// Document object to index
val doc = Doc(
namespace="user1",
id="noteId",
score=10,
text="This document contains private data"
)
// Adding document object to AppSearch index
val putRequest = PutDocumentsRequest.Builder().addDocuments(doc).build()
SharedPreferences
.password
proporcionada por el usuario, que se guarda como texto sin formato.
SharedPreferences userPreferences = this.getSharedPreferences("userPreferences", MODE_WORLD_READABLE);
SharedPreferences.Editor editor = userPreferences.editor();
editor.putString("username", userName);
editor.putString("password", password);
...
editor.language("language", language);
...
SharedPreferences
de Android es, de forma predeterminada, privada para la aplicación y no se puede acceder a ella desde otras aplicaciones, el acceso físico al dispositivo podría permitir el acceso a estos archivos. Además, en el Example 1
, al establecer el modo en MODE_WORLD_READABLE
, se facilita el archivo de preferencias a otras aplicaciones, infringiendo de forma adicional la privacidad del usuario.
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.