封装即绘制强边界。在 Web 浏览器中,这可能意味着确保您的移动代码不会被其他移动代码滥用。在服务器上,这可能意味着区分已验证数据和未验证数据、区分一个用户的数据和另一个用户的数据,或者区分允许用户查看的数据和不允许用户查看的数据。
WebMessage message = new WebMessage(WEBVIEW_MESSAGE);
webview.postWebMessage(message, Uri.parse("*"));
*
作为目标源的值表示无论源如何,脚本都会将消息发送到窗口。
o.contentWindow.postMessage(message, '*');
*
作为目标源的值表示无论来源如何,脚本都会将信息发送到窗口。Unsafe-URL
可能会导致应用程序向第三方站点暴露敏感站点和用户数据(包括会话标记、用户名和密码)。Referrer-Policy
标头会被引入,以控制与引用标头相关的浏览器行为。Unsafe-URL
选项会删除所有限制,并随每一个请求发送引用标头。
<http auto-config="true">
...
<headers>
...
<referrer-policy policy="unsafe-url"/>
</headers>
</http>
Content-Security-Policy-Report-Only
标头可以让 Web 应用程序作者和管理员监控而不是强制实施安全策略。此标头通常用于试验和/或开发站点安全策略。假若策略有效,则可以转而使用 Content-Security-Policy
标头字段强制实施该策略。Report-Only
模式下设置内容安全策略:
<http auto-config="true">
...
<headers>
...
<content-security-policy report-only="true" policy-directives="default-src https://content.cdn.example.com" />
</headers>
</http>
Content-Security-Policy-Report-Only
标头可以让 Web 应用程序作者和管理员监控而不是强制实施安全策略。此标头通常用于试验和/或开发站点安全策略。假若策略有效,则可以转而使用 Content-Security-Policy
标头强制实施该策略。Report-Only
模式:
response.content_security_policy_report_only = "*"
SLComposeServiceViewController isContentValid
以在使用收到的不可信数据前进行验证。
#import <MobileCoreServices/MobileCoreServices.h>
@interface ShareViewController : SLComposeServiceViewController
...
@end
@interface ShareViewController ()
...
@end
@implementation ShareViewController
- (void)didSelectPost {
NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
NSItemProvider *itemProvider = item.attachments.firstObject;
...
// Use the received items
...
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
...
@end
SLComposeServiceViewController isContentValid
以在使用收到的不可信数据前进行验证。SLComposeServiceViewController isContentValid
回调方法来验证这些数据:
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
...
override func didSelectPost() {
let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
let itemProvider = extensionItem.attachments?.first as! NSItemProvider
...
// Use the received items
...
self.extensionContext?.completeRequestReturningItems([], completionHandler:nil)
}
...
}
webview
使用 URL 与您的应用程序通信时,作为接收方的应用程序应验证预期与其通信的应用程序允许列表中是否包含发送方。作为接收方的应用程序可选择使用 UIApplicationDelegate application:openURL:options:
或 UIApplicationDelegate application:openURL:sourceApplication:annotation:
代理方法来验证调用 URL 的来源。UIApplicationDelegate application:openURL:options:
代理方法的以下实现在未验证 IPC 调用发送方的情况下便处理了调用 URL:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
NSString *theQuery = [[url query] stringByRemovingPercentEncoding:NSUTF8StringEncoding];
NSArray *chunks = [theQuery componentsSeparatedByString:@"&"];
for (NSString* chunk in chunks) {
NSArray *keyval = [chunk componentsSeparatedByString:@"="]; NSString *key = [keyval objectAtIndex:0];
NSString *value = [keyval objectAtIndex:1];
// Do something with your key and value
}
return YES;
}
wewbview
使用 URL 与您的应用程序通信时,作为接收方的应用程序应验证预期与其通信的应用程序允许列表中是否包含发送方。作为接收方的应用程序可选择使用 UIApplicationDelegate application:openURL:options:
或 UIApplicationDelegate application:openURL:sourceApplication:annotation:
代理方法来验证调用 URL 的来源。UIApplicationDelegate application:openURL:options:
代理方法的以下实现在未验证 IPC 调用发送方的情况下便处理了调用 URL:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
return processCall(url)
}
webview
使用 URL 与您的应用程序通信时,作为接收方的应用程序应在执行进一步操作之前验证该调用 URL。作为接收方的应用程序可选择使用 UIApplicationDelegate application:didFinishLaunchingWithOptions:
或 UIApplicationDelegate application:willFinishLaunchingWithOptions:
代理方法来验证其是否可以打开该调用 URL。UIApplicationDelegate application:didFinishLaunchingWithOptions:
代理方法的以下实现未对调用 URL 进行验证,因而总是会处理不可信的 URL:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS Dictionary *)launchOptions {
return YES;
}
webview
使用 URL 与您的应用程序通信时,作为接收方的应用程序应在执行进一步操作之前验证该调用 URL。作为接收方的应用程序可选择使用 UIApplicationDelegate application:didFinishLaunchingWithOptions:
或 UIApplicationDelegate application:willFinishLaunchingWithOptions:
代理方法来验证其是否可以打开该调用 URL。UIApplicationDelegate application:didFinishLaunchingWithOptions:
代理方法的以下实现未对调用 URL 进行验证,因而总是会处理不可信的 URL:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
return true
}