IT技术互动交流平台

构建Win8应用商店应用的安全最佳做法

来源:Windows 8 应用程序开发人员博客  发布日期:2012-12-28 10:35:47

确保客户放心地使用应用是我们为 Windows 应用商店应用创建应用平台的主要目的之一。我们希望客户确信应用将按客户预期的方式工作,能够与其他应用和谐共存且能够卸载干净。客户信任的建立基于多种因素:从 Windows 应用商店上架,到无障碍安装和卸载,再到使用位置信息和网络摄像头之前征询客户同意,以及用于测试应用是否符合 Windows 应用商店提交条件的 Windows 应用认证工具包。客户信任不是基于任何单一功能、流程或质量获得的,它综合了多种因素,因此,客户信任贯穿整个端到端流程。我们在提供可靠、可信的应用博文中已详细介绍了我们所采取的措施。

现在,我们希望具体讨论一下有关安全应用的话题,如何才能让您的应用赢得客户信任。当今的应用通常会保存重要的客户数据,从财务记录到不可替代的个人照片,不一而足。对于许多客户来说,这些数据与其生活息息相关,他们希望应用能够保护数据的安全。即便应用保存的数据非常少,客户仍然希望应用能够按设计的方式工作,不会干扰其他应用的运行。

在应用中实施安全最佳做法对于赢得客户信任、逐渐提高客户满意度至关重要。幸运的是,常用的安全最佳做法都非常简单易行,为您的应用增加安全保护并不太难。此外,应用在专用的应用容器上下文中运行,可以将该应用及其数据与其他应用隔离。应用容器为您的应用提供专用的环境,包括用于存储数据和设置的专用存储空间。 www.it165.net

Windows 8 和 Visual Studio 2012 提供了一系列 API、控件和工具,可以最大限度地减少可能存在的应用漏洞,缓解常见的安全问题。当然,任何平台都无法做到完美无缺,但我们相信,将这些安全措施进行有效的组合搭配,必将能构建出杰出的应用,我们还将继续对应用平台进行改进。在本博文中,我们介绍了一些增强应用安全性的技巧和最佳做法,帮助您为客户提供更加安全可靠的体验。

我们现在就开始吧!

技巧 1 – 使用 Visual Studio 进行编译

从 Windows 8 开始,我们默认启用了许多现有的安全最佳做法,您无需进行任何设置,只需使用 Visual Studio 2012 进行编译即可。在使用 Visual Studio 2012 进行编译时,默认情况下,现在将为应用内的本机代码启用以下安全技术,以保护应用免受常见攻击的威胁:/GS、ASLR、DEP 和 SeHOP。

技巧 2 – 最大限度地缩减应用功能

应用可以依次声明各项功能,定义应用与不同资源和设备的交互方式。请注意,您需要根据应用需求定义最小的功能集,确保应用以必需的最小特权运行。通过使用最小的功能集,可以减少应用中可被利用的漏洞数量。

例如,“家庭和工作网络”功能允许应用访问本地网络中的计算机,比如玩对等游戏。此项功能对于本地服务的预发行测试也非常有用,但通常并非应用必不可少的功能,且可能导致应用被不受信任的本地网络(例如,咖啡店或机场的无线接入点)所利用。请考虑删除该功能,转而使用远程服务器来执行测试,远程服务器可以为应用重现现实世界的交互环境,测试效果更准确。如果您使用了“家庭和工作网络”功能,在提交应用申请应用商店认证之前,请务必将其删除。


 

采用最小功能集的应用 – 仅具备 Internet 访问功能!

请注意,“企业身份验证”、“共享用户证书”和“文档库”功能专门针对企业访问和嵌入文档(例如,打开的文档需要打开所包含的其他文档)而设计,需要公司帐户才能将包含这些功能的应用提交至 Windows 应用商店。大多数应用通常不需要使用这些功能,但对于需要访问企业资源的企业应用来说,这些功能是必需的。这些功能受到严格限制,必须接受附加的 Windows 应用商店审查才能使用这些功能。

技巧 3 – 使用文件选取器代替库功能

在技巧 2“最大限度地缩减功能”的基础上,您通常会禁用基于文件的所有功能。如果您的应用仅需要访问少量文件,可以允许用户使用文件选取器来选择文件。文件选取器可以简化应用代码,允许用户轻松地精确访问所需的文件,而不必启用附加的应用功能。对于所有应用来说,文件选取器都是相同的,因此,当用户首次使用您的应用时,他们将能够即刻熟悉文件选择对话框,并在选择所需文件后快速返回您的应用。


 

  显示图片库的文件选取器

