封装即绘制强边界。在 Web 浏览器中,这可能意味着确保您的移动代码不会被其他移动代码滥用。在服务器上,这可能意味着区分已验证数据和未验证数据、区分一个用户的数据和另一个用户的数据,或者区分允许用户查看的数据和不允许用户查看的数据。
url-invoke-disallowed
设置缺乏清晰度,且如果默认值意外更改,可能会导致不必要的行为。HTTP 403
状态代码。但是,依赖隐式设置始终缺乏清晰度,且如果以下默认设置更改,可能会导致不必要的行为。url-invoke-disallowed
设置的任务流示例。
...
<task-flow-definition id="password">
<default-activity>PasswordPrompt</default-activity>
<view id="PasswordPrompt">
<page>/PasswordPrompt.jsff</page>
</view>
<use-page-fragments/>
</task-flow-definition>
...
Resources:
EBSVOLExample:
Type: AWS::EC2::Volume
Properties:
Encrypted: false
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"MyMethod0": {
"Type": "AWS::ApiGateway::Method",
"Properties": {
"RestApiId": "MyAPIID",
"ResourceId": "MyResourceID",
"HttpMethod": "GET",
"AuthorizationType": "NONE"
}
},
"MyMethod1": {
"Type": "AWS::ApiGateway::Method",
"Properties": {
"RestApiId": "MyAPIID",
"ResourceId": "MyResourceID",
"HttpMethod": "POST",
"AuthorizationType": "NONE",
"ApiKeyRequired": false
}
}
}
}
AWSTemplateFormatVersion: "2010-09-09"
Description: "Example"
Resources:
TestMethod:
Type: "AWS::ApiGateway::Method"
Properties:
RestApiId: !Ref restAPIRes
ResourceId: !GetAtt
- restAPIRes
- RootResourceId
HttpMethod: GET
AuthorizationType: NONE
{
"Resources": {
"LambdaPerm": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"SourceAccount": "AWS::AccountId",
"SourceArn": "bucket.Arn",
"FunctionName": "function.Arn",
"Action": "lambda:InvokeFunction",
"Principal": "*"
}
}
},
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Lambda Permission"
}
AWSTemplateFormatVersion: "2010-09-09"
Description: Lambda Permission
Resources:
LambdaPerm:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !GetAtt function.Arn
Action: lambda:InvokeFunction
Principal: "*"
SourceAccount: !Ref "AWS::AccountId"
SourceArn: !GetAtt bucket.Arn
"Resources": {
"DocDBDefault": {
"Type": "AWS::DocDB::DBCluster",
"Properties": {
"MasterUsername": "name",
"MasterUserPassword": "password"
}
}
Resources:
DocDBDInst:
Type: AWS::DocDB::DBCluster
Properties:
MasterUsername: myUser
MasterUserPassword: password
"Resources": {
"EBSVOLExample": {
"Type": "AWS::EC2::Volume",
"Properties": {
"Encrypted": false,
}
}
}
Resources:
EBSVOLExample:
Type: AWS::EC2::Volume
Properties:
Encrypted: false
{
"Description": "ElastiCache redis",
"Resources": {
"MyReplicationGroup": {
"Type": "AWS::ElastiCache::ReplicationGroup",
"Properties": {
"AutomaticFailoverEnabled": true,
"CacheNodeType": {
"Ref": "CacheNodeType"
},
Cache "ParameterGroupName": {
"Ref": "CacheParameterGroup"
},
"CacheSubnetGroupName": {
"Ref": "CacheSubnetGroupName"
},
"Engine": "redis",
"EngineVersion": {
"Ref": "EngineVersion"
},
"NumNodeGroups": {
"Ref": "NumShards"
},
"ReplicasPerNodeGroup": {
"Ref": "NumReplicas"
},
"PreferredMaintenanceWindow": "sat:10:00-sat:08:00",
"SecurityGroupIds": [
{
"Ref": "SecurityGroup"
}
],
"SnapshotRetentionLimit": {
"Ref": "SnapshotRetentionLimit"
},
"SnapshotWindow": "00:00-03:00"
},
"UpdatePolicy": {
"UseOnlineResharding": true
}
}
}
}
Description: 'ElastiCache redis'
Resources:
MyReplicationGroup:
Type: AWS::ElastiCache::ReplicationGroup
Properties:
AutomaticFailoverEnabled: true
CacheNodeType: !Ref CacheNodeType
CacheParameterGroupName: !Ref CacheParameterGroup
CacheSubnetGroupName: !Ref CacheSubnetGroupName
Engine: redis
EngineVersion: !Ref EngineVersion
NumNodeGroups: !Ref NumShards
ReplicasPerNodeGroup: !Ref NumReplicas
PreferredMaintenanceWindow: 'sat:10:00-sat:08:00'
SecurityGroupIds:
- !Ref SecurityGroup
SnapshotRetentionLimit: !Ref SnapshotRetentionLimit
SnapshotWindow: '00:00-03:00'
UpdatePolicy:
UseOnlineResharding: true
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "My Neptune DB cluster",
"Resources": {
"NeptuneDBCluster": {
"Type": "AWS::Neptune::DBCluster",
"Properties": {
"BackupRetentionPeriod": 10,
"DBClusterIdentifier": "MyDBClusterIdentifier",
"DBClusterParameterGroupName": "MyNeptuneDBClusterParameterGroup",
"DBSubnetGroupName": "MyNeptuneDBSubnetGroup",
"IamAuthEnabled": true,
"Port": 8080,
"PreferredBackupWindow": "NeptuneDBClusterPreferredBackupWindow",
"PreferredMaintenanceWindow": "NeptuneDBClusterPreferredMaintenanceWindow"
}
}
}
}
AWSTemplateFormatVersion: 2010-09-09
Description: My Neptune DB cluster
Resources:
NeptuneDBCluster:
Type: "AWS::Neptune::DBCluster"
Properties:
BackupRetentionPeriod: 10
DBClusterIdentifier: MyDBClusterIdentifier
DBClusterParameterGroupName: MyNeptuneDBClusterParameterGroup
DBSubnetGroupName: MyNeptuneDBSubnetGroup
IamAuthEnabled: true
Port: 8080
PreferredBackupWindow: NeptuneDBClusterPreferredBackupWindow
PreferredMaintenanceWindow: NeptuneDBClusterPreferredMaintenanceWindow
"Resources": {
"RDSDBExample": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"StorageEncrypted": false,
"DBName": "Test DB",
"DBInstanceClass": "db.m4.large"
}
}
}
"Resources": {
"RedshiftClusterTest": {
"Type": "AWS::Redshift::Cluster",
"Properties": {
"DBName": "mydb",
"MasterUsername": "master",
"MasterUserPassword": "masterPass",
"NodeType": "ds2.xlarge",
"ClusterType": "single-node",
}
}
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "My SNS topic",
"Resources": {
"MySNSTopic": {
"Type": "AWS::SNS::Topic",
"Properties": {
"Subscription": [
{
"Endpoint": "MySNSEndpoint",
"Protocol": "sqs"
}
],
"TopicName": "MyTopic"
}
}
}
}
AWSTemplateFormatVersion: 2010-09-09
Description: My SNS Topic
Resources:
MySNSTopic:
Type: AWS::SNS::Topic
Properties:
Subscription:
- Endpoint: "MySNSEndpoint"
Protocol: "sqs"
TopicName: "SampleTopic"
kSecAccessControlUserPresence
:限制为通过 Touch ID 或密码访问。不要求 Touch ID 可用或已注册。添加或删除指纹后,仍可通过 Touch ID 访问项目。kSecAccessControlTouchIDAny
:限制为通过 Touch ID 使用任何已注册的指纹访问。添加或删除指纹后,项目不会失效。kSecAccessControlTouchIDCurrentSet
:限制为通过 Touch ID 使用当前已注册的指纹访问。添加或删除指纹后,项目将会失效。kSecAccessControlTouchIDCurrentSet
属性阻止以后添加指纹或删除现有指纹。kSecAccessControlTouchIDAny
限制,该项限制允许任何以后注册的指纹对密钥链项目解除锁定:
...
SecAccessControlRef sacRef = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
kSecAccessControlTouchIDCurrentSet,
nil);
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:account forKey:(__bridge id)kSecAttrAccount];
[dict setObject:service forKey:(__bridge id) kSecAttrService];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:sacRef forKey:(__bridge id)kSecAttrAccessControl];
[dict setObject:@"Please authenticate using the Touch ID sensor." forKey:(__bridge id)kSecUseOperationPrompt];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dict, nil);
});
...
kSecAccessControlUserPresence
:限制为通过 Touch ID 或密码访问。不要求 Touch ID 可用或已注册。添加或删除指纹后,仍可通过 Touch ID 访问项目。kSecAccessControlTouchIDAny
:限制为通过 Touch ID 使用任何已注册的指纹访问。添加或删除指纹后,项目不会失效。kSecAccessControlTouchIDCurrentSet
:限制为通过 Touch ID 使用当前已注册的指纹访问。添加或删除指纹后,项目将会失效。kSecAccessControlTouchIDCurrentSet
属性阻止以后添加指纹或删除现有指纹。kSecAccessControlTouchIDAny
限制,该项限制允许任何以后注册的指纹对密钥链项目解除锁定:
...
let flags = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
.TouchIDAny,
nil)
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecAttrService as String] = service as AnyObject?
query[kSecAttrAccount as String] = account as AnyObject?
query[kSecValueData as String] = secret as AnyObject?
...
query[kSecAttrAccessControl as String] = sacRef
query[kSecUseOperationPrompt as String] = "Please authenticate using the Touch ID sensor."
SecItemAdd(query as CFDictionary, nil)
...
<cfdump>
标签可能会泄漏敏感信息。<cfdump>
标签。虽然在软件开发过程中允许使用 <cfdump>
标签,但是作为开发者,对代码负责是 Web 应用程序开发的重要部分,所以应该仔细考虑是否能够使用每一个 <cfdump>
标签。