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

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

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

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

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

Q&A

4回答

2292閲覧

[php]個人情報が登録されるサービスのセキュリティについて

Zoohomi

総合スコア26

MySQL

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

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

0グッド

7クリップ

投稿2018/01/02 11:53

お世話になっております。

この度、クライアントが管理画面よりお客様管理をするサービスを構築中です。

流れとして


1.ログイン
2.ログインアカウントに対応した顧客情報(氏名、住所、TEL)の一覧
3.一覧から行を選択し、その行のデータの編集前⇒編集後(テキストボックス)が表示される画面に移動。
4.変更後の値を入力⇒実行ボタン押下
5.DB更新完了


の様な処理があるのですが、この処理について迷っております。

個人情報を取り扱うので、徹底的にセキュリティ対策したいと思っておりますが、
経験が浅く何をやって良いのかわかりません。

現時点で対策済みなのが、

  1. XSS対策
  2. 入力内容からのSQLインジェクション対策

なのですが、CSRF対策をどの処理に対して行えば良いのかが分かりません。

現状考えている流れが以下の通りです。


  1.ログインと同時にセッションにユーザー名、トークンを保存
★ 2.ログインアカウントに対応した顧客情報(氏名、住所、TEL)の一覧の画面から編集行を選択
★ 3.編集画面にて値を入力後、実行ボタン押下にて処理実行ファイルに対してトークンを送信する

<form action="処理実行ファイル.php" method="post"> <!-- トークンをPOST --> <input type="hidden" name="token" value="<?=$_SESSION['token']?>">   <button type="submit">実行</button> </form>

◆ 4.トークンが一致するかどうか確認し、OKならDBをUPDATE
5.完了画面表示


★・・・ログインしているかどうか、if ( isset($_SESSION['user_name'] ) { で確認

◆・・・トークンが一致するかどうか、if ( $_POST['token'] === $_SESSION['token'] { で確認


以上の流れで心配なのが、
・②の時点でがっつりと個人情報が一覧表示されるのですが、この時のチェックって
【ログインしているかどうか、if ( isset($_SESSION['user_name'] ) { で確認】
のみで良いのでしょうか?
この時点でのCSRFの危険はないのでしょうか?

④では、トークンが一致する時点で、必ずログインされているはずなので、★のチェックは必要ないかと思い、省略しておりますが、問題ありますでしょうか?

その他にも、脆弱性がありましたらアドバイス頂ければ非常に助かります・・・。

詳しい方、どうかお願いします。

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

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

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

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

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

guest

回答4

0

te2jiさんの回答に全て同意しますが、別の箇所について回答します。

以上の流れで心配なのが、

・②の時点でがっつりと個人情報が一覧表示されるのですが、この時のチェックって
【ログインしているかどうか、if ( isset($_SESSION['user_name'] ) { で確認】
のみで良いのでしょうか?
この時点でのCSRFの危険はないのでしょうか?

ここは差し当たり大丈夫です。表示のみのページではCSRFはできません。CSRFでは画面表示の内容は取れません。このあたり、脆弱性の勉強が必要ですね。
ログインしているかのチェックですが、どこでやるおつもりでしょうか? 常識的には処理の先頭で、それで問題ないと思います。加えて、『2.ログインアカウントに対応した顧客情報(氏名、住所、TEL)の一覧の画面』とあるので、自然な流れでログインしていることの確認をもう一度しておく(あるいは、ログインしていないと何も表示しないようにロジックを作る)とよいと思います。

④では、トークンが一致する時点で、必ずログインされているはずなので、★のチェックは必要ないかと思い、省略しておりますが、問題ありますでしょうか?

これはあまり良くありません。トークンチェックが null===null で成立する可能性があります。その結果どうなるかは前後のプログラムを確認する必要がありますが、CSRF対策は確実に突破されると思います。
ログインが必要な処理ではプログラムの先頭でログイン確認をしましょう。一々「ログイン確認が必要か否か?」を考える必要はありません。だって、万一ここで検討を間違ったら脆弱性になってしまいます。なので、後のことは考えずに、「ログインが必要な処理ならまずログイン状態を確認する」というのが正しい手順です。

その他にも、脆弱性がありましたらアドバイス頂ければ非常に助かります・・・。

単独で脆弱性とまでは言えませんが、PHP 5.6以降をお使いであれば、トークンの比較にはhash_equals関数を使う方がよいです。これはタイミング攻撃を防ぐことが本来の目的ですが、hash_equalsで比較すると、前述したトークンがNULLの場合には false を返すので、現実的にはこちらの安全性寄与の方が大きいと思います。

投稿2018/01/02 13:28

ockeghem

総合スコア11701

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

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

退会済みユーザー

退会済みユーザー

2018/01/02 13:40

トークンチェックが null===null 以下略 EC-CUBE 2.13.x のことをわるくいってはいけない
guest

0

経験が浅く何をやって良いのかわかりません。

この状態で、個人情報を扱ってはいけません。
経験のあるメンバーと協業できるように調整すべきです。

また、CSRF対策は、token の作り方がキモです。
脆弱性の有無に関しての判断は、token の生成方法をみなければ判断できません。

ちなみに、セキュリティ対策を考える人は$_POST['token'] === $_SESSION['token']なんてコードは書かないです。エラー抑止を行っているとしても、ちゃんと notice を出さないコードとなるように記述すべきです。

投稿2018/01/02 12:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

がると申します。

セキュリティについて「徹底的にセキュリティ対策したい」の指針は、なかなかに難しいものがあるか、と思うのですが。
逆側の切り口として「これを怠ると、業務として請け負っているプロとしては非常にまずい」かどうか、の指針が、いくつかあるかと思います。

手っ取り早く端的、かつ、いくつか判例にも出ているものとしては。
IPAさんの 安全なウェブサイトの作り方 を読んでみると、ある程度包括的に「最低限」についてはチェックできるのではないか、と思いますが如何でしょうか。

チェックリストなどもあるので、一段階目の指針としては、非常に使いやすいと思います。

以上、何かの参考にでもなれば幸いです。

投稿2018/01/04 08:58

gallu

総合スコア506

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

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

0

実際のところ、リクエスト偽造による自動処理を弾くには、ログイン画面にもCSRF対策を施すべきだろうと思います。
本物そっくりのログイン画面を用意され、結果的に偽のログインリクエストを送られた場合、CSRF対策をしていなければ、不正ログインを弾くことができません。トップ画面にフォームがある場合、トークンを抜かれ、CSRF対策が無効化された状態で次のリクエストが送られることも考えられます。

もちろんこの場合、すでにユーザIDとパスワードを抜かれていますから、正規ルートで別途不正アクセスはできてしまうわけですけど、それについてはIPやユーザエージェントなどの判定で、メールなどでユーザに警告することもできます。

また、ログイン直後の画面にいきなり個人情報一覧が表示されるなら、上記理由からも個人情報漏洩しやすいおいしいシステムです。もしそうなら、システムデザインも見なおしたほうが良いかもしれません。

投稿2018/01/02 14:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問