diff --git a/addauthcode.php b/addauthcode.php index 664aad2..7c78001 100644 --- a/addauthcode.php +++ b/addauthcode.php @@ -9,6 +9,11 @@ function createUniqId(){ return base_convert($hashCreateTime,10,36); } +function random($length = 32) +{ + return substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, $length); +} + require('db.php'); $servernamefile = "server/servername.txt"; @@ -45,11 +50,16 @@ try { // 接続エラーのときエラー内容を取得する $error_message[] = $e->getMessage(); } -// 管理者としてログインしているか確認 -if( empty($_SESSION['admin_login']) || $_SESSION['admin_login'] !== true ) { - // ログインページへリダイレクト - header("Location: ./login.php"); +if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true) { + + header("Location: home/index.php"); exit; + +} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) { + + header("Location: home/index.php"); + exit; + } require_once 'authcode/GoogleAuthenticator.php'; @@ -73,16 +83,19 @@ if( !empty($_POST['btn_submit']) ) { $checkResult = $chkauthcode->verifyCode($secret, $userauthcode, $discrepancy); if ($checkResult) { if( empty($error_message) ) { + $backupcode = random(); $secret = $_SESSION['secretcode']; + // トランザクション開始 $pdo->beginTransaction(); try { // SQL作成 - $stmt = $pdo->prepare("UPDATE account SET authcode = :authcode WHERE userid = :userid"); + $stmt = $pdo->prepare("UPDATE account SET authcode = :authcode,backupcode = :backupcode WHERE userid = :userid"); $stmt->bindValue(':authcode', $secret, PDO::PARAM_STR); + $stmt->bindValue(':backupcode', $backupcode, PDO::PARAM_STR); // ユーザーIDのバインド(WHERE句に必要) $stmt->bindValue(':userid', $userid, PDO::PARAM_STR); @@ -111,6 +124,7 @@ if( !empty($_POST['btn_submit']) ) { } } $userid = ""; + $_SESSION['backupcode'] = $backupcode; // リダイレクト先のURLへ転送する $url = 'success.php'; header('Location: ' . $url, true, 303); @@ -174,10 +188,10 @@ $pdo = null; $name = $userid; - $qrCodeUrl = $authcode->getQRCodeGoogleUrl($name, $secret, $title); + $qrCodeUrl = $authcode->getQRCodeUrl($name, $secret, $title); ?>
- +
diff --git a/authcodechk.php b/authcodechk.php index 424d95a..1628865 100644 --- a/authcodechk.php +++ b/authcodechk.php @@ -32,6 +32,7 @@ $userid = $_SESSION['userid']; // データベースに接続 + try { $option = array( @@ -45,6 +46,17 @@ try { // 接続エラーのときエラー内容を取得する $error_message[] = $e->getMessage(); } +if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true) { + + header("Location: home/index.php"); + exit; + +} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) { + + header("Location: home/index.php"); + exit; + +} if( !empty($_POST['btn_submit']) ) { $_SESSION['userid'] = $userid; @@ -95,7 +107,7 @@ $pdo = null; -
+
diff --git a/authlogin.php b/authlogin.php index abae2f9..b7a79f7 100644 --- a/authlogin.php +++ b/authlogin.php @@ -20,12 +20,6 @@ $row["authcode"] = ""; $ruserid = ""; $rpassword = ""; -$userid = ""; -$_SESSION["userid"]=""; - -$password = null; -$_SESSION["password"]=""; - session_start(); @@ -47,60 +41,18 @@ try { if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true) { - $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); - $passQuery->bindValue(':userid', $_SESSION['userid']); - $passQuery->execute(); - $res = $passQuery->fetch(); - if(empty($res["userid"])){ - header("Location: login.php"); - exit; - }elseif($_SESSION['loginid'] === $res["loginid"]){ - // セッションに値をセット - $userid = $_SESSION['userid']; // セッションに格納されている値をそのままセット - $username = $_SESSION['username']; // セッションに格納されている値をそのままセット - $_SESSION['admin_login'] = true; - $_SESSION['userid'] = $userid; - $_SESSION['username'] = $username; - $_SESSION['loginid'] = $res["loginid"]; - setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); - setcookie('username', $username, time() + 60 * 60 * 24 * 14); - setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); - setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); - header("Location: home/"); + header("Location: home/index.php"); exit; - } - - + } elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) { - $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); - $passQuery->bindValue(':userid', $_COOKIE['userid']); - $passQuery->execute(); - $res = $passQuery->fetch(); - if(empty($res["userid"])){ - header("Location: login.php"); - exit; - }elseif($_COOKIE['loginid'] === $res["loginid"]){ - // セッションに値をセット - $userid = $_COOKIE['userid']; // クッキーから取得した値をセット - $username = $_COOKIE['username']; // クッキーから取得した値をセット - $_SESSION['admin_login'] = true; - $_SESSION['userid'] = $userid; - $_SESSION['username'] = $username; - $_SESSION['loginid'] = $res["loginid"]; - setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); - setcookie('username', $username, time() + 60 * 60 * 24 * 14); - setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); - setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); - header("Location: home/"); + header("Location: home/index.php"); exit; - } - } - if( !empty($_POST['btn_submit']) ) { + $userbackupcode = $_POST['userbackupcode']; $options = array( // SQL実行失敗時に例外をスルー @@ -116,48 +68,135 @@ if( !empty($_POST['btn_submit']) ) { require_once 'authcode/GoogleAuthenticator.php'; - $result = $dbh->prepare("SELECT authcode,loginid,username FROM account WHERE userid = :userid"); + $result = $dbh->prepare("SELECT authcode,loginid,username,backupcode FROM account WHERE userid = :userid"); $result->bindValue(':userid', $userid); // SQL実行 $result->execute(); - if($result->rowCount() > 0) { + + if(!(empty($userbackupcode))){ $row = $result->fetch(); + if($row["backupcode"] === $userbackupcode){ + $pdo->beginTransaction(); + + try { + $touserid = $userid; + $datetime = date("Y-m-d H:i:s"); + $msg = "バックアップコードを使用しログインされました!\nバックアップコード変更のために二段階認証を再設定することを強くおすすめします。\nまた、もしバックアップコードを利用してログインした覚えがない場合は「その他」より全てのセッションを終了し、設定画面よりパスワードを変更し、二段階認証を再設定してください!"; + $title = '🔴バックアップコード使用のお知らせ🔴'; + $url = '/settings'; + $userchk = 'none'; + // 通知用SQL作成 + $stmt = $pdo->prepare("INSERT INTO notification (touserid, msg, url, datetime, userchk, title) VALUES (:touserid, :msg, :url, :datetime, :userchk, :title)"); + + $stmt->bindParam(':touserid', $touserid, PDO::PARAM_STR); + $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); + $stmt->bindParam(':url', $url, PDO::PARAM_STR); + $stmt->bindParam(':userchk', $userchk, PDO::PARAM_STR); + $stmt->bindParam(':title', $title, PDO::PARAM_STR); - $tousercode = $row["authcode"]; + $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); - $chkauthcode = new PHPGangsta_GoogleAuthenticator(); + // SQLクエリの実行 + $res = $stmt->execute(); - $userauthcode = $_POST['usercode']; + // コミット + $res = $pdo->commit(); - if(empty($userauthcode)){ - $error_message[] = "コードを入力してください。"; + } catch(Exception $e) { + + // エラーが発生した時はロールバック + $pdo->rollBack(); + } + + $_SESSION['admin_login'] = true; + $_SESSION['userid'] = $userid; + $_SESSION['loginid'] = $row["loginid"]; + + $_SESSION['username'] = $row["username"]; + $_SESSION['password'] = ""; + + // リダイレクト先のURLへ転送する + $url = '/home'; + header('Location: ' . $url, true, 303); + + // すべての出力を終了 + exit; }else{ - - $discrepancy = 2; - - $checkResult = $chkauthcode->verifyCode($tousercode, $userauthcode, $discrepancy); - if ($checkResult) { - $_SESSION['admin_login'] = true; - $_SESSION['userid'] = $userid; - $_SESSION['loginid'] = $row["loginid"]; - - $_SESSION['username'] = $row["username"]; - $_SESSION['password'] = ""; - - // リダイレクト先のURLへ転送する - $url = '/home'; - header('Location: ' . $url, true, 303); - - // すべての出力を終了 - exit; - - }else { - $error_message[] = '二段階認証が出来ませんでした。再度お試しください。'; - } + $error_message[] = "そのバックアップコードは使用できません。"; } }else{ - $error_message[] = 'データの取得が出来ませんでした。再度お試しください。'; + + if($result->rowCount() > 0) { + $row = $result->fetch(); + + $tousercode = $row["authcode"]; + + $chkauthcode = new PHPGangsta_GoogleAuthenticator(); + + $userauthcode = $_POST['usercode']; + + if(empty($userauthcode)){ + $error_message[] = "コードを入力してください。"; + }else{ + + $discrepancy = 2; + + $checkResult = $chkauthcode->verifyCode($tousercode, $userauthcode, $discrepancy); + if ($checkResult) { + + $pdo->beginTransaction(); + try { + $touserid = $userid; + $datetime = date("Y-m-d H:i:s"); + $msg = "アカウントにログインがありました。\nもしログインした覚えがない場合は「その他」よりセッションを終了し、パスワードを変更し、二段階認証を再設定してください。"; + $title = '🚪ログイン通知🚪'; + $url = '/settings'; + $userchk = 'none'; + // 通知用SQL作成 + $stmt = $pdo->prepare("INSERT INTO notification (touserid, msg, url, datetime, userchk, title) VALUES (:touserid, :msg, :url, :datetime, :userchk, :title)"); + + $stmt->bindParam(':touserid', $touserid, PDO::PARAM_STR); + $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); + $stmt->bindParam(':url', $url, PDO::PARAM_STR); + $stmt->bindParam(':userchk', $userchk, PDO::PARAM_STR); + $stmt->bindParam(':title', $title, PDO::PARAM_STR); + + $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + + // SQLクエリの実行 + $res = $stmt->execute(); + + // コミット + $res = $pdo->commit(); + + } catch(Exception $e) { + + // エラーが発生した時はロールバック + $pdo->rollBack(); + } + + $_SESSION['admin_login'] = true; + $_SESSION['userid'] = $userid; + $_SESSION['loginid'] = $row["loginid"]; + + $_SESSION['username'] = $row["username"]; + $_SESSION['password'] = ""; + + // リダイレクト先のURLへ転送する + $url = '/home'; + header('Location: ' . $url, true, 303); + + // すべての出力を終了 + exit; + + }else { + $error_message[] = '二段階認証が出来ませんでした。再度お試しください。'; + } + } + }else{ + $error_message[] = 'データの取得が出来ませんでした。再度お試しください。'; + } } } @@ -203,6 +242,11 @@ $pdo = null;

二段階認証コード

6桁のコードを入力してください。
+
+
+

バックアップコード

+
もし二段階認証が出来ない場合は8桁英数字のバックアップコードを入力してください。
+
diff --git a/check.php b/check.php index 9df1ee0..5fa1346 100644 --- a/check.php +++ b/check.php @@ -21,22 +21,8 @@ $row["password"] = array(); $ruserid = array(); $rpassword = array(); -$userid = null; -$_SESSION["userid"]=""; - -$password = null; -$_SESSION["password"]=""; - - session_start(); -// 管理者としてログインしているか確認 -if( empty($_SESSION['admin_login']) || $_SESSION['admin_login'] !== true ) { - // ログインページへリダイレクト - header("Location: ./login.php"); - exit; -} - // データベースに接続 try { @@ -108,6 +94,37 @@ try { if( !empty($_POST['btn_submit']) ) { + $pdo->beginTransaction(); + try { + $touserid = $userid; + $datetime = date("Y-m-d H:i:s"); + $msg = "アカウントにログインがありました。\nもしログインした覚えがない場合は「その他」よりセッションを終了し、パスワードを変更してください。"; + $title = '🚪ログイン通知🚪'; + $url = '/settings'; + $userchk = 'none'; + // 通知用SQL作成 + $stmt = $pdo->prepare("INSERT INTO notification (touserid, msg, url, datetime, userchk, title) VALUES (:touserid, :msg, :url, :datetime, :userchk, :title)"); + + $stmt->bindParam(':touserid', $touserid, PDO::PARAM_STR); + $stmt->bindParam(':msg', $msg, PDO::PARAM_STR); + $stmt->bindParam(':url', $url, PDO::PARAM_STR); + $stmt->bindParam(':userchk', $userchk, PDO::PARAM_STR); + $stmt->bindParam(':title', $title, PDO::PARAM_STR); + + $stmt->bindParam(':datetime', $datetime, PDO::PARAM_STR); + + // SQLクエリの実行 + $res = $stmt->execute(); + + // コミット + $res = $pdo->commit(); + + } catch(Exception $e) { + + // エラーが発生した時はロールバック + $pdo->rollBack(); + } + $_SESSION['admin_login'] = true; $_SESSION['userid'] = $userid; $_SESSION['loginid'] = $userData["loginid"]; diff --git a/index.php b/index.php index 1576757..b30b2e9 100644 --- a/index.php +++ b/index.php @@ -4,76 +4,18 @@ require('db.php'); session_start(); - -try { - - $option = array( - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::MYSQL_ATTR_MULTI_STATEMENTS => false - ); - $pdo = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option); - -} catch(PDOException $e) { - - // 接続エラーのときエラー内容を取得する - $error_message[] = $e->getMessage(); -} - if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true) { - $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); - $passQuery->bindValue(':userid', $_SESSION['userid']); - $passQuery->execute(); - $res = $passQuery->fetch(); - if(empty($res["userid"])){ - header("Location: login.php"); - exit; - }elseif($_SESSION['loginid'] === $res["loginid"]){ - // セッションに値をセット - $userid = $_SESSION['userid']; // セッションに格納されている値をそのままセット - $username = $_SESSION['username']; // セッションに格納されている値をそのままセット - $_SESSION['admin_login'] = true; - $_SESSION['userid'] = $userid; - $_SESSION['username'] = $username; - $_SESSION['loginid'] = $res["loginid"]; - setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); - setcookie('username', $username, time() + 60 * 60 * 24 * 14); - setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); - setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); - header("Location: home/"); + header("Location: home/index.php"); exit; - } - - + } elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) { - $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); - $passQuery->bindValue(':userid', $_COOKIE['userid']); - $passQuery->execute(); - $res = $passQuery->fetch(); - if(empty($res["userid"])){ - header("Location: login.php"); - exit; - }elseif($_COOKIE['loginid'] === $res["loginid"]){ - // セッションに値をセット - $userid = $_COOKIE['userid']; // クッキーから取得した値をセット - $username = $_COOKIE['username']; // クッキーから取得した値をセット - $_SESSION['admin_login'] = true; - $_SESSION['userid'] = $userid; - $_SESSION['username'] = $username; - $_SESSION['loginid'] = $res["loginid"]; - setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); - setcookie('username', $username, time() + 60 * 60 * 24 * 14); - setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); - setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); - header("Location: home/"); + header("Location: home/index.php"); exit; - } - } - $servernamefile = "server/servername.txt"; //------------------------ diff --git a/login.php b/login.php index bea792a..9254984 100644 --- a/login.php +++ b/login.php @@ -42,58 +42,15 @@ try { // 接続エラーのときエラー内容を取得する $error_message[] = $e->getMessage(); } - if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true) { - $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); - $passQuery->bindValue(':userid', $_SESSION['userid']); - $passQuery->execute(); - $res = $passQuery->fetch(); - if(empty($res["userid"])){ - header("Location: login.php"); - exit; - }elseif($_SESSION['loginid'] === $res["loginid"]){ - // セッションに値をセット - $userid = $_SESSION['userid']; // セッションに格納されている値をそのままセット - $username = $_SESSION['username']; // セッションに格納されている値をそのままセット - $_SESSION['admin_login'] = true; - $_SESSION['userid'] = $userid; - $_SESSION['username'] = $username; - $_SESSION['loginid'] = $res["loginid"]; - setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); - setcookie('username', $username, time() + 60 * 60 * 24 * 14); - setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); - setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); - header("Location: home/"); + header("Location: home/index.php"); exit; - } - - + } elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) { - $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); - $passQuery->bindValue(':userid', $_COOKIE['userid']); - $passQuery->execute(); - $res = $passQuery->fetch(); - if(empty($res["userid"])){ - header("Location: login.php"); - exit; - }elseif($_COOKIE['loginid'] === $res["loginid"]){ - // セッションに値をセット - $userid = $_COOKIE['userid']; // クッキーから取得した値をセット - $username = $_COOKIE['username']; // クッキーから取得した値をセット - $_SESSION['admin_login'] = true; - $_SESSION['userid'] = $userid; - $_SESSION['username'] = $username; - $_SESSION['loginid'] = $res["loginid"]; - setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); - setcookie('username', $username, time() + 60 * 60 * 24 * 14); - setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); - setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); - header("Location: home/"); + header("Location: home/index.php"); exit; - } - } @@ -229,7 +186,7 @@ $pdo = null;
- +
diff --git a/new.php b/new.php index 3c6c92c..9d73d5e 100644 --- a/new.php +++ b/new.php @@ -27,50 +27,6 @@ $stmt = null; $res = null; $option = null; -if(isset($_COOKIE["username"])){ - $_SESSION["username"]=$_COOKIE["username"]; -}else{ - $_SESSION["username"]=""; -} - -if(isset($_COOKIE["userid"])){ - $_SESSION["userid"]=$_COOKIE["userid"]; -}else{ - $_SESSION["userid"]=""; -} - -if(isset($_COOKIE["password"])){ - $_SESSION["password"]=$_COOKIE["password"]; -}else{ - $_SESSION["password"]=""; -} - -if(isset($_COOKIE["mailadds"])){ - $_SESSION["mailadds"]=$_COOKIE["mailadds"]; -}else{ - $_SESSION["mailadds"]=""; -} - -if(isset($_COOKIE["profile"])){ - $_SESSION["profile"]=$_COOKIE["profile"]; -}else{ - $_SESSION["profile"]=""; -} - - -//$username = array(); -//$userid = array(); - -//$realname = array(); -//$yominame = array(); - -//$password = array(); -//$mailadds = array(); - -//$profile = array(); - - -// データベースに接続 try { $option = array( @@ -85,6 +41,61 @@ try { $error_message[] = $e->getMessage(); } + +if(isset($_SESSION['admin_login']) && $_SESSION['admin_login'] === true) { + + $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); + $passQuery->bindValue(':userid', $_SESSION['userid']); + $passQuery->execute(); + $res = $passQuery->fetch(); + if(empty($res["userid"])){ + header("Location: login.php"); + exit; + }elseif($_SESSION['loginid'] === $res["loginid"]){ + // セッションに値をセット + $userid = $_SESSION['userid']; // セッションに格納されている値をそのままセット + $username = $_SESSION['username']; // セッションに格納されている値をそのままセット + $_SESSION['admin_login'] = true; + $_SESSION['userid'] = $userid; + $_SESSION['username'] = $username; + $_SESSION['loginid'] = $res["loginid"]; + setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); + setcookie('username', $username, time() + 60 * 60 * 24 * 14); + setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); + setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); + header("Location: home/index.php"); + exit; + } + + +} elseif (isset($_COOKIE['admin_login']) && $_COOKIE['admin_login'] == true) { + + $passQuery = $pdo->prepare("SELECT username,userid,loginid,admin FROM account WHERE userid = :userid"); + $passQuery->bindValue(':userid', $_COOKIE['userid']); + $passQuery->execute(); + $res = $passQuery->fetch(); + if(empty($res["userid"])){ + header("Location: ../login.php"); + exit; + }elseif($_COOKIE['loginid'] === $res["loginid"]){ + // セッションに値をセット + $userid = $_COOKIE['userid']; // クッキーから取得した値をセット + $username = $_COOKIE['username']; // クッキーから取得した値をセット + $_SESSION['admin_login'] = true; + $_SESSION['userid'] = $userid; + $_SESSION['username'] = $username; + $_SESSION['loginid'] = $res["loginid"]; + setcookie('userid', $userid, time() + 60 * 60 * 24 * 14); + setcookie('username', $username, time() + 60 * 60 * 24 * 14); + setcookie('loginid', $res["loginid"], time() + 60 * 60 * 24 * 14); + setcookie('admin_login', true, time() + 60 * 60 * 24 * 14); + header("Location: home/index.php"); + exit; + } + + +} + if( !empty($_POST['btn_submit']) ) { diff --git a/success.php b/success.php index d2cca35..2a11467 100644 --- a/success.php +++ b/success.php @@ -1,5 +1,10 @@ @@ -29,6 +34,11 @@ $servernamefile = "server/servername.txt";


いぇ~い!

88888888888

アカウント登録が完了しました!

+ +

バックアップコードは以下のものです!
以下のコードでスマートフォンをなくしてしまったなどのもしものときにログインいただけます。
絶対に大切に保管してください!
また、そのバックアップコードは絶対に公開しないでください。

+

+