🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

セキュリティー

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

PHP

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

Q&A

解決済

3回答

2665閲覧

レンタルサーバでクレカ情報を保存すると仮定した場合のセキュリティ対策

ikeyu.tp

総合スコア6

MySQL

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

セキュリティー

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

PHP

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

0グッド

5クリップ

投稿2021/03/27 03:33

編集2021/03/29 01:45

前提・実現したいこと

独学でプログラミングを勉強しています。
今回はクレカ情報を扱うシステムを想定して作成しているのですが,クレカ情報の適切な保存方法のところで躓いてしまいました。
クレカ情報などの個人情報を保存する方法について考えてみたので問題があるところ,改善できるところをご教授いただきたいです。
よろしくお願いします。

###環境
製作はXamppでのApache,mysql,php7.4ですが,
仮想として,レンタルサーバ(XserverやCoreServer,さくらサーバ等)でのLet's Encryptでの運用を前提として考えて頂けると嬉しいです。

###準備ファイル
password.jsonは100個ほど適当に作成します。(16文字)
password.jsonは非公開ディレクトリ(public_htmlよりも上のディレクトリ)に保存。

json

1{ 2 1:"password1", 3 2:"password2", 4567 100:"password100" 8}

以下のようにphp側でデータを暗号化し,暗号化したデータとベクトルデータ,パスワードのidをデータベースに保存しようと思います。
勿論,情報を取得する場合はphpで複合化します。

php

