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.<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão ACTIVITY_RECOGNITION
, que permite que um aplicativo reconheça as atividades físicas do usuário.<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão READ_CALENDAR
, que permite que um aplicativo leia os dados de calendário do usuário.<uses-permission android:name="android.permission.READ_CALENDAR"/>Exemplo 2: O elemento
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão WRITE_CALENDAR
, que permite que um aplicativo escreva nos dados de calendário do usuário.<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão READ_CALL_LOG
, que permite que um aplicativo leia o registro de chamadas do usuário.<uses-permission android:name="android.permission.READ_CALL_LOG"/>Exemplo 2: O elemento
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão WRITE_CALL_LOG
, que permite que um aplicativo escreva no registro de chamadas do usuário.<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão CAMERA
, que permite que um aplicativo acesse a câmera do dispositivo.<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão READ_CONTACTS
, que permite que um aplicativo leia os dados de contatos do usuário.<uses-permission android:name="android.permission.READ_CONTACTS"/>Exemplo 2: O elemento
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão WRITE_CONTACTS
, que permite que um aplicativo escreva nos dados de contatos do usuário.<uses-permission android:name="android.permission.WRITE_CONTACTS"/>Exemplo 3: O elemento
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão GET_ACCOUNTS
, que permite que um aplicativo acesse o e-mail e as contas on-line do usuário armazenados no Account Manager. É possível acessar dados confidenciais, como IDs de conta, endereços de e-mail e números de telefone, com essa permissão.<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission .../>
de AndroidManifest.xml declara o uso da permissão WRITE_EXTERNAL_STORAGE
, que permite que um aplicativo grave em um espaço de armazenamento externo.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>Exemplo 2:O elemento
<uses-permission .../>
do AndroidManifest.xml declara o uso da permissão READ_EXTERNAL_STORAGE
, que permite que um aplicativo leia de um espaço de armazenamento externo.<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>