1

我想制作一个具有 loginViewController 的 iphone 应用程序。此代码正确且安全吗?

-(IBAction)loginPressed:(id)sender{


NSString *usr = [[NSString alloc]init];
NSString *psw = [[NSString alloc]init];

usr = username.text;
psw = password.text;

NSLog(@"%@",usr);
NSLog(@"%@", psw);

NSString *URL = [NSString stringWithFormat:@"http://www.mywebsite.com/loginApp.php?user_name=%@&password=%@", usr, psw];
NSLog(@"%@", URL);
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];

NSString *Result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


if ([Result isEqualToString:@"1"])
{
    NSLog(@"logged in");


}else if ([Result isEqualToString:@"2"]){

    UIAlertView *WrongCredential = [[UIAlertView alloc]initWithTitle:@"Loggin failed" message:@"sorry, check again your email and password" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles: nil];

    [WrongCredential show];
}
}

登录应用程序.php

<?php 
 require_once 'functions/init.php';

if (isset($_GET['user_name'], $_GET['password'])){
$email = sanitize($_GET['user_name']);
$password = sanitize($_GET['password']);
$login = loginApp($email, $password);

if($login === true){
    echo json_encode(1);

                       }
    else if($login === false){
    echo json_encode(2);
    }
   }
   ?>

如何检查用户是否已经登录?在php中我可能会设置一个会话/cookies(?),对吧?我如何使用 Objective C 来做到这一点?

4

4 回答 4

2
NSString *usr = [[NSString alloc]init];
NSString *psw = [[NSString alloc]init];

usr = username.text;
psw = password.text;

这段代码会造成内存泄漏。您不必分配字符串并在之后从标签中检索它,只需将其替换为:

NSString* usr = username.text;
NSString* psw = password.text;

然后,您将密码明文传递给您的网站。您可以在非 HTTPS 协议和 GET 方法上进行此操作。

  1. 在发送到网络之前加密密码
  2. 使用 POST 方法进行登录
  3. 如果可能,让您的网站使用 HTTPS 协议。

然后,在这段代码中:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];

您从主线程以同步模式调用网络。因此,当 Web 服务没有响应时,您的 UI 将被阻止。这不是一个好习惯。那么在异步模式下会更好。

如果你不熟悉 NSURLConnection 并且它是异步模式,我会推荐你​​ AFNetworking,目前最好的 REST 库。

于 2013-03-19T15:17:20.973 回答
2

为了保存用户名和密码,我个人建议使用 Keychain,因为它们在安全性方面比 NSUserDefault 更安全,因为 Keychain 以加密形式存储数据,而 NSUserDefault 以纯文本形式存储。你可以看看:https ://github.com/carlbrown/PDKeychainBindingsController

于 2013-03-19T16:22:06.180 回答
1

维护一个标志或变量(比如说 bool - isUserLoggedIn)。默认值为 NO 和

if ([Result isEqualToString:@"1"])
{
    NSLog(@"logged in");

    isUserLoggedIn = YES;


}else if ([Result isEqualToString:@"2"]){

    UIAlertView *WrongCredential = [[UIAlertView alloc]initWithTitle:@"Loggin failed" message:@"sorry, check again your email and password" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles: nil];

    [WrongCredential show];

    isUserLoggedIn = NO;
}

现在您可以随时使用此标志值检查 (isUserLoggedIn)

希望这是您正在寻找的

于 2013-03-19T15:14:42.340 回答
1

如果您想在应用程序启动之间保存用户状态,您可能需要在NSUserDefaults.

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"UserLogged"];

比你可以检查这个标志

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"UserLogged"]) {}

或者您可以保存用户名和密码。

您还可以查看parse.com以了解基本的登录/登录功能。

于 2013-03-19T15:18:11.727 回答