質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1089閲覧

セッション ユーザーIDがユニークでなかったり、変更できる場合にidをもたせる

creative_09

総合スコア80

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2018/08/13 04:48

会員サイトでログインが成功すると、$_SESSION['id']に番号(id)が入るとします。
このid番号はユーザーの通し番号であり、ユニーク制約とオートインクリメントが設定されています

会員の登録情報に変更があった場合、
このID番号の会員情報を変更するようになっている場合で質問です

ログイン時にこの番号をセッションに書き込んでずっと持っている状態はあぶないのでしょうか?
会員情報変更などの際でのみ、idを問い合わせるほうが良いのでしょうか?

通常ではユーザーIDなどをもたせる場合が多いと思うのでIDを持たせない理由がなにかあるのか気になっています
ユーザーIDがユニークでなかったり、変更できる場合にidをもたせるのは危険なのか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. id番号はユーザーの通し番号であり、ユニーク制約とオートインクリメントが設定
  2. 会員の登録情報に変更があった場合、このID番号の会員情報を変更するようになっている

まず、この2点はセオリーとして設計が間違っています。

QAサイトでよくある質問ではありますが、「IDを変更できる」ようにしたいという要件は、「特定のあるユーザー」が削除された時に、IDが欠番になってしまい、「気持ち悪い」という曖昧な感覚の問題であるように推測します。

なぜ AutoIncrement の値を変えてはいけないのか

例えば、以下のような User テーブル を想定します。

sql

1CREATE TABLE `User` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'AI', 3 `user_name` varchar(64) DEFAULT NULL COMMENT '氏名', 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

このテーブルが、他のテーブルと一切関連がなく、完全に独立したものであれば、id を変更しても、ユニークであれば、問題はないでしょう。

ただし、このユーザーテーブルが通常のシステムにおいて、他のテーブルとはなんらかの関連を持っているものです。

[親]Company(会社)- [子]User の関係であるとか、[親]User - [子]Article(記事)といった具合です。

特に User が 親 である場合には、大変なことが起きます。

【User】

IDuser_name
1佐藤
2武田
3鈴木

【Article】

| ID | article | create_user_id |
|----------:|:-----------|
| 1 | 記事1 | 2 |
| 2 | 記事2 | 1 |
| 3 | 記事3 | 3 |

User と Article がこのように関連づいています。

ここで、ID: 2 の武田さんの番号を変更する場合、Article の ID:1 のレコードの create_user_id も変更しないといけません。
ほとんどのシステムにおいては、一つのテーブルが他の多くのテーブルに関連づいているため、Article のみならず、数十というテーブルのデータを変更する必要すら出てきてしまいます。

代替案

どうしても「見た目」の問題として、「欠番があることが嫌だ」というのであれば、autoincrement を設定したIDをUIに表示するのではなく、表示用のID を別に設定することが望ましいです。

例えばこんな感じです。

sql

1CREATE TABLE `User` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'AI', 3 `display_id` int(11) DEFAULT NULL COMMENT '表示用ユーザーID', 4 `user_name` varchar(64) DEFAULT NULL COMMENT '氏名', 5 PRIMARY KEY (`id`), 6 UNIQUE KEY `display_id` (`display_id`) 7) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

投稿2018/08/13 05:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

creative_09

2018/08/13 08:01

ありがとうございます。詳しく頂けてすごく勉強になります 質問の内容も悪かったのですが、 AutoIncrement の値をかえたいわけではなく、 そのAutoIncrement の値をログイン時にセッションに書き込むという行為の善悪を知りたかったのです。 通常ではログイン確認が取れた時点でuser_idをもたせる?フラグを立てる?といったことがあると思いますが、AutoIncrement の値をidとして持っておきたいのです。 その場合、セッションにユニークである、idをもたせておくのは危険なのかなぁと思った次第です 変更が効かないAutoIncrement の値をセッションに持っていても問題はないのでしょうか? よろしくおねがいします
退会済みユーザー

退会済みユーザー

2018/08/13 08:18 編集

SESSIONにDB上のIDを持たせること自体は問題ありません。脆弱性があるのはSESSIDが漏洩すること、SESSIDが固定課されている場合に問題はあります。 ちなみに自分の場合は、IDではなく、UserオブジェクトをSESSIONに代入して使い回しすることが多いです。
creative_09

2018/08/17 13:50

安心しました。 セッショには常にユーザーのログインの証としてユーザーの番号を持たすことにします。 番号は1から順番なので推測されやすいなどあるのかなとおもっていましたが、 その番号でログインはできません。ただ参照する際にはすべてその番号で行います もちろん番号がわかっても何もできないような工夫など、脆弱性がないようにします。 まちがった認識であればまた回答頂けましたら嬉しいです。 ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問