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

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

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

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

Q&A

解決済

4回答

392閲覧

IPアドレスをチェックして本人確認したいです

takopo

総合スコア484

PHP

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

0グッド

0クリップ

投稿2019/02/24 10:58

編集2019/02/24 11:30

質問させてください。
今phpで掲示板を作っていまして、投稿した本人だけに表示される削除ボタンを配置したいと考えております。

とあるサイトに、本人確認にはクッキーとIPアドレスをチェックすることで実現できるとあり、そちらを参考に見よう見まねで作成しました。

イメージしているものとしましてはこちらのような感じです。

IPアドレスは下何ケタが変化するらしく、上位6ケタを照合するとあったのですが、どうもこの「IPアドレスの上位6ケタが一致」という部分が引っかかってまして、これで本当に本人証明できているのだろうかと不安です。

以下が作成したコードなのですが、こちらできちんと本人確認できていますでしょうか・・・
他人が削除できてしまう状況は避けたいので、もし何か間違っている箇所がありましたらご教授いただけますと助かります。

よろしくお願いいたします。

php

1<?php 2 3 4// jsonファイルを開く 5$fp = fopen('data.json', 'c+b'); 6 7// JSONファイルを読み取り配列に変換 8$rows = (array)json_decode(stream_get_contents($fp), true); 9 10// トークンがあれば本人確認 11if (isset($_COOKIE['token'])) { 12 $t = $_COOKIE['token']; 13 checkIdentity($rows, $t); 14} 15 16/* 本人確認処理 17------------------------------------------------------------------------- */ 18function checkIdentity($rows, $token) { 19 // IPアドレスの取得 20 $ip_user = substr($_SERVER["REMOTE_ADDR"], 0, 6); // IPアドレスの上位6桁を取得 21 22 // jsonファイルの中にIPとトークンがあるか検索 23 foreach ($rows as $row) { 24 $ip_json = substr($row['ipaddress'], 0, 6); 25 26 // 両方一致したら本人 27 if ($token === $row['token'] && $ip_user === $ip_json) { 28 echo '本人'; 29 } else { 30 echo '他人'; 31 } 32 } 33} 34 35/* 投稿処理 36------------------------------------------------------------------------- */ 37// 投稿と同時にIPアドレスを取得&クッキーをセットしてjsonに書き込む 38if ($_SERVER['REQUEST_METHOD'] === 'POST') { 39 // IPアドレスの取得 40 $ipaddress = $_SERVER["REMOTE_ADDR"]; 41 42 // ランダムでユニークな文字列を生成 43 $token = sha1(uniqid(rand(), true)); 44 45 // クッキーにトークンをセット 46 setcookie('token', $token, time()+60*60*3); 47 48 // jsonに追加する 49 $rows[] = ['ipaddress' => $ipaddress, 'token' => $token]; 50 51 rewind($fp); 52 fwrite($fp, json_encode($rows, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); 53 ftruncate($fp, ftell($fp)); 54} 55 56// ファイルを閉じる 57fclose($fp); 58 59 60?> 61<!DOCTYPE html> 62<html lang="ja"> 63<head> 64<meta charset="utf-8"> 65<title></title> 66</head> 67<body> 68 69 70<form method="post" action=""> 71 <input type="submit" value="投稿"> 72</form> 73 74 75</body> 76</html>

jsonファイルはこのようになっています。(111となっているはテストのためです。)

json

1[ 2 { 3 "ipaddress": "111", 4 "token": "610b2f57273f9ddad8340a745205ac939c0b18fb" 5 }, 6 { 7 "ipaddress": "222", 8 "token": "7a2fc55acb113b8c2216f138c237627bcd4ba1ac" 9 }, 10 { 11 "ipaddress": "333", 12 "token": "46feea3ea9814f6b8662c1262f59aaca7a345eed" 13 }, 14 { 15 "ipaddress": "444", 16 "token": "d2f4cf49aaa984e82d352d1cce864c62d9fbfe1c" 17 }, 18 { 19 "ipaddress": "192.168.33.1", 20 "token": "2fc29f804b3e1d57701897faf49d57e2bff5101b" 21 } 22]

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

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

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

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

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

guest

回答4

0

これで本当に本人証明できているのだろうかと不安です。

できません。
例えば同じマンションに住んでいるだけで、同じ IP アドレスになる場合もありますし、同じ人でも 4G 経由でアクセスすると別アドレスになります。

投稿2019/02/24 11:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/02/24 11:23

