Edited at

ログインフォーム暗号化(PHP、MySQL)

More than 5 years have passed since last update.


これは古い記事です。

新しい記事があります。

【ログインフォーム(ソースコード)パスワードのハッシュとID重複チェックなど】

この記事は色々不備があったので書き直しています。

そちらをご覧ください。


でも消さない。

一応、消さずに置いておこうと思います。

なにかの役に立つ時があるかもしれないし、せっかくコメントも頂いているので残しておきたいと思います。



MySQLとPHPでログインフォームを暗号化するメモ。

プレグマッチでエラー検査をして、大丈夫ならMySQLに問い合わせ。


ログイン画面


login.php

<?php

session_start();
session_regenerate_id(true); ////////sessionハイジャック防止
//-------------------------------
// ●サーバに接続
//-------------------------------
$my_Con =
mysql_connect("サーバー名","ユーザー名","パスワード");
if ($my_Con == false){
die("接続に失敗しました");
}else{
}
//-------------------------------
// ●データベースに接続
//-------------------------------
if (mysql_select_db("DB名")){
}else{
die("<br />データベースの選択に失敗しました");
}
mysql_query('SET NAMES UTF8');
$error = "";
$id = "";
$pass = "";
$mail = "";
$self = $_SERVER["SCRIPT_NAME"];
//---------------------------------------
//ログイン認証
//---------------------------------------
if (isset($_POST["in"])){
$id = htmlspecialchars($_POST['id'],ENT_QUOTES);
$pass = htmlspecialchars($_POST['pass'],ENT_QUOTES);
//--------------------------------------
//エラー確認
//--------------------------------------
if (empty($_POST["id"])) {
$error = '<p style="color:white; font-size:14px; background-color:red; height:30px; width:70%;">IDを入力してください</p>';
}
if (empty($_POST["pass"])){
$error = '<p style="color:white; font-size:14px; background-color:red; height:30px; width:70%;">パスワードを入力してください</p>';
}
if (preg_match("/^[a-zA-Z0-9]+$/", $id)) { /////プレグマッチ半角英数
$id = $id;
}else{
$error = '<p style="color:white; font-size:14px; background-color:red; height:30px; width:70%;">IDの値が不正です。</p>';
}
if (preg_match("/^[a-zA-Z0-9]+$/", $pass)) { /////プレグマッチ半角英数
$pass = $pass;
}else{
$error = '<p style="color:white; font-size:14px; background-color:red; height:30px; width:70%;">PASSの値が不正です。</p>';
}
//--------------------------------------
//テーブル情報呼び出し変数代入
//--------------------------------------
if ($error==""){
//---------------------
//暗号化
//---------------------
$password = sha1($pass); ////////$passをsha1で暗号化
$passw = "任意の文字列".$password."任意の文字列"; //前後に任意の文字列を追加
$passd = sha1($passw); ////////もう一度sha1で暗号化
//---------------------
$idmail = sha1($id);
$idw = "任意の文字列".$idmail."任意の文字列";
$idd = sha1($idw);
//--------------------
$sql = sprintf('SELECT * FROM テーブル名 WHERE id="%s" AND pass="%s"',mysql_real_escape_string($idd),mysql_real_escape_string($passd));
$record = mysql_query($sql) or die(mysql_error());
if ($table = mysql_fetch_assoc($record)){
$_SESSION['id'] = $table['id'];
$_SESSION['time'] = time();
header('Location: http://○○○.com'); //////ログイン後のページ
}else{
$error = '<p style="color:white; font-size:14px; background-color:red; height:30px; width:70%;">IDとパスワードを確認してください</p>';
}
}
}
//----------------------------------------
//ログアウト処理
//----------------------------------------
if (isset($_POST["out"])) {
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_id(), '', time() - 4200,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
setcookie('id', '', time()-3600);
setcookie('pass', '', time()-3600);
header('Location: http://○○○.com'); /////ログアウト後のページ
}
?>


●例えば、IDが【japan】だった場合

 まずこれをsha1で暗号化する。

●つぎに、この【japan】の前後に任意の文字列を付ける。

 例)"enjoy".japan."osaka"

●さらにsha1で再度暗号化する。

絶対解読出来ない事はないにしても、かなりの時間を要するはず。


ログイン認証

index.phpなど、ログイン認証をかけたいページ。

このページにアクセスしても、ログインしていなければ、login.phpに遷移する。


例)index.php

<?php

session_start();
session_regenerate_id(true); ////////sessionハイジャック防止
//-------------------------------
// ●サーバに接続
//-------------------------------
$my_Con =
mysql_connect("サーバー名","ユーザー名","パスワード");
if ($my_Con == false){
die("接続に失敗しました");
}else{
}
//-------------------------------
// ●データベースに接続
//-------------------------------
if (mysql_select_db("DB名")){
}else{
die("<br />データベースの選択に失敗しました");
}
mysql_query('SET NAMES UTF8');
$error = "";
$id = "";
$pass = "";
$mail = "";
$self = $_SERVER["SCRIPT_NAME"];
//------------------------------------
//ログインしてるか確認
//------------------------------------
if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) {
$_SESSION['time'] = time();
$sql = sprintf('SELECT * FROM テーブル名 WHERE id="%s"',mysql_real_escape_string($_SESSION['id']));
$record = mysql_query($sql) or die(mysql_error());
$member = mysql_fetch_assoc($record);
}else{
header('Location: http://○○○.com/login.php'); /////ログインしてなかったらジャンプ
}
//----------------------------------------
//ログアウト処理
//----------------------------------------
if (isset($_POST["out"])) {
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_id(), '', time() - 4200,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
setcookie('id', '', time()-3600);
setcookie('pass', '', time()-3600);
header('Location: http://○○○.com'); //////ログアウトしたらここに遷移
}
?>


●例えばindex.phpなど、ログイン承認をかけたいページの頭にこれを追記。

 ログインする前にこのページにアクセスするとlogin.phpにジャンプする。


備考

●本来は、データベース接続のパスなどを隠していますが、分かりやすいように書いています。


データベース

この場合は以下のような構造にしています。

テーブル名:login

no:オートインクリメント、INT(11)

id:varchar(100) …登録の際も暗号化しているので長くなる為。

pass:varchar(100) …idと同様の理由で長くしてます。


お願い

もっといいフォームの作り方があると思います。

僕はこれを使っていますが。

「そんなんまだまだ甘いわ。こうやれ」など、をご存知の方は是非ご享受ください!