如何保证用户界面符合iOS最通用的安全指导规范。
遵从以下规范:
- 确保所有用户输入的密码和安全相关内容都通过将secureTextEntry属性设置为true的UITextField实例对象来完成。
- 当用户处于显示诸如用户信用卡号或者个人信息的界面时,在主程序委托的applicationWillResignActive:方法中设置应用主窗口的hidden属性为true,
- 在applicationDidBecomeActive:代理方法中将该属性置为false(为了让主窗口显示出来), 这样能保证在后台运行的iOS截屏操作不会保存应用窗口中显示的内容。这也是苹果推荐的做法。
- 确认用户在文本框或视图中输入的文本在发送到服务器前经过验证。
- 确保存储在磁盘文件或者钥匙串中的用户数据是安全的。
- 在用户输入密码或者数值码来验证身份的场景中,一旦该视图控制器不显示在屏幕上时,需要清空密码输入框,因为用户已经不再需要输入。如果还没放弃这些视图控制器的所有权,它们的信息将会留在内存当中,而这些视图控制器还包含着敏感文本信息。一旦这些敏感数据使用完毕,最好清理存储信息的这块内存。
需要进一步说明上述列表中的第二条。当用户在iOS设备的屏幕上查看应用时,按下Home键可以将应用置为不激活状态并转到后台。之后iOS会保存应用界面在屏幕上的截屏,截屏文件保存在应用沙盒的Library/Caches/Snapshots/文件夹里。当用户将应用重新置为前台状态时,iOS会暂时显示截屏内容,直到应用重新激活并控制屏幕,这样让后台到前台的切换看起来很流畅。虽说这项功能对用户体验来说是加分项,但也要考虑其安全性。当应用屏幕被截屏时,屏幕上的敏感信息也会保存在文件中并存储在磁盘上。iOS里并不能禁用这项功能,但是可以抵销它对安全方面带来的负面作用。苹果推荐的解决办法是,在应用的主窗口上覆盖别的视图,或者通过设置hidden为true在程序不激活的状态下隐藏主窗口,当程序被激活时,将属性值改回false使窗口变得可见。
为了符合这项安全要求,iOS开发者常犯的一个错误是将应用keyWindow的hidden属性置为true或者false。 虽然keyWindow在程序非激活状态时是一个有效的窗口,但在程序激活状态下,它的值是nil。为避免这个错误,需要在应用的委托中使用window属性来隐藏或显示窗口。
其他引发安全问题的因素还有个人信息残留在视图控制器中。假定有一个负责登录的视图控制器可供用户输入用户名和密码。当登录按钮被按下时,用户凭证会以HTTPS网络连接发送到服务器。用户通过验证后,会被推送到另一个视图控制器。这种方式的问题在于输入的用户名和密码仍然在内存当中,因为输入的视图控制器还在内存中。(想起来没,它还在导航控制器的视图控制器栈中。)
解决这个问题并增强界面安全的方法是在推送后续视图控制器到屏幕上时,把输入文本域的text属性置为nil;也可以覆盖登录控制器的viewWillDisappear:实例方法,在那里将文本域的text属性置为nil。但是,你要注意这个方法可能会在任意视图控制器消失的时候被调用,例如用户切换到其他标签栏然后再切回来的情况。也就是说视图控制会消失然后再出现,那么如果文本域在消失时被清空,用户第二次切回来时就需要重新输入内容。这种情况下没有唯一正确的处理方式,需要根据业务需求来选择。