Segurança de software não é o mesmo que software de segurança. Aqui, estamos interessados em tópicos como autenticação, controle de acesso, confidencialidade, criptografia e gestão de privilégios.
pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
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
receberá a mensagem. A transmissão nem mesmo é protegida com uma permissão para limitar o número de destinatários, embora, neste caso, não recomendemos o uso de permissões como correção.FileIOPermissions
necessárias no aplicativo.
...
String permissionsXml = GetPermissionsFromXmlFile();
FileIOPermission perm = new FileIOPermission(PermissionState.None);
perm.FromXml(permissionsXml);
perm.Demand();
...
...
CrytoKeyAuditRule auditRule = new CryptoKeyAuditRule(IdRef, (CryptoKeyRights) input, AuditFlags.Success);
...
input
, ele poderá especificar o tipo de operação que pode ser registrada. Se o usuário puder manipular isso para CryptoKeyRights.Delete
, ele poderá ler a chave de criptografia sem que seja registrada, o que não permite saber que um invasor roubou suas chaves de criptografia.
...
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 uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
ResetPasswordResult passRes = System.resetPassword(id1, true);
System.Debug('New password: '+passRes.getPassword());
...
pass = GetPassword();
...
dbmsLog.WriteLine(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.get_password()
retorna a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
pass = get_password();
...
fprintf(dbms_log, "%d:%s:%s:%s", id, pass, type, tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no sistema de arquivos como um local de armazenamento seguro para todos os tipos de dados, convém não confiar nele implicitamente, particularmente nos casos em que a privacidade é uma grande preocupação.
...
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
contém a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
<cflog file="app_log" application="No" Thread="No"
text="#Session.uname#:#Session.pword#:#type#:#Now()#">
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
var pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.GetPassword()
, que retorna a senha em texto sem formatação fornecida pelo usuário e associada à conta.
pass = GetPassword();
...
if err != nil {
log.Printf('%s: %s %s %s', id, pass, type, tsstamp)
}
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
pass = getPassword();
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp);
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
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
receberá a mensagem. A transmissão nem mesmo é protegida com uma permissão para limitar o número de destinatários, embora, neste caso, não recomendemos o uso de permissões como correção.
localStorage.setItem('password', password);
pass = getPassword()
...
dbmsLog.println("$id:$pass:$type:$tstamp")
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
...
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
receberá a mensagem. A transmissão nem mesmo é protegida com uma permissão para limitar o número de destinatários, embora, neste caso, não recomendemos o uso de permissões como correção.
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 retorna a senha de texto sem formatação fornecida pelo usuário com a conta.
<?php
$pass = getPassword();
trigger_error($id . ":" . $pass . ":" . $type . ":" . $tstamp);
?>
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.OWA_SEC.get_password()
retorna a senha de texto simples fornecida pelo usuário associada à conta, que é então impressa à resposta 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 retorna a senha de texto sem formatação fornecida pelo usuário com a conta.
pass = getPassword();
logger.warning('%s: %s %s %s', id, pass, type, tsstamp)
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.get_password()
retorna a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
pass = get_password()
...
dbms_logger.warn("#{id}:#{pass}:#{type}:#{tstamp}")
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
val pass = getPassword()
...
dbmsLog.println(id+":"+pass+":"+type+":"+tstamp)
Example 1
registra uma senha de texto sem formatação no sistema de arquivos. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.
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
retorna a senha de texto sem formatação fornecida pelo usuário que está associada à conta.
pass = getPassword
...
App.EventLog id & ":" & pass & ":" & type & ":" &tstamp, 4
...
Example 1
registra uma senha de texto sem formatação no log de eventos do aplicativo. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.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
fornecida pelo usuário é armazenada no dispositivo em texto sem formatação.
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
do Android sejam particulares para o aplicativo e não possam ser acessadas por outros aplicativos, o acesso físico ao dispositivo pode permitir o acesso a esses arquivos. Além disso, no Example 1
, a definição do modo como MODE_WORLD_READABLE
disponibiliza o arquivo de preferências para outros aplicativos, violando ainda mais a privacidade do usuário.
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 um desenvolvedor crie um aplicativo que pode ler todos os logs no dispositivo (mesmo quando eles não são proprietários dos outros aplicativos).
...
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 um desenvolvedor crie um aplicativo que pode ler todos os logs no dispositivo (mesmo quando eles não são proprietários dos outros aplicativos).
...
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 um desenvolvedor crie um aplicativo que pode ler todos os logs no dispositivo (mesmo quando eles não são proprietários dos outros aplicativos).
...
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
é um objeto imutável, o conteúdo não pode ser anulado, o que significa que os dados confidenciais estão abertos a qualquer pessoa capaz de inspecionar o heap antes de coleta de lixo.String
torna impossível limpar com segurança os dados da memória.String
s são usados para armazenar dados confidenciais, como os objetosString
são imutáveis, apenas o coletor de lixo JVM pode remover o valor de um String
da memória só pode ser feito pelo coletor de lixo da JVM. Não é necessário que o coletor de lixo seja executado, a menos que a JVM esteja com pouca memória, portanto, não há garantia de quando a coleta de lixo ocorrerá. No caso de uma falha do aplicativo, um despejo de memória do aplicativo pode revelar dados confidenciais.String
.
private JPasswordField pf;
...
final char[] password = pf.getPassword();
...
String passwordAsString = new String(password);
String
torna impossível limpar com segurança os dados da memória.String
s são usados para armazenar dados confidenciais, no entanto, como os objetos String
são imutáveis, atribuir um novo valor a eles criará um novo String
e atribuirá sua referência àquele que está sendo atribuído. O valor original será mantido na memória até que o ARC
(Automatic Reference Counting) desaloque o objeto e libere sua memória. O Swift não garante a vida útil de um objeto até o final do escopo circundante mais próximo. Se um invasor eliminar o conteúdo da memória antes que o objeto seja desalocado, o conteúdo poderá ser lido.String
.
let password = passwordTextField.text!
// use the password
GET
em vez do método POST
para enviar dados ao servidor.GET
permitem que os parâmetros de URL e de solicitação sejam armazenados no cache de URL do navegador, nos proxies intermediários e nos logs do servidor. Isso poderia expor informações confidenciais a pessoas que não têm direitos apropriados aos dados.Exemplo 2: Se o aplicativo usa NSURLRequest, então o método HTTP padrão 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
em vez do método POST
para enviar dados ao servidor.GET
permitem que os parâmetros de URL e de solicitação sejam armazenados no cache de URL do navegador, nos proxies intermediários e nos logs do servidor. Isso poderia expor informações confidenciais a pessoas que não têm direitos apropriados aos dados.
...
$client = new Zend_Http_Client('https://www.example.com/fetchdata.php');
$client->request(Zend_Http_Client::GET);
...
GET
em vez do método POST
para enviar dados ao servidor.GET
permitem que os parâmetros de URL e de solicitação sejam armazenados no cache de URL do navegador, nos proxies intermediários e nos logs do servidor. Isso poderia expor informações confidenciais a pessoas que não têm direitos apropriados aos dados.Exemplo 2: Se o aplicativo usa NSURLRequest, então o método HTTP padrão 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
sincronizável, que será distribuída para todos os dispositivos sincronizados e armazenada no ambiente do iCloud da Apple.NSURLCredential
que contém as credenciais do usuário na forma, em um par de nome do usuário/senha ou em um certificado de cliente, um atributo de persistência precisa ser definido. Os valores possíveis são:NSURLCredentialPersistenceNone
: A credencial não deve ser armazenada.NSURLCredentialPersistenceForSession
: A credencial deve ser armazenada somente para esta sessão.NSURLCredentialPersistencePermanent
: A credencial deve ser armazenada no conjunto de chaves.NSURLCredentialPersistenceSynchronizable
: A credencial deve ser armazenada permanentemente no conjunto de chaves e, além disso, deve ser distribuída para outros dispositivos, com base na Apple ID do proprietário.NSURLCredentialPersistenceSynchronizable
implica na distribuição da credencial e de seu armazenamento no ambiente de nuvem da Apple. Dependendo dos requisitos de privacidade do aplicativo, armazenar a credencial no ambiente de nuvem da Apple pode não ser aceitável.
...
NSURLCredential *credential = [NSURLCredential credentialWithUser:user password:password persistence:NSURLCredentialPersistenceSynchronizable];
NSURLCredentialStorage *shared = [NSURLCredentialStorage sharedCredentialStorage];
[shared setDefaultCredential:credential forProtectionSpace:protectionSpace];
...
NSURLCredential
sincronizável, que será distribuída para todos os dispositivos sincronizados e armazenada no ambiente do iCloud da Apple.NSURLCredential
que contém as credenciais do usuário na forma, em um par de nome do usuário/senha ou em um certificado de cliente, um atributo de persistência precisa ser definido. Os valores possíveis são:NSURLCredentialPersistenceNone
: A credencial não deve ser armazenada.NSURLCredentialPersistenceForSession
: A credencial deve ser armazenada somente para esta sessão.NSURLCredentialPersistencePermanent
: A credencial deve ser armazenada no conjunto de chaves.NSURLCredentialPersistenceSynchronizable
: A credencial deve ser armazenada permanentemente no conjunto de chaves e, além disso, deve ser distribuída para outros dispositivos, com base na Apple ID do proprietário.NSURLCredentialPersistenceSynchronizable
implica na distribuição da credencial e de seu armazenamento no ambiente de nuvem da Apple. Dependendo dos requisitos de privacidade do aplicativo, armazenar a credencial no ambiente de nuvem da Apple pode não ser aceitável.
...
let credential = NSURLCredential(user:foo, password:password, persistence:.Synchronizable)
let shared = NSURLCredentialStorage.sharedCredentialStorage()
shared.setCredential(credential, forProtectionSpace:protectionSpace)
...
DataVisualization
que gera um gráfico de informações financeiras confidenciais a partir da Fonte de Dados 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
instrui o controle Chart
a produzir uma imagem JPEG do gráfico de barras e gravá-la no diretório temporário ~/Temporary/Graph
. Depois que o controle gravar a imagem no disco, o navegador do usuário realizará uma solicitação posterior do arquivo e o exibirá para o usuário. A imagem não é gravada de forma segura no disco. Além disso, o código pressupõe que a infraestrutura subjacente protegerá o arquivo de acessos não autorizados por outro usuário.NSURLCredential
localmente, mas não consegue remover a cópia armazenada em outros dispositivos e no iCloud.NSURLCredential
que contém as credenciais do usuário na forma, em um par de nome do usuário/senha ou em um certificado de cliente, um atributo de persistência precisa ser definido. Os valores possíveis são:NSURLCredentialPersistenceNone
: A credencial não deve ser armazenada.NSURLCredentialPersistenceForSession
: A credencial deve ser armazenada somente para esta sessão.NSURLCredentialPersistencePermanent
: A credencial deve ser armazenada no conjunto de chaves.NSURLCredentialPersistenceSynchronizable
: A credencial deve ser armazenada permanentemente no conjunto de chaves e, além disso, deve ser distribuída para outros dispositivos, com base na AppleID do proprietário.NSURLCredentialPersistenceSynchronizable
são distribuídas para outros dispositivos e para o iCloud, a falha em remover completamente a credencial de todos os locais deixará instâncias que poderiam vazar.
...
// 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
localmente, mas não consegue remover a cópia armazenada em outros dispositivos e no iCloud.NSURLCredential
que contém as credenciais do usuário na forma, em um par de nome do usuário/senha ou em um certificado de cliente, um atributo de persistência precisa ser definido. Os valores possíveis são:NSURLCredentialPersistenceNone
: A credencial não deve ser armazenada.NSURLCredentialPersistenceForSession
: A credencial deve ser armazenada somente para esta sessão.NSURLCredentialPersistencePermanent
: A credencial deve ser armazenada no conjunto de chaves.NSURLCredentialPersistenceSynchronizable
: A credencial deve ser armazenada permanentemente no conjunto de chaves e, além disso, deve ser distribuída para outros dispositivos, com base na AppleID do proprietário.NSURLCredentialPersistenceSynchronizable
são distribuídas para outros dispositivos e para o iCloud, a falha em remover completamente a credencial de todos os locais deixará instâncias que poderiam vazar.
...
// 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
armazena um número de cartão de crédito em texto sem formatação associado à conta que é fornecido pelo usuário.
<?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
armazena informações particulares do usuário contidas no dispositivo móvel em um arquivo plist desprotegido que é armazenado nesse dispositivo. Embora muitos desenvolvedores confiem em arquivos plist como um local de armazenamento seguro para todos os tipos de dados, convém não confiar neles implicitamente, particularmente nos casos em que a privacidade é uma grande preocupação, pois esses arquivos podem ser lidos por qualquer usuário que venha a se apossar do dispositivo.
ViewController.h
...
@property (nonatomic, retain) IBOutlet UITextField *ssnField;
...
Example 1
indica que o aplicativo utiliza um controle de entrada projetado para coletar informações confidenciais. Como o iOS armazena entradas de campos de texto em cache para melhorar o desempenho da respectiva funcionalidade de correção automática, todas as informações inseridas recentemente nesse controle de entrada podem ser armazenadas em cache em um arquivo de cache de teclado salvo no sistema de arquivos. Uma vez que o arquivo de cache do teclado é armazenado no dispositivo, se o dispositivo for perdido poderá ser recuperado, revelando assim quaisquer informações confidenciais contidas nele.
...
@IBOutlet weak var ssnField: UITextField!
...
Example 1
indica que o aplicativo utiliza um controle de entrada projetado para coletar informações confidenciais. Como o iOS armazena entradas de campos de texto em cache para melhorar o desempenho da respectiva funcionalidade de correção automática, todas as informações inseridas recentemente nesse controle de entrada podem ser armazenadas em cache em um arquivo de cache de teclado salvo no sistema de arquivos. Uma vez que o arquivo de cache do teclado é armazenado no dispositivo, se o dispositivo for perdido poderá ser recuperado, revelando assim quaisquer informações confidenciais contidas nele.
ViewController.h
...
@property (nonatomic, retain) IBOutlet UITextField *ssnField;
...
Example 1
indica que o aplicativo utiliza um controle de entrada projetado para coletar informações confidenciais. Como o iOS faz uma captura de tela da exibição ativa de um aplicativo quando ele é posto em segundo plano para melhorar o desempenho da animação, qualquer informação exibida nesses controles de entrada durante o evento de segundo plano pode ser armazenada em cache em uma imagem salva no sistema de arquivos. Uma vez que essas capturas de tela são armazenadas no dispositivo, se o dispositivo for perdido poderá ser recuperado, revelando assim quaisquer informações confidenciais contidas nele.
...
@IBOutlet weak var ssnField: UITextField!
...
Example 1
indica que o aplicativo utiliza um controle de entrada projetado para coletar informações confidenciais. Como o iOS faz uma captura de tela da exibição ativa de um aplicativo quando ele é posto em segundo plano para melhorar o desempenho da animação, qualquer informação exibida nesses controles de entrada durante o evento de segundo plano pode ser armazenada em cache em uma imagem salva no sistema de arquivos. Uma vez que essas capturas de tela são armazenadas no dispositivo, se o dispositivo for perdido poderá ser recuperado, revelando assim quaisquer informações confidenciais contidas nele.Documents
sem mascará-los corretamente primeiro.Documents
foi projetado para armazenar dados de aplicativo não transitórios, como conteúdo criado pelo usuário ou informações locais, que permitem que o aplicativo seja executado em modo offline. Se UIFileSharingEnabled
estiver definido no arquivo Info.plist
do aplicativo, os arquivos presentes aqui serão acessíveis pelo iTunes. Ao gravar dados confidenciais no diretório Documents
, os dados podem ser expostos a backups não criptografados ou por meio da interface do 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
sem mascará-los corretamente primeiro.Documents
foi projetado para armazenar dados de aplicativo não transitórios, como conteúdo criado pelo usuário ou informações locais, que permitem que o aplicativo seja executado em modo offline. Se UIFileSharingEnabled
estiver definido no arquivo Info.plist
do aplicativo, os arquivos presentes aqui serão acessíveis pelo iTunes. Ao gravar dados confidenciais no diretório Documents
, os dados podem ser expostos a backups não criptografados ou por meio da interface do 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
como a senha, o que significa que, por padrão, ela será mostrada quando exibida:
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
no Example 1
não especificou o atributo [DataType(DataType.Password)]
, ele não será oculto por padrão quando for exibido na interface do usuário.TextField
não oculta a senha de um usuário conforme ele a digita no prompt 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
no Example 1
foi instanciado com a propriedade obscureText
, definida como true
, a senha do usuário não será obscurecida quando ele a digitar no prompt "Please enter your password: ".PasswordCallback pc = new PasswordCallback("Please enter your password: ", true);
pc
no Exemplo 1
foi instanciado com seu segundo parâmetro onEcho
definido como true
, a senha do usuário não será obscurecida quando ele a digitar no prompt "Please enter your password: ".
ViewController.h:
...
@property (nonatomic, retain) IBOutlet UITextField *passwordField;
...
ViewController.m:
...
NSString *password = _passwordField.text;
...
passwordField
no Exemplo 1
não tem a respectiva propriedade secureTextEntry
definida como true
, a senha não será obscurecida quando o usuário a digitar no campo de texto.
...
@IBOutlet weak var passwordField: UITextField!
...
let password = passwordField.text
...
passwordField
no Exemplo 1
não tem a respectiva propriedade secureTextEntry
definida como true
, a senha não será obscurecida quando o usuário a digitar no 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
grava admin_password
em texto simples (não ofuscado) na saída do log, pois o valor de secret
é definido como False
. Embora muitos desenvolvedores confiem no log de eventos como um local de armazenamento seguro para os dados, ele não deve ser confiado de forma implícita, especialmente quando a privacidade é uma preocupação.