在 JavaScript 中


var picker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
picker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]);
picker.suggestedStartLocation =  
   Windows.Storage.Pickers.PickerLocationId.picturesLibrary;

在 C# 中


using Windows.Storage;
using Windows.Storage.Pickers;

FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".png");
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");

例如,您可以按照以下原则来选择适当的功能:如果您的应用允许用户选择图片,则应使用文件选取器,而不要使用“图片库”功能。如果您的应用需要以编程方式完整访问某个库,例如,用于播放音乐库中内容的音乐播放器,则可以使用“音乐库”功能来访问音乐库。如果您的应用需要访问文档,则应始终使用文件选取器。

技巧 4 – 不要信任远程数据

对于使用 JavaScript 编写的应用,必须验证并慎重处理不受信任的 Web 内容。应用中包含的 HTML 页面通常在应用的本地上下文中运行,本地上下文允许访问 Windows 运行时。Iframe 中显示的远程页面在应用的 Web 上下文中运行,Web 上下文无法访问 Windows 运行时。要了解您的应用中哪些组件在调用 Windows 运行时 - 毕竟,您也不希望未知的 Internet 网站控制您的应用,不是吗?(答案:是的,这令人感到很不安全。)除非您能够确认 API 输入源自您自己的软件包,否则您的应用应避免调用执行 eval()、setTimeout() 和 setInterval() 等脚本的 API。如果您需要使用这些 API,请务必对脚本功能进行评估,只需向这些 API 传递一些数据,即可准确了解脚本的构造方式。

如果要处理 JSON 数据,请使用 JSON.parse 来代替 eval(),前者比后者更安全,不会导致您的应用面临脚本注入风险。

在 JavaScript 中


var jsontext = '{"firstname":"Aaren","surname":"Ekelund"}';
var contact = JSON.parse(jsontext);
console.log(contact.surname + ", " + contact.firstname);

// Output: Ekelund, Aaren

最后,还应使用 innerText 或 toStaticHTML 对应用中的 Web 内容进行处理以删除可执行内容。此处理过程可以删除或禁用应用中用于显示 Web 内容的脚本。

在 JavaScript 中


div.innerHTML = window.toStaticHTML(data);
div.innerText = data; 

这些函数可以确保任何不受信任的脚本或危险内容都无法在您的应用内运行。第一个函数将剥离脚本,第二个函数将剥离的脚本转换为非执行文本。尽管大多数应用将会通过应用内的输入字段和传统 API(例如,XMLHttpRequest 对象)来访问远程 Web 内容,但不要忘记,Web 内容还可以通过其他途径(例如,“共享”超级按钮)进入您的应用。

技巧 5 – 请勿允许 Web 访问 WinRT

默认情况下,Windows 8 仅允许应用包中的内容访问 Windows 运行时 (WinRT)。如果您的应用接受来自 Web 的输入或数据,请勿允许该数据控制应用对任何 WinRT API 的使用。您的客户希望自己相信应用会按预期方式工作,并且他们希望您能够保持这份信任。如果您要访问网站,则应考虑在 iframe 沙盒中显示该网站,这样将能够阻止在您的应用中运行脚本、提交表单以及运行其他内容。

如果您的应用执行来自 Web 的内容,则该内容将能够访问您的应用的设置和数据,或者访问您的应用可以访问的文件。这对于使用 JavaScript 编写的应用尤为关键,因为此类应用更容易运行来自 Web 的脚本。例如,如果您使用 JavaScript 编写了一个应用,在应用中使用 postMessage 向 WinRT API 或打包的代码传递数据,请务必对数据来源进行验证,确保数据来自可信来源。

在 JavaScript 中


window.attachEvent('onmessage',function(e) {
    if (e.origin == 'https://www.contoso.com/') {
        …
    }
});

有关向使用 JavaScript 编写的应用中添加 Web 内容的更多信息,请查看从 Web 服务集成内容和控件应用示例。

技巧 6 – 获得认证:对应用和客户进行身份验证


基于云的应用功能极为强大,应用中的某些组件需要访问云中的服务,但在与云服务进行身份验证时需要慎重以避免滥用。接受用户输入的云服务应始终标识并验证用户和应用的身份。通过与受信任的云服务验证应用和用户的身份,您可以了解到有人正在利用预料中的正确应用合法地使用您的服务。掌握用户身份的一项附加好处是,一旦发现滥用,您可以轻松地识别并删除该用户发布的所有内容。