1if(isset($_POST['card_number'])//カード番号 2 && is_int($_POST['card_number'])//カード番号が数字かのチェック 3 && str_length((int)$_POST['card_number'])==16//カード番号の桁数確認 4 && isset($_POST['card_expire'])//有効期限 5 && isset($_POST['security_code'])//3桁のセキュリティコード 6 && is_int($_POST['security_code'])//3桁のセキュリティコードが数字かのチェック 7 && str_length((int)$_POST['security_code'])==3//セキュリティコードの桁数確認 8){//POST内容の不足等チェック 9$pwd_number=1;//1-100をランダムに取得 10$password=$password[$pwd_number];//password.jsonからパスワードを取得(割愛) 11$method='AES-256-CBC';//より良い暗号化方式はなんでしょう? 12$iv_length = openssl_cipher_iv_length($method); 13$iv=openssl_random_pseudo_bytes($iv_length); 14$encrypted = openssl_encrypt($text, $method, $password, 0, $iv); 15$iv = bin2hex($iv); 16$stmt=$pdo->prepare("INSERT INTO card_info (card_number,cn_iv,pwd_number) VALUES(?,?,?)"); 17$stmt->execute(array($encrypted,$iv,$pwd_number)); 18}

この方法では,個人情報を扱うには脆弱でしょうか?
ベクトルデータもパスワードと同じように別ファイルで作成しておき,idと紐づけの方法もあるかと思います。
###質問したいこと
0. 上記の方法でのセキュリティレベル(十分,不十分など,理由も教えて頂きたい)
0. 上記の方法での脆弱性(どの部分がセキュリティホールに繋がるのか,改善方法など)
0. 実際に運用されている個人情報保存方法など

以上,よろしくお願いします。

#お礼
沢山のご回答ありがとうございました。
まだまだ自分の勉強不足だと感じましたのでこれからも勉強頑張ってまいります。
普段からセキュリティ関係のことでEGセキュアソリューションズ様のサイトを確認させていただいておりますし,ご丁寧な回答でしたのでockeghem様をベストアンサーに選ばさせていただきました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/03/27 03:53 編集

直接の回答ではないのでここに書きますが・・・ 内部からの漏洩などで「暗号化の方式とか暗号化キーなど 100% 情報がばれているというケースもあるかもしれない」と想定して対策を考えるのが重要ではないでしょうか。以下の記事はパスワードの話がメインですが参考になるかもしれません。 本当は怖いパスワードの話 https://www.atmarkit.co.jp/ait/articles/1110/06/news154.html
dodox86

2021/03/27 04:57

クレジットカード情報を自分のサーバー上に保存しておくことの「是非」を含む質問は、teratailでも過去にも何回かありました。大抵、「問題外なので置くな(≒自分で管理するな)と言う結果に落ち着きますが。トップページから「クレジットカード」で検索してみてください。
guest

回答3

0

ベストアンサー

クレジットカードを取り扱う業者は2018年6月1日施行の改正割賦販売法に従う必要があります。

第三十五条の十六 クレジットカード番号等取扱業者は、経済産業省令で定める基準に従い、その取り扱うクレジットカード番号等の漏えい、滅失又は毀損の防止その他のクレジットカード番号等の適切な管理のために必要な措置を講じなければならない。
割賦販売法 | e-gov より引用

この「経済産業省令」は以下のように、クレジット取引セキュリティ協議会の定める「実行計画」が実務上のガイドラインとして位置づけられています。

クレジット取引セキュリティ協議会の「実行計画」は、割賦販売法に規定するセキュリティ対策の実務上の指針と位置付けられており、「実行計画」に掲げる措置又はそれと同等以上の措置を講じている場合には、セキュリティ対策に係る法的基準を満たしていると認められます。

クレジットカード取引におけるセキュリティ対策の強化に向けた実行計画2018(「実行計画2018」)を取りまとめました~国際水準のクレジットカード決済環境の整備を進めます~(METI/経済産業省) より引用

そして、実行計画では、以下のようになっていて…

本協議会は、加盟店におけるカード情報保護のための第一の対策として非保持化を基本とした取組を推進する。
非保持化は PCI DSS 準拠とイコールではないものの、カード情報保護という観点では同等の効果があるものと認められるため、実行計画においては、PCI DSS 準拠に並ぶ措置として整理する。
クレジットカード取引におけるセキュリティ対策の強化に向けた実行計画-2019-【公表版】 より引用

つまるところ、以下のいずれかを満たす必要があります。

  • PCI DSS認証取得
  • クレジットカードの非保持化

ご質問の要件はカード情報を保存したいということですが、上記のようにPCI DSSの認証を受けなければカード情報は保存できないことになりますので、レンタルサーバーで稼働するサイトがPCI DSSの認証を受けられるかが問題になります。
かつては、「PCI DSS対応レンタルサーバー」なるものが提供されていたようです(アーカイブ)が、現在は提供停止となっています。それに、アーカイブを見るとわかるように、「カード情報はお取り扱いできません」と注記されています。なので、

  • レンタルサーバーを前提とすると、クレジットカード情報を保存することは法律の要件を満たせない

ということになりそうです。

以上は法律的な要件になり、これで終わりにしてもよいのですが、技術的な要件について検討してみます。

カード情報を保存する場合暗号化しなければならないことは、PCI DSSでも要求されていますが、そもそもなぜ暗号化しなければならないか理解されていますか? それは、仮にサーバーに侵入されても極力カード情報が漏洩しにくくするためです。サーバーに侵入されない前提では、暗号化は役に立たない(管理者の悪意は例外)わけです。カード情報漏洩の手口については以下の動画をご覧ください。

ウェブサイトに侵入されている前提では、提示されているコードはかなり無力といえます。なぜなら、パスワードが侵入者に見える可能性が高いからです。その他技術的なツッコミは何点かあるのですが、そろそろ力尽きてきたので、まとめますと、

  • クレジットカード情報を「保存」するには法律の要求によりPCI DSS認証取得を受ける必要がある
  • レンタルサーバーを前提とするとPCI DSS認証を受けるのは無理
  • 提示されたコードだと、侵入者に暗号化のパスワード(鍵)が盗まれる可能性が高く効果を期待できない

ということになります。

投稿2021/03/27 05:31

編集2021/03/27 09:35
ockeghem

総合スコア11705

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

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

ockeghem

2021/03/27 09:36

ありがとうございます。httpは無効化されたようで、条文にダイレクトにリンクするように 修正しました。
guest

0

何もかも全部間違い。
暗号化しようがなんだろうとクレジットカード情報は自分では一切扱わないのが正解。

フォームから送信させてる時点でアウト。

投稿2021/03/27 03:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

今回はクレカ情報を扱うシステムを想定して作成しているのですが,クレカ情報の適切な保存方法のところで躓いてしまいました。

決済系サービスの具体的な仕様とPCIDSSについて調べてみることをお勧めします。
生のカード情報を受け取ること自体が大きなリスクとなるので、非通過・非保持を維持できるサービスを使うのが現実的かと思いますよ。

検索ワードとしてはクレジットカード 決済代行 非通過あたりでしょうか。

投稿2021/03/27 03:51

編集2021/03/27 05:25
tanat

総合スコア18727

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

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

退会済みユーザー

退会済みユーザー

2021/03/27 04:27

レンタルサーバってのがなかなかなチョイスですね^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問