同じマンション? いいや 同じ地域のCATV契約のネット接続が同じIPになるというあれな仕様も
takopo

2019/02/24 11:34

ご回答ありがとうございます。そうなんですね、一応厳密な本人確認は難しそうなので、クッキーを削除したり、IPやデバイスを変えたりした場合は、削除ボタンは出なくてもOKかなと考えています。 参考サイトを追記させていただいたのですが、こちらのような感じをイメージしています。
guest

0

ベストアンサー

IPアドレスは下何ケタが変化するらしく、上位6ケタを照合すればOKとあったのですが、どうもこの「IPアドレスの上位6ケタが一致」という部分が引っかかってまして、これで本当に本人証明できているのだろうかと不安です。

IPアドレス単体では限定的な場合を除いて本人確認には使用できません。
例えば、スマホで4G通信を行う時とwifiで通信する時は完全に別のIPアドレスになりますし、
4G通信でも場合によって完全に別のIPアドレスになります。
PCであっても、プロバイダによっては同じIPアドレスを複数人で使用されるケースはよくあります。
(ケーブルテレビなどではよくあります)

一方で任意のIPアドレスに偽装したままHTTP通信を行うことは基本的にはとても困難なので、
IPアドレス認証をかけることによって

  • 単にcookieを偽装しただけでは本人に偽装出来ない

という効果を期待することは可能です。
これは同時に

  • 本人であってもIPアドレスが変わってしまうと他人扱いされてしまう

とイコールであるため、仕様としてはかなり使いにくくになります。
実用的なのは、グローバルIPの管理が出来る特定の企業やVPN契約を前提とする場合などでしょうか。

一般向けのサービスとして使うのであれば、

  • 単にcookieだけで本人認証を行う。cookie偽装による成り済ましのリスクは許容する
  • 投稿時に編集用キーを入力させて、編集用キーはサーバサイドに保存し、cookie+編集用キーで本人確認を行う(
  • ユーザ登録させてID/PWによる本人確認を行えるようにする
  • ソーシャルログイン等、他サービスの認証機能を利用することで本人確認を行う

あたりが現実的でよく使われる手法になります。

投稿2019/02/24 11:36

tanat

総合スコア18713

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

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

takopo

2019/02/24 12:15

ご回答ありがとうございます。皆様に頂いたアドバイスはどれも大変ためになることばかりで感謝しております。IPアドレスは状況によっていろいろ変化することが分かり、今の自分では扱うのが難しいことを実感しまして、今回はcookieだけにするかキー(パスワード)で認証できるような形で作り直してみたいと思います。 ベストアンサーは迷ったのですが、一番詳しく書いていただいたtanat様とさせていただきました。他の方には申し訳ありません。ありがとうございました。
guest

0

そこに書いてある通り削除用のパスワードを投稿ごとに入力させればいい。

削除機能を付ける為には誰でもかってに『削除』できないようにパスワードを入力するのが普通ですが、

学習段階の初心者は他のこと気にしなくていい。
ハッシュ化とかパスワードの扱い方を覚えるほうが重要。

投稿2019/02/24 11:55

kawax

総合スコア10377

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

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

takopo

2019/02/24 12:11

ご回答ありがとうございます。皆様にアドバイスいただいたおかげでIPアドレスを扱うのはまだ早いと痛感しました。パスワード良さそうですね。検討させていただきます。
退会済みユーザー

退会済みユーザー

2019/02/24 12:22

扱う時期が早いじゃなく、時代的に遅すぎるってところだね
guest

0

「出来ない」ということはte2jiさんが書かれているので、その通りです。
アクセスするだけで個人を特定するのは一般的には無理な話です。

が、例えば一度アカウント名とパスワードを登録してもらい、ログインした状態であれば、当然ながらその人だと考えられますよね。
この「ログインした状態」を数日間有効にするとかで、その期間についてはログインせずともログイン済みの本人確認出来た状態とする事は可能です。
ログインの保持についてはCookieを使えばいいですが、セキィリティについて考える必要があったりするので実装される際はちゃんと調べて見て下さい。

投稿2019/02/24 11:22

kunai

総合スコア5405

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

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

takopo

2019/02/24 11:38

ご回答ありがとうございます。そうですよね、たしかにログイン機能があった方がセキュリティ的にもしっかりして確実にボタンが出せそうですね。しかしながら私のスキルではまだそのようなことは難しく、今回はクッキーを削除されたり、IPを変えたりした場合はしょうがないかなと考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問