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, $options); } catch(PDOException $e) { // 接続エラーのときエラー内容を取得する $error_message[] = 'データベース接続エラー: ' . $e->getMessage(); } if( !empty($_POST['btn_submit']) ) { $options = array( // SQL実行失敗時に例外をスルー PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // デフォルトフェッチモードを連想配列形式に設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); $dbh = new PDO('mysql:charset=utf8mb4;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $options); require_once '../authcode/GoogleAuthenticator.php'; $result = $dbh->prepare("SELECT authcode,loginid,username FROM account WHERE userid = :userid"); $result->bindValue(':userid', $userid); // SQL実行 $result->execute(); if($result->rowCount() > 0) { $row = $result->fetch(); $tousercode = $row["authcode"]; $chkauthcode = new PHPGangsta_GoogleAuthenticator(); $userauthcode = $_POST['usercode']; $password = $_POST['password']; if(empty($userauthcode)){ $error_message[] = "コードを入力してください。"; }else{ $discrepancy = 2; $checkResult = $chkauthcode->verifyCode($tousercode, $userauthcode, $discrepancy); if ($checkResult) { // パスワードの入力チェック if( empty($password) ) { $error_message[] = 'パスワードを入力してください。'; } else { $weakPasswords = array( "password", "123456", "123456789", "12345", "12345678", "123123", "1234567890", "1234567", "1q2w3e", "qwerty123", "aa12345678", "password1", "1234", "qwertyuiop", "123321", "12321", "qwertyui", "abcd1234", "zaq12wsx", "1q2w3e4r", "qwer1234", "sakura", "asdf1234", "asdfghjkl", "asdfghjk", "member", "1qaz2wsx", "doraemon", "makoto", "takeshi", "machi1", "machida", "machida1", "tokyo", "arashi", "dropbox", "twitter", "elonmusk", "xcorp", "1234qwer", "japan", "nippon", "tukareta", "tweet", "discord", "misskey", "qwerty", "123456789", "abc123", "password123", "admin", "letmein", "iloveyou", "111111", "12345678910", "user", "root", "system", // 他にも弱いパスワードを追加できます ); function isWeakPassword($passwords) { global $weakPasswords; return in_array($passwords, $weakPasswords); } // テスト用のパスワード(実際にはユーザー入力などから取得することになります。 if (isWeakPassword($password)) { $error_message[] = "パスワードが弱いです。セキュリティ上変更してください。"; } else { } if( 4 > mb_strlen($password, 'UTF-8') ) { $error_message[] = 'パスワードは4文字以上である必要があります。'; } // 文字数を確認 if( 100 < mb_strlen($password, 'UTF-8') ) { $error_message[] = 'パスワードは100文字以内で入力してください。'; } } if( empty($error_message) ) { // トランザクション開始 $pdo->beginTransaction(); $hashpassword = password_hash($password, PASSWORD_DEFAULT); try { // SQL作成 $stmt = $pdo->prepare("UPDATE account SET password = :password WHERE userid = :userid;"); // 他の値をセット $stmt->bindParam(':password', $hashpassword, PDO::PARAM_STR); // 条件を指定 // 以下の部分を適切な条件に置き換えてください $stmt->bindValue(':userid', $userid, PDO::PARAM_STR); // SQLクエリの実行 $res = $stmt->execute(); // コミット $res = $pdo->commit(); } catch (Exception $e) { // エラーが発生した時はロールバック $pdo->rollBack(); } if ($res) { $_SESSION['userid'] = ""; $url = 'donerecovery.php'; header('Location: ' . $url, true, 303); // すべての出力を終了 exit; } else { $error_message[] = 'パスワードの更新に失敗しました。'; } } }else { $error_message[] = '二段階認証が出来ませんでした。再度お試しください。'; } // プリペアドステートメントを削除 $stmt = null; } } } // データベースの接続を閉じる $pdo = null; ?>