以下是“个人资料”页的 btnSave_Click 处理程序的示例代码:
双击代码全选
1
2
3
4
5
|
function btnSave_Click(args) {
var taintedNotes = document.getElementById( "txtNotes" ).value;
var sanitizedNotes = window.toStaticHTML(taintedNotes);
document.getElementById( "output" ).innerHTML = sanitizedNotes;
}
|
如果用户将该字符串输入
双击代码全选
1
2
|
<strong>testing!</strong><script>alert( "123! "
);</script>
|
txtNotes,window.toStaticHTML 方法将去掉脚本标记,只留下已批准的严格标记。使用 toStaticHTML 剔除不在批准的安全列表(使用允许列表的另一个示例)上的所有标记以及所有未知属性。只有已知的有用数据保留在 toStaticHTML 方法的输出中。您可以在 bit.ly/KNnjpF 上找到已批准的标记、特性、CSS 规则和属性的完整列表。
输入验证降低了恶意代码进入系统的风险。使用 HTML5 和 toStaticHTML,应用程序可以将输入限制为已知的有用数据并删除或禁用可能的恶意内容而无需服务器介入。
既然 Contoso Health 将获取有效数据,我们如何处理敏感数据(如医疗或财务信息)呢?
敏感数据存储
Web 开发人员说:切勿将敏感数据存储在客户端,因为没有可用的安全存储设备。
Windows 8 开发人员说: 可以通过 Windows 运行时加密敏感数据并安全地存储它。
在 上一节中,Contoso Health 应用程序检索了常规个人资料信息。随着开发的继续,业务赞助商请求获取医疗历史记录表单。此表单捕获用户一生发生的医疗记录,如最近去看病的情况。Web 开发的传统规则认为不应在客户端上存储诸如用户的医疗历史记录等敏感信息,因为可能泄漏数据。在 Windows 应用商店应用程序开发中,可以使用 Windows 运行时的安全功能在本地存储敏感数据。
为了保护用户的医疗历史记录,Contoso Health 使用了 WinRT 数据保护 API。加密不应是数据保护策略的全部(请考虑“深度防御”: 设置多层次安全体系而非单种防御方式,如仅使用加密)。请不要忘记涉及敏感数据的其他最佳做法,如仅在需要时才访问数据和不要将敏感数据放置在缓存中。有 一个列出敏感数据的很多注意事项的有用资源,它就是 MSDN 库文章“提高 Web 应用程序安全性: 威胁与对策”(bit.ly/NuUe6w)。尽管此文档侧重介绍 Web 开发最佳做法,它提供了很多可用于任何开发类型的基础知识。
Contoso Health 应用程序的“医疗历史记录”页包含名为 btnAddItem 的按钮。用户单击 btnAddItem 时,应用程序对输入“医疗历史记录”表单的数据进行加密。为了加密“医疗历史记录”信息,应用程序使用了内置的 WinRT 数据保护 API。这个简单的加密系统使开发人员可以快速加密数据而不会带来很大的管理开销。以 btnAddItem 单击事件的一个空事件处理程序开始。然后 Contoso Health 收集表单信息并将它存储在 JSON 对象中。在事件处理程序内,我添加了快速生成 JSON 对象的代码:
双击代码全选
1
2
3
4
|
var healthItem = {
"prop1" : window.toStaticHTML(document.getElementById( "txt1" ).value),
"prop2" : window.toStaticHTML(document.getElementById( "txt2" ).value)
};
|
healthItem 对象表示用户输入表单的“医疗历史记录”信息。加密 healthItem 从实例化 DataProtectionProvider 开始:
双击代码全选
1
2
3
|
var dataProtectionProvider =
Windows.Security.Cryptography.DataProtection.DataProtectionProvider(
"LOCAL=user" );
|
DataProtectionProvider 构造函数(用于加密)采用一个确定数据保护与什么关联的字符串参数。在本例中,我要将内容加密到本地用户。我没有将它设置为本地用户而是设置为计算机、一组 Web 凭据、一个 Active Directory 安全原则或几个其他选项。您可以在开发人员中心主题“保护描述符”(bit.ly/QONGdG) 中找到保护描述选项的列表。使用哪些保护描述符取决于您应用程序的要求。此时,数据保护提供程序已可以加密数据,但是数据需要做一点更改。因为加密算法使用缓冲区而非 JSON,因此下一步是将 healthItem 转换为缓冲区:
双击代码全选
1
2
3
4
|
var buffer =
Windows.Security.Cryptography.CryptographicBuffer.convertStringToBinary(
JSON.stringify(healthItem),
Windows.Security.Cryptography.BinaryStringEncoding.utf8);
|
CryptographicBuffer 包含很多对象和方法来处理加密和解密中使用的缓冲区。其中最重要的方法是 convertStringToBinary,它采用一个字符串(在本例中为 JSON 对象的字符串形式)并将其转换为编码的缓冲区。使用的编码通过 Windows.Security.Cryptography.BinaryStringEncoding 对象来设置。在本示例中,我使用了 UTF8 作为数据的编码。convertStringToBinary 方法基于字符串数据和指定的编码返回缓冲区。缓冲区可用于加密且数据保护提供程序实例化后,我准备调用 protectAsync 方法来加密缓冲区:
(责任编辑:12图资源库)