您可以使用 GetAppReceiptAsync 对应用进行身份验证,以确认该应用是从应用商店获取的,且具有有效的应用商店收据。如果拥有后端服务器,您还可以连接到以下 URL,使用该收据执行进一步的身份验证,以确认收据签名的公共证书,其中<CertificateId> 是收据中包含的CertificateId

https://go.microsoft.com/fwlink/p/?LinkId=246509&cid=<CertificateId>

WinRT 提供了各种简便易行的方法供客户端应用与云服务验证用户身份,包括 Web 身份验证代理(用于 OAuth 样式的身份验证)、凭据保险箱(用于存储密码和小型加密值)和共享证书存储区(用于客户端证书身份验证)。在处理身份验证及其凭据时,上述所有选项都是赢得客户信任的有效方法。

提示 7 – 验证文件、协议和导入的数据


许多应用会创建并加载文件,允许通过协议进行激活,或者提供数据导入功能。与上文介绍的远程 Web 内容类似,此数据可能会遭到篡改,或者来自可信度不高的来源,不值得信任。对于需要打开文件、导入数据或接受共享内容的应用,在使用内容之前,必须仔细地对内容进行验证。

验证过程取决于输入类型以及应用对内容的使用方式,可能非常简单,也可能极为复杂。例如,必须对数据库查询所使用的输入进行验证以避免 SQL 注入攻击,数据库通常将执行所接收到的所有有效查询,如果输入中包含恶意内容,则可能会导致数据泄露、数据被篡改甚至被删除。

文件、协议、导入的数据和共享内容可能包含超出应用预期的不受信任的内容。文件和协议是不受信任的输入的最常见形式,不过,还应注意剪贴板和从“共享”超级按钮接受内容,因为客户可能会从 Web 浏览器请求各种各样的不受信任内容。包含特别敏感数据的应用(例如,个人财务应用)应非常小心不受信任的内容,因为这些内容有权访问对客户具有高度价值的信息。

技巧 8 – 使用 HTTPS 连接


当自己不确定信息传输的安全性时,那就采用加密连接吧!HTTPS 连接提供了与远程服务器的身份验证,强烈推荐您采用 HTTPS 连接以缓解拦截攻击。尽管在家庭网络中,可能并不存在拦截攻击问题,但在现实世界中仍然存在大量未加密的无线网络,在这些网络中使用标准 HTTP 连接很不安全。

对于标准 HTTPS 连接,远程网站需要具备由 CA 提供的证书,并配置为允许 HTTP 连接。从 Windows 8 开始,应用可以使用自签名证书利用 SSL 连接安全地与后端服务器进行身份验证。这意味着即使没有 CA 提供的证书,您也可以使用 HTTPS 连接。如果您此前出于成本考虑而避免使用 HTTPS,那么现在有了自签名证书,再基于此理由而选择在应用中采用不安全的 HTTP 连接传输数据就站不住脚了。

要使用自签名证书,您可以在 Visual Studio 2012 中通过清单设计器向应用中添加证书声明,也可以直接向应用部件清单 XML 中添加证书声明。您还需要配置后端服务器以使用相同的证书;对于 IIS,您可以按照一个简单流程来创建并配置您的网站。随后,您的应用将自动使用打包的证书对与 Web 服务器的连接进行身份验证。

最后,如果您的应用是采用 JavaScript 编写的,您也可以在应用中使用以下 <meta> 标记来请求 HTTPS 连接:

<meta name="ms-https-connections-only" content="true"/>

培养信任

我们希望 Windows 8 能够激发您的开发激情,在短期内构建出大量杰出应用并发布到 Window 应用商店中。上文讨论的技巧和最佳做法对于向客户提供更加安全可靠的应用至关重要,可以增强客户对应用行为的信赖。安全性是客户对所有应用的一项重要期望指标,对于赢得良好评价和保护敏感财务数据至关重要。

我们在应用平台上投入巨大的人力和物力,旨在简化 Windows 8 和 Windows 应用商店应用的设计,让客户对试用和购买应用充满信心。我们相信应用平台必将能够帮助您构建出深受客户喜爱的可信应用。

如果您希望了解有关应用安全性的更多信息,请阅读开发安全应用白皮书、安全开发生命周期初学者工具包以及访问安全开发中心了解最新信息。

谢谢!

-- Windows 高级项目经理 Scott Graham

-- Windows 高级项目经理 Crispin Cowan

-- 可信任计算首席软件安全工程师 David Ross

延伸阅读:

Tag标签: Win8应用商店  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规