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

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

ただいまの
回答率

91.02%

  • PHP

    17738questions

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

  • MySQL

    5091questions

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

  • セキュリティー

    400questions

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

  • セッション

    90questions

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

  • CSRF

    41questions

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

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

受付中

回答 4

投稿

  • 評価
  • クリップ 6
  • VIEW 316

Zoohomi

score 8

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

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

流れとして


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の危険はないのでしょうか?

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+5

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 22:40

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

    キャンセル

+3

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

がると申します。

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17738questions

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

  • MySQL

    5091questions

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

  • セキュリティー

    400questions

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

  • セッション

    90questions

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

  • CSRF

    41questions

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