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];
}
}

loginApp.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 では、おそらく session/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;

次に、パスワードを平文で Web サイトに渡します。そして、これを HTTPS 以外のプロトコルと GET メソッドで行います。

  1. ウェブに送信する前にパスワードを暗号化する
  2. POST メソッドを使用してログインを行う
  3. 可能であれば、HTTPS プロトコルを使用してサイトを作成してください。

次に、このコードでは:

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

メイン スレッドから同期モードで Web を呼び出します。そのため、Web サービスが応答しないと UI がブロックされます。それは良い習慣ではありません。その場合は、非同期モードで実行することをお勧めします。

非同期モードの NSURLConnection に慣れていない場合は、現時点で最高の REST ライブラリであるAFNetworkingをお勧めします。

于 2013-03-19T15:17:20.973 に答える
2

ユーザー名とパスワードを保存するには、NSUserDefaultがプレーンテキストとしてデータを保存するのに対し、Keychainは暗号化された形式でデータを保存するため、セキュリティの観点からNSUserDefaultよりも安全であるため、Keychainを使用することを個人的にお勧めします. あなたはそれをチェックアウトすることができます: https://github.com/carlbrown/PDKeychainBindingsController

于 2013-03-19T16:22:06.180 に答える
1

アプリケーションの起動間でユーザー ステータスを保存する場合は、おそらく に値を設定する必要がありますNSUserDefaults

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

このフラグを確認できるよりも

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

または、ユーザー名とパスワードを保存できます。

また、基本的なサインアップ/ログイン機能については、 parse.comを参照してください。

于 2013-03-19T15:18:11.727 に答える
1

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 に答える