windowsphone开发教程 phone应用开发可以使用access作为数据库吗

Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹、本地文件夹(独立存储空间)、媒体库和SD卡四个地方。本节主要讲解它们的用法以及相关限制性。另外包括本地数据库的使用方式。
快速导航:
一、分析各类数据文件存储方式
1)安装文件夹
安装文件夹即应用安装以后的磁盘根文件夹,它提供只读的访问权限。它在手机中对应的路径为& C:\Data\Programs\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Install\&。
&&& 一般在这个位置可以拿到如下信息:
&&& 资源文件AppResources.resx& 资源文件一般用于定义字符串,国际化资源等,也可以编译存放图片
&&& 被编译的资源文件&
&&& 安装目录的其他文件&
特点:只读,可以访问与应用程序相关的资源与文件。
2)本地文件夹(WP7:独立存储空间)
&&Windows phone 8 为每个应用分配了一个本地文件夹,一般情况下只能访问自己的本地文件夹,对自己的本地文件夹具备完全的读写权限。它在手机中的路径一般为:&C:\Data\Users\DefApps\AppData\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Local&
&&& 本地文件夹主要功能:
&&& 自由读写存储文件&
&&& 存放本地数据库&
&&& 存取键值对&
特点:读写操作不限制,主要用于处理应用相关的文件。
&&&媒体库是唯一一个共享访问区域,可以访问图片、视频、音乐等。图片库的地址为:&C:\Data\Users\Public\Pictures\&
&&& 媒体库主要功能:
&&& 提供共享式的媒体文件访问,部分读写权限&
&&& 特点:可读取,写权限部分限制,共享性强。
SD卡与后面的章节关联,你可以访问 提前了解,如果连接未生效请耐心等待发布^_^。
二、安装文件夹
1)读取资源文件资源文件AppResources.resx的内容
新建WP8项目,添加新建项,资源文件,&Resource1.resx&。添加字符串资源,名称为&String1&值为&Test&。
切换到图片资源,添加图片&ResourceImg.png&
然后,我们访问这些资源,代码如下:
&!--ContentPanel - 在此处放置其他内容--&
&Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"&
&StackPanel x:Name="stackPanel" Grid.Row="1"&
&/StackPanel&
//获取字符资源
string myString1 = Resource1.String1;
//获取图片资源
var myResourceImg = Resource1.ResourceI
Image image = new Image();
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(new MemoryStream(myResourceImg));
image.Source = bitmapI
stackPanel.Children.Add(image);
2)读取被编译的资源文件
首先,我们设置图片为资源模式,一般的项目中的图片文件的生成操作设置为&内容&,这里设置为&Resource&。添加一张图片到Image/2.png,右键属性,设置生成操作为&Resource&。这个时候我们不能通过直接路径的方式访问图片,我们分别看看在XAML中和代码中如何获取图片。
&Image Source="/PhoneApp1;component/Image/2.png"&&/Image&
Uri uri = new Uri("/PhoneApp1;component/Image/2.png", UriKind.Relative);
//查看安装文件夹中的资源文件
StreamResourceInfo streamResourceInfo = Application.GetResourceStream(uri);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(streamResourceInfo.Stream);
Image image = new Image();
image.Source = bitmapI
3)访问安装文件夹
我们通过代码获取安装目录下的所有文件和文件夹。
//获取安装文件夹
StorageFolder installedLocation = Package.Current.InstalledL
//获取安装文件夹下的子文件夹集合
var folders = await installedLocation.GetFoldersAsync();
var folderNames = folders.Select(x =& x.Name).ToArray();
//获取安装文件夹下的文件集合
var files = await installedLocation.GetFilesAsync();
var fileNames = files.Select(x =& x.Path).ToArray();
另外,我们还可以通过路径的方式访问安装文件夹,如下操作将访问图片文件,并展示到图片控件。
Image image = new Image();
StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///1.jpg"));
var c = await storageFile.OpenReadAsync();
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(c.AsStream());
image.Source = bitmapI
this.stackPanel.Children.Add(image);
三、本地文件夹(独立存储空间)
1)在本地文件夹中操作文件
//WP7中存取独立存储空间(本地文件夹)的方法
using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication())
//获取本地文件夹下所有的文件名集合
var fileNames = storageFile.GetFileNames();
//操作文件
var storageFileStrem = storageFile.OpenFile("test.txt", FileMode.OpenOrCreate);
//WP8中存取本地文件夹(独立存储空间)的方法
//获取本地文件夹
var localFolder = Windows.Storage.ApplicationData.Current.LocalF
//操作文件
var file = await localFolder.GetFileAsync("test.txt");
var fileRandomAccessStream = await file.OpenAsync(FileAccessMode.Read);
var fileStream = fileRandomAccessStream.AsStream();
var path = localFolder.P
2)存取键值对
ApplicationSettings用于存储当应用程序退出后需要保存的轻量级数据。下面是使用方法:
//存储键值对
IsolatedStorageSettings.ApplicationSettings.Add("Key1", "value1");
IsolatedStorageSettings.ApplicationSettings.Save();
//获取之前存储的键值对
MessageBox.Show(IsolatedStorageSettings.ApplicationSettings["Key1"].ToString());
3)安装文件夹、本地文件夹的路径访问方式
对于使用路径访问的文件操作,URL前缀根据位置、API不同都有所不同。相关的URL前缀整理如下:
Windows 命名空间
安装文件夹
ms-appx:///
本地文件夹
ms-appdata:///
isostore:/
四、媒体库操作
列举下媒体库的基本操作,以及照片读写操作API:
MediaLibrary mediaLibrary = new MediaLibrary();
string path = string.E
if (mediaLibrary.Pictures.Count & 0)
//取得媒体图片库的绝对路径
path = Microsoft.Xna.Framework.Media.PhoneExtensions.MediaLibraryExtensions.GetPath(mediaLibrary.Pictures[0]);
//获取媒体库全部照片
var Pictures = mediaLibrary.P
//把图片库第一张图片的缩略图存到已保存的图片文件夹
mediaLibrary.SavePicture("myImg.jpg", Pictures[0].GetThumbnail());
//获取照片库跟目录下包含照片的文件夹集合
var ImgFolerNames = mediaLibrary.RootPictureAlbum.Albums.Select(x =& x.Name).ToArray();
五、本地数据库
在Windows phone 8 提供了类似sqlserver的方式管理数据,这就是本地数据库,本地数据库是文件形式存储的,一般可以存放在两个位置,安装文件夹和本地文件夹。由于安装文件夹只读,所以如果不需要操纵数据,则可以放在这个位置,如果需要对数据进行存取,我们可以放到本地文件夹。本文示例将创建一个数据库,包含一张学生表,并且支持对学生表进行增删改查操作。
首先,我们需要创建一个DataContext:
public class MyDataContext : DataContext
//定义连接字符串
public static string DBConnectionString = "Data Source=isostore:/MyDb.sdf";
public MyDataContext()
: base(DBConnectionString)
/// &summary&
/// 学生表
/// &/summary&
public Table&Student& S
创建学生数据表:
public class Student : INotifyPropertyChanged, INotifyPropertyChanging
// 定义ID,主键字段,必备
private int _
/// &summary&
/// &/summary&
[Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
public int Id
if (_id != value)
NotifyPropertyChanging("Id");
NotifyPropertyChanged("Id");
private string _
/// &summary&
/// 学生姓名
/// &/summary&
public string Name
if (_name != value)
NotifyPropertyChanging("Name");
NotifyPropertyChanged("Name");
private int _
/// &summary&
/// &/summary&
public int Age
if (_age != value)
NotifyPropertyChanging("Age");
NotifyPropertyChanged("Age");
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyC
// Used to notify the page that a data context property changed
private void NotifyPropertyChanged(string propertyName)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
#endregion
#region INotifyPropertyChanging Members
public event PropertyChangingEventHandler PropertyC
// Used to notify the data context that a data context property is about to change
private void NotifyPropertyChanging(string propertyName)
if (PropertyChanging != null)
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
#endregion
这里是对学生表进行操作的逻辑:
&ListBox x:Name="listbox1"&
&ListBox.ItemTemplate&
&DataTemplate&
&TextBlock Text="{Binding Name}"/&
&/DataTemplate&
&/ListBox.ItemTemplate&
&/ListBox&
private void Add()
MyDataContext db = new MyDataContext();
//创建数据库
if (!db.DatabaseExists())
db.CreateDatabase();
//添加学生
Student student1 = new Student
Name = "张三",
db.Students.InsertOnSubmit(student1);
List&Student& students = new List&Student&();
students.Add(new Student { Id = 2, Name = "李四", Age = 16 });
students.Add(new Student { Id = 3, Name = "王五", Age = 17 });
db.Students.InsertAllOnSubmit(students);
db.SubmitChanges();
private void Show()
MyDataContext db = new MyDataContext();
//显示年龄大于15岁的学生
listbox1.ItemsSource = db.Students.Where(x =& x.Age & 15);
private void Delete()
MyDataContext db = new MyDataContext();
//删除姓名为李四的学生
var query = db.Students.Where(x =& x.Name == "李四");
db.Students.DeleteAllOnSubmit(query);
db.SubmitChanges();
private void Update()
MyDataContext db = new MyDataContext();
//将所有的学生年龄加一岁
foreach (var student in db.Students)
student.Age++;
db.SubmitChanges();
作者:李盼(Lipan)出处: ()版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
阅读(...) 评论()编程开发子分类如何在 Windows Phone 应用中实现试用体验
MSDN Library
您所需的主题如下所示。但此主题未包含在此库中。
如何在 Windows Phone 应用中实现试用体验
适用于: Windows Phone 8 | Windows Phone OS 7.1
本主题介绍如何在 Windows Phone 应用中实现试用体验。本主题中的信息主要适用于旨在 Windows Phone OS 7.1 或 Windows Phone OS 7.0 上运行的应用。如果您的应用仅在 Windows Phone
8 上运行,请考虑改用 Windows 运行时版本的
类(同样受 Windows 应用商店应用支持)来实现应用中的试用体验。您可以在 Windows Phone 和针对 Windows 应用商店的主题中了解该方法。试用体验的目的是在用户提交购买游戏之前,为用户提供一次试用应用的机会。在试用体验中,您通常通过禁用功能、禁用游戏中的级别或者为应用的使用设置时间限制等方法提供应用的受限版本。选择什么样的应用限制,完全取决于您自己。本主题演示了如何创建在试用模式中具有功能限制(已禁用某些功能)的简单应用。使用
类可以完成应用运行模式的确定。有关如何实现试用体验的详细信息,以及进一步演示下述应用的完整示例,请参见。
本主题包含以下各节。
在本节中,您需要创建用户界面以演示具备试用体验的应用。此应用为 Windows Phone 应用。应用启动时,将检查应用的当前许可证。如果应用只有试用许可证,将禁用某种功能。如果应用有完整许可证,将启用所有功能。应用的真实许可证信息只有在发布到 商店 之后才能使用。因此,若要测试试用体验,必须模拟许可证检测。当应用在调试模式下运行时,可以通过以编程方式在应用中设置一个 IsTrial 属性来完成此操作。应用发布后,应用中的 IsTrial 属性将通过检查 LicenseInformation.IsTrial 属性来进行设置。在 Visual Studio 中,通过选择“文件 | 新建项目”菜单命令创建一个新项目。将显示“新建项目”窗口。展开“Visual C#”模板,然后选择“Windows Phone”模板。选择 Windows Phone 应用
模板。在“名称”中填入您选择的名称。单击“确定”。将创建一个新的项目,并且“MainPage.xaml”将在 Visual Studio 设计器窗口中打开。在“MainPage.xaml”中,删除名为“LayoutRoot”的 Grid 的 XAML 代码,然后使用以下代码进行替换:
&Grid x:Name="LayoutRoot" Background="Transparent"&
&Grid.RowDefinitions&
&RowDefinition Height="Auto"/&
&RowDefinition Height="*"/&
&/Grid.RowDefinitions&
&!--TitlePanel contains the name of the application and page title.--&
&StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"&
&TextBlock x:Name="ApplicationTitle" Text="Trial Application Experience" Style="{StaticResource PhoneTextNormalStyle}" Margin="5"/&
&TextBlock x:Name="PageTitle" Text="main page" Style="{StaticResource PhoneTextTitle1Style}" Margin="5"/&
&/StackPanel&
&!--ContentPanel - place additional content here--&
&Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"&
&Grid.RowDefinitions&
&RowDefinition Height="200"/&
&RowDefinition Height="Auto"/&
&RowDefinition Height="Auto"/&
&RowDefinition Height="Auto"/&
&/Grid.RowDefinitions&
&StackPanel Grid.Row="0" Orientation="Horizontal"
HorizontalAlignment="Center" VerticalAlignment="Center"&
&TextBlock Text="License:" FontSize="{StaticResource PhoneFontSizeExtraLarge}" /&
&TextBlock x:Name="tbTrialStatus" FontSize="{StaticResource PhoneFontSizeExtraLarge}" /&
&/StackPanel&
&TextBlock Grid.Row="1" Text="My Application Features" HorizontalAlignment="Center"/&
&StackPanel Grid.Row="2"
Orientation="Horizontal" HorizontalAlignment="Center"&
&Button Content=" A" Height="78" Width="100" x:Name="btnFeatureA" Click="btnFeatureA_Click"/&
&Button Content=" B" Height="78" Width="100" x:Name="btnFeatureB" Click="btnFeatureB_Click"/&
&Button Content=" C" Height="78" Width="100" x:Name="btnFeatureC" Click="btnFeatureC_Click"/&
&/StackPanel&
&Button Grid.Row="3" x:Name="btnBuyApplication" Content="Buy the Application" Click="btnBuyApplication_Click" Height="78"/&
前面的 XAML 代码会创建一个类似于以下屏幕快照的简单用户界面。应用包含三个按钮,每个按钮代表了应用的一项功能。用户界面还包含显示当前许可证信息的状态文本和一个购买应用的按钮。前面提到的代码和屏幕快照是阐释生成试用体验核心概念的基本示例。以下各节中将定义每个按钮的事件处理程序。本节中,您需要使用
对象来确定应用的当前许可证。应用的真实许可证信息只有在发布到 商店 之后才能使用。因此,若要测试试用体验,必须模拟许可证检测。当应用在调试模式下运行时,可以通过以编程方式在应用中设置一个 IsTrial 属性来完成此操作。应用发布后,应用中的 IsTrial 属性将通过检查 LicenseInformation.IsTrial 属性来进行设置。若要检查 Direct3D 应用中的试用许可证,请检查由
属性返回的
属性。打开“App.xaml.cs”并将以下 using 指令添加到页面顶部。
using Microsoft.Phone.M
在 App 类中,声明以下静态局部变量。LicenseInformation 类使应用能够确定它是否在试用许可证下运行。
private static LicenseInformation _licenseInfo = new LicenseInformation();
在“App.xaml.cs”的相同 App 类中,添加以下只读属性和局部变量。此属性用于在应用运行时缓存许可证信息。无论何时需要检查当前许可证,应用都会使用该属性。
private static bool _isTrial = true;
public bool IsTrial
return _isT
在以下各节中,将在 Application_Launching 和 Application_Activated 事件处理程序中检查许可证信息。由于有两个地方用到此逻辑,我们将把它包装到其自己的方法中,以便于使用。在“App.xaml.cs”的 App 类中,添加以下方法。
/// &summary&
/// Check the current license information for this application
/// &/summary&
private void CheckLicense()
// When debugging, we want to simulate a trial mode experience. The following conditional allows us to set the _isTrial
// property to simulate trial mode being on or off.
string message = "This sample demonstrates the implementation of a trial mode in an application." +
"Press 'OK' to simulate trial mode. Press 'Cancel' to run the application in normal mode.";
if (MessageBox.Show(message, "Debug Trial",
MessageBoxButton.OKCancel) == MessageBoxResult.OK)
_isTrial = true;
_isTrial = false;
_isTrial = _licenseInfo.IsTrial();
前面的方法由两个代码路径组成,取决于应用是否以调试模式运行。在调试模式中,将执行位于条件编译指令 #if Debug 与 #else 指令之间的代码。系统将询问用户是否模拟试用模式。如果用户选择“确定”,_isTrial 变量将设置为 true;否则,它将设置为 false。如果应用在释放模式下生成,将执行
#else 与 #endif 之间的代码,同时 _isTrial 变量将通过检查 LicenseInformation 对象上的 IsTrial 属性来设置。应用开始或恢复时都需要检查应用的许可证。此过程通过检查 Application_Launching 和 Application_Activated 事件处理程序中的许可证信息来完成。使用以下代码替换“App.xaml.cs”中的 Application_Launching 事件处理程序。
private void Application_Launching(object sender, LaunchingEventArgs e)
CheckLicense();
使用以下代码替换“App.xaml.cs”中的 Application_Activated 事件处理程序。
private void Application_Activated(object sender, ActivatedEventArgs e)
CheckLicense();
在本节中,使用应用当前许可证的相关信息来限制试用模式下的应用。您可以选择限制应用的方式。在此示例中,通过禁用代表应用一项功能的用户界面上的按钮来限制试用模式的应用。用户界面上还有一个可见的按钮,用户可以使用该按钮通过 商店 调用
方法来购买应用。由于此应用还未发布到 商店,调用
将导致错误。这是预期的行为。在“MainPage.xaml.cs”代码隐藏文件中,添加以下方法。
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
base.OnNavigatedTo(e);
if ((Application.Current as App).IsTrial)
btnBuyApplication.Visibility = System.Windows.Visibility.V
btnFeatureC.IsEnabled = false;
tbTrialStatus.Text = "Trial";
btnBuyApplication.Visibility = System.Windows.Visibility.C
btnFeatureC.IsEnabled = true;
tbTrialStatus.Text = "Full";
private void btnFeatureA_Click(object sender, RoutedEventArgs e)
MessageBox.Show("Feature A");
private void btnFeatureB_Click(object sender, RoutedEventArgs e)
MessageBox.Show("Feature B");
private void btnFeatureC_Click(object sender, RoutedEventArgs e)
MessageBox.Show("Feature C");
在前面的代码中,无论何时用户导航到此页面时,都将重写 OnNavigatedTo 方法以确定当前许可证信息。检查在上一节中定义的“App”类的 IsTrial 属性,确定应用是在试用模式下还是在完整许可证下运行。如果此属性返回 true,那么应用在试用模式下运行。禁用“btnFeatureC”按钮,以模拟在试用模式下时禁用功能。“btnBuyApplication”按钮也将可见,用户可以使用该按钮启动应用购买。最后,将许可证状态设置为“tbTrialStatus” TextBlock。在 IsTrial 属性为 false 的情况下,将启用所有功能。因为用户有完整的应用许可证,将隐藏“btnBuyApplication”按钮。最后,将许可证状态设置为“tbTrialStatus” TextBlock。三个单击事件用于当用户单击用户界面中的功能按钮时显示消息。在本节中,您需要使用
将用户带至 商店 中的应用,这样用户就能购买应用。打开“MainPage.xaml.cs”,将以下 using 指令添加到页面的顶部。
using Microsoft.Phone.T
在“MainPage.xaml.cs”代码隐藏文件 MainPage 类的顶部,添加以下变量。
// Declare the MarketplaceDetailTask object with page scope
// so we can access it from event handlers.
MarketplaceDetailTask _marketPlaceDetailTask = new MarketplaceDetailTask();
在“MainPage.xaml.cs”代码隐藏文件中,添加以下方法。
private void btnBuyApplication_Click(object sender, RoutedEventArgs e)
_marketPlaceDetailTask.Show();
在用户界面中单击“btnBuyApplication”按钮时,前面的代码将显示 商店 客户端应用,并显示指定产品的详细信息页面。用户将可以购买应用。在此示例中,应用没有发布到 商店。结果,_marketPlaceDetailTask.Show() 调用将导致显示错误消息。如果此错误的错误代码是 805a0941,则该调用在应用发布后就会成功并正常运行。应用发布之后, 将自动在 商店 客户端应用中检测应用的唯一 ID,并启动正确的详细信息页面。在设备或模拟器上,通过选择“调试 | 启动调试”菜单命令来运行应用。注意:选择试用模式模拟的选项仅在应用在调试模式下运行时可用。这样做可以阻止试用模式模拟在应用的发布版本中运行,并意外地在测试功能启用的情况下发布到 商店。应用启动时会显示一个消息框。单击“确定”模拟试用模式。观察应用的主页面,“许可证”字段设置为“试用”,并且禁用“功能 C”按钮。单击“购买应用程序”按钮。系统将尝试打开 商店 客户端应用。您将看到一个类似下图的错误对话框。这显示应用成功打开了 商店 客户端应用。在已发布的应用上不会出现此错误,将转入 商店 上应用的详细信息页面,在该页面,您可以购买应用。单击错误对话框上的“关闭”。应用将恢复。若要运行应用以模拟完整许可证,请单击此过程步骤二中的“消息框”上出现的“取消”。或者,您可以通过选择“调试 | 开始执行(不调试)”菜单命令来启动应用。在此模式中,将隐藏“购买应用程序”按钮,并启用“功能 C”按钮。
此页面有帮助吗?
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。
开发人员中心iOS应用安全开发,你不知道的那些事
iOS应用安全开发,你不知道的那些事
[摘要:联网范畴,平安已然是一个陈词滥调的话题。很多至公司皆设置有特地的平安部分,用于检测本身产物的平安性。但即使是如许,业界依然经常爆出很多平安题目激发的消息。便正在没有暂]
联网领域,安全已然是一个老生常谈的话题。许多大公司都设置有专门的安全部门,用于检测自己产品的安全性。但即便是这样,业界仍然时常爆出许多安全问题引发的新闻。就在不久前,乌云曝光了携程网在支付过程中,为了调试方便,记录了用户的信用卡卡号和CVV码等信息,而调试接口可以被外网访问,这样造成黑客可能通过调试接口读取用户的信用卡信息。虽然最终没有造成实际上的用户损失,但此次事件再一次给互联网公司敲响了安全的警钟。
除了国内,国外的互联网安全问题同样让人担忧。2013年由于曝出Apache&Struts2的漏洞,苹果公司多次重置开发者的密码,并且最终为了用户数据的安全,将整个开发者后台全部停止服务,花了2周多时间将后台有潜在问题的功能重写后,才重新开放服务。而4月份刚刚曝光的OpenSSL的漏洞,则让全球三分之二的网站受到影响。在移动互联网快速发展的今天,iOS应用由于直接运行在用户的手机上,相比运行在服务器的后台服务,更有可能被黑客攻击。本文接下来将从三个方面概述iOS移动应用在安全方面所面临的挑战以及应对措施。
1. 安全地传输用户密码
大部分的iOS应用都需要连网,通过和服务器端进行通信,获得最新的信息并且将内容展现给用户。由于网络传输过程中有可能经过不安全的中间节点,所以我们应该对敏感数据加密,用于保证用户信息的安全。黑客可以在受害者的手机上设置网络通信的代理服务器,从而截获所有的网络请求。即使是HTTPS的加密通信,黑客也可以通过中间人攻击(Man-In-The-Middle&Attack,指的是攻击者与通信的两端分别创建独立的联系,并交换其所收到的数据,使通信的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上,整个会话都被攻击者完全控制)来截取通信内容。
黑客可以在Mac下使用Charles软件(如果在Windows下,可以使用Fiddler软件)来将自己的电脑设置成代理服务器,从而截取应用的网络请求,分析目标应用在通信协议上是否有安全问题。为了测试,我选取了在国内最大的两家租车公司(神州租车和一嗨租车)的iOS应用。
从图1可以看到,神州租车和一嗨租车在用户登录时,均采用明文的方式,将密码直接发送给服务器。其中一嗨租车不但采用明文方式发送密码,而且在发送时使用了Http&Get的方式,而GET的URL数据一般都会保存在服务器的Access&Log中,所以黑客一旦攻破服务器,只需要扫描Acesss&Log,则可以轻易获得所有用户的明文密码(在本文发表前,一嗨租车已修改了登录协议,采用了POST的方式来登录,但仍然传递的是明文密码)。
图1&神州租车和一嗨租车的登录协议
如果每一个移动应用都像以上两种应用那样,明文传输用户密码,那么我们可以想象这样一个场景:黑客在咖啡馆或机场等一些公共场所,将自己的电脑设置成与该场所一样名字的免费Wi-Fi,受害者只要不小心使用了该Wi-Fi,则可能泄漏自己的明文密码。对于大多数普通人来说,他们会使用一样的密码登录他的所有的账号,这就意味着他的其他账号:例如淘宝或网上银行账号也有被盗的风险。
正确的做法应该是这样:事先生成一对用于加密的公私钥,客户端在登录时,使用公钥将用户的密码加密后,将密文传输到服务器。服务器使用私钥将密码解密,然后加盐(Salt,在密码学中是指,通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这个过程称之为“加盐”),之后再多次求MD5,然后再和服务器原来存储的用同样方法处理过的密码匹配,如果一致,则登录成功。这样的做法,保证黑客即使截获了加密后的密文,由于没有私钥,也无法还原出原始的密码。而服务器即使被黑客攻陷,黑客除了暴力尝试,也无法从加盐和多次MD5后的密码中还原出原始的密码。这样就保证了用户密码的安全。
2. 防止通信协议被轻易破解
除了上面提到的明文传输密码的问题外,移动端应用还要面对黑客对于通信协议的破解的威胁。
在成功破解了通信协议后,黑客可以模拟客户端登录,进而伪造一些用户行为,可能对用户数据造成危害。例如腾讯出品的消除游戏《天天爱消除》,在淘宝上就有很多售价仅为1元的代练服务,如果真正是人工代练,是不可能卖这么便宜的,只有可能是该游戏的通信协议被破解,黑客制作出了代练的机器人程序。通信协议被破解除了对于移动端游戏有严重危害外,对于应用也有很大的危害。例如针对微信,黑客可以制作一些僵尸账号,通过向微信公共账号后台发送垃圾广告,达到赢利的目的。而iPhone设备上的iMessage通信协议居然也被破解了,所以很多iPhone用户会收到来自iMessage的垃圾广告。
对于以上提到的问题,开发者可以选择类似ProtoBuf(Google提供的一个开源数据交换格式,其最大的特点是基于二进制,因此比传统的JSON格式要短小得多)之类的二进制通信协议或自己实现通信协议,对于传输的内容进行一定程度的加密,以增加黑客破解协议的难度。图2是我截取的淘宝客户端的通信数据,可以看到其中的值都不能直观地猜出内容,所以这对于通信协议是有一定的保护作用。
图2&淘宝客户端通信协议
3. 验证应用内支付的凭证
iOS应用内支付(IAP)是众多应用赢利的方式,通过先让用户免费试用或试玩,然后提供应用内支付来为愿意付费的用户提供更强大的功能,这种模式特别适合不习惯一开始就掏钱的中国用户。但由于国内越狱用户的比例比较大,所以我们也需要注意应用内支付环节中的安全问题。简单来说,越狱后的手机由于没有沙盒作为保护,黑客可以对系统进行任意地修改,所以在支付过程中,苹果返回的已付款成功的凭证可能是伪造的。客户端拿到付款凭证之后,还需要将凭证上传到自己的服务器上,进行二次验证,以保证凭证的真实性。
另外,我们发现越狱用户的手机上,很可能被黑客用中间人攻击技术来劫持支付凭证。这对于黑客有什么好处呢?因为苹果为了保护用户的隐私,支付凭证中并不包含任何用户的账号信息,所以我们的应用和服务器无法知道这个凭证是谁买的,而只能知道这个凭证是真的还是假的。所以在验证凭证时,哪个账号发起了验证请求,我们就默认这个凭证是该账号拥有的。如果黑客将凭证截获,就可以伪装成真实用户来验证凭证或者转手出售获利。
打个比方,这就类似于很多商场的购物卡一样,由于是不记名的,黑客如果将你买的购物卡偷窃然后去刷卡购物,商场是无法简单地区分出来的。因此,对于应用内支付,开发者除了需要仔细地验证购买凭证外,也需要告知用户在越狱手机上进行支付的风险。
本地文件和数据安全
1. 程序文件的安全
iOS应用的大部分逻辑都是在编译后的二进制文件中,但由于近年来混合式(Hybrid)编程方式的兴起,很多应用的部分功能也采用内嵌Web浏览器的方式来实现。例如腾讯QQ&iOS客户端的内部,就有部分逻辑是用Web方式实现的。由于iOS安装文件其实就是一个zip包,所以我们可以通过解压,看到包内的内容。以下是我解开腾讯QQ客户端,看到的其qqapi.js文件的内容。
可以看到,这些文件都有着完整清晰的注释。通过分析这些JavaScript文件,黑客可以很轻松地知道其调用逻辑。在越狱手机上,还可以修改这些JavaScript代码,达到攻击的目的。
我也曾尝试查看支付宝客户端中的彩票功能,通过分析,也可以找到其完整的、带着清晰注释的JavaScript代码,如图3所示(支付宝现在已对相应代码进行了加密)。
通过将JavaScript源码进行混淆和加密,可以防止黑客轻易地阅读和篡改相关的逻辑,也可以防止自己的Web端与Native端的通信协议泄漏。
图3&支付宝应用的JavaScript文件
本地数据安全
iOS应用的数据在本地通常保存在本地文件或本地数据库中。如果对本地的数据不进行加密处理,很可能被黑客篡改。比如一款名为《LepsWorld&3》的游戏,打开它的本地文件,可以很容易地找到,它使用了一个名为ItempLifes的变量保存生命数值(如图4所示)。于是我们可以简单修改该值,达到修改游戏参数的目的。而在淘宝上,也可以找到许多以此挣钱的商家。对于本地的重要数据,我们应该加密存储或将其保存到keychain中,以保证其不被篡改。
图4&《LepsWorld&3》的本地数据
源代码安全
通过file、class-dump、theos、otool等工具,黑客可以分析编译之后的二进制程序文件,不过相对于这些工具来说,IDA的威胁最大。IDA是一个收费的反汇编工具,对于Objective-C代码,它常常可以反汇编到可以方便阅读的程度,这对于程序的安全性,也是一个很大的危害。因为通过阅读源码,黑客可以更加方便地分析出应用的通信协议和数据加密方式。
下面分别示例了一段代码的原始内容和通过IDA反汇编之后的结果。可以看到,IDA几乎还原了原本的逻辑,而且可读性也非常高。
原始代码:
反汇编后:
反汇编的代码被获得后,由于软件内部逻辑相比汇编代码来说可读性高了很多。黑客可以用来制作软件的注册机,也可以更加方便地破解网络通信协议,从而制作出机器人(“僵尸”)账号。最极端的情况下,黑客可以将反汇编的代码稍加修改,植入木马,然后重新打包发布在一些越狱渠道上,这将对用户产生巨大的危害。
对于IDA这类工具,我们的应对措施就比较少了。除了可以用一些宏来简单混淆类名外,也可以将关键的逻辑用纯C语言来实现。例如微信的iOS端的通信底层,就是用C语言实现的。这样的方式除了能保证通信协议的安全外,也可以在iOS和Android等多个平台使用同一套底层通信代码,达到复用的目的。
由于移动互联网的快速发展,人们的购物、理财等需求也在移动端出现,这使得移动应用的安全性越来越重要。由于部署在用户终端上,移动应用比服务器应用更容易被攻击,大家也需要在移动应用的网络通信、本地文件和数据、源代码三方面做好防范,只有这样才能保证应用的安全。&
作者唐巧:资深iOS开发者,曾开发有道云笔记和猿题库,维护了iOS开发的博客()和微信公共账号(iOSDevTips),微博:@唐巧_boy
感谢关注 Ithao123Windows Phone频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊}

我要回帖

更多关于 access数据库开发实例 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信