ユーザーがEvernoteのSDKforPHPを使用してEvernoteアカウントにログインできるようにする簡単なPHPアプリケーション(MyApp)を作成しました。ただし、私のアプリケーションでは、これを実行したいと思います。
- ユーザーがEvernoteログインを承認する
- MyAppは、#1のrequestToken、requestTokenSecretなどを受け取ります。
- MyAppは#2をCookieに保存します
$_SESSION
- ユーザーが後で私のサイトに戻ったとき、MyAppはCookieを介してユーザーにログインします
はい、そのようなCookieベースのログインは安全ではないことを私は知っています。ただし、私のアプリケーションは機密データを保存しません。続行する最も簡単な方法は何ですか?これが私の試みです:
//if cookie
if (isset($_COOKIE['requestToken'])) {
$m = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
$q = "SELECT uid FROM users WHERE token={$_COOKIE['requestToken']} and secret={$_COOKIE['requestTokenSecret']}";
// cookie matches db?
if ($result = $m->query($q)) {
$_SESSION['login']=TRUE;
$result->close();
}
else // no match
$_SESSION['login']=FALSE;
}
else { //no cookie - create
if (EverNoteLogin()) {
$year=time()+86400*365; //86400 = 1 day
setcookie('requestToken',$_SESSION['requestToken'],$year);
setcookie('requestTokenSecret',$_SESSION['requestTokenSecret'],$year);
}
}
推奨される改善バージョン
//if cookie
if (isset($_COOKIE['requestToken'])) {
//check db
$m = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASS, MYSQL_DB);
$s=$m->prepare("SELECT uid FROM user WHERE token=? AND secret=?");
$s->bind_param('ss',$rt, $rs);
$rt=$_COOKIE['requestToken'];
$rs=$_COOKIE['requestTokenSecret'];
$s->execute();
$s->store_result();
$n=$s->num_rows;
//match db?
if ($n) {
if ($n==1) { // 1 match
$s->bind_result($uid);
$_SESSION['uid']=$uid;
$_SESSION['login']=TRUE;
}
else
$_SESSION['login']=FALSE; // >1 match not good
}else
$_SESSION['login']=FALSE;
}
else { //no cookie - create
if (EverNoteLogin()) {
$year=time()+86400*365; //86400 = 1 day
setcookie('requestToken',$_SESSION['requestToken'],$year);
setcookie('requestTokenSecret',$_SESSION['requestTokenSecret'],$year);
}
}