質問: 現在,練習用にログイン型掲示板の制作を模索しています.その中で,Webアプリケーションのセキュリティ知識が不足しているため,いくつかご教授いただければ幸いです. ログイン型掲示板として,PHP, phpMyAdmin, MySQLを用いたWebアプリケーション,並行してAPIを作成し,AndroidやiOSのクライアントアプリケーションからリクエストを送信可能にしようと考えております.ユーザをログインに用いるID, Passwordで管理し,送信者が,受信者(複数可)を設定できるようにします.SSLなしのHTTP通信を考えています. 1. 一時キーを発行してのメールアドレス認証は安全か. 2. POSTリクエストによるユーザ認証は安全か,もっと強固な認証方法はあるか. 3. クライアント,サーバ両サイドでのハッシュ処理は妥当か. 4. POSTリクエストによる個人情報を含むデータ送信は妥当か. 5. URL引数による個人情報を含まないデータ送信は妥当か. 6. HTTPS通信の優位性は何か. の6点について,教えていただきたいです.1点でも知識をお貸しください. 以下,現在の設計を記載します. 現在考えているデータテーブルはこのような形です. ``` -- メッセージ保管テーブル 第3正規形 CREATE TABLE massages ( message_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, sender_user_id BIGINT UNSIGNED NOT NULL, message_body LONGTEXT NOT NULL, sending_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP); -- 受信者特定テーブル 第4正規形 CREATE TABLE receivers ( message_id BIGINT UNSIGNED, receiver_user_id BIGINT UNSIGNED NOT NULL receiving_time DATETIME); -- ユーザ情報テーブル 第3正規形 CREATE TABLE user_info ( user_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, user_name TINYTEXT NOT NULL, user_mail_address TINYTEXT NOT NULL, user_password_hash INT UNSIGNED NOT NULL); -- 未認証ユーザ情報テーブル 第3正規形 CREATE TABLE user_info ( user_mail_address TINYTEXT PRIMARY KEY, user_one_time_key VARCHAR(8) UNSIGNED NOT NULL); ``` **1. 一時キーを発行してのメールアドレス認証は安全か.** signup.php では,利用者はメールアドレスをPOSTリクエストにて送信します. サーバサイドでは,一時認証キーを発行,POSTリクエストを読み取り,未認証ユーザ情報テーブルに登録します.登録後,メールアドレスに,登録用の一時認証キー(英数字8文字程度)を送信します. signup2.php では,利用者はメールアドレスと一時認証キー,パスワードをPOSTリクエストにて送信します.メールアドレスと一時認証キーは平文,パスワードは「ソルトを付与しつつ,複数回ハッシュ関数を通したもの」をPOSTリクエストによって送信します. サーバサイドでは,POSTリクエストを読み取り,未認証ユーザ情報テーブルに問い合わせ,検証が成功すれば,ユーザ情報テーブルに追加します. この一時キーによって情報漏えいにつながることは少なく,メールアドレスによる登録数制限が可能であると考えています.これよりも簡易な手法はあるのでしょうか.また,この手法の危険性はあるのでしょうか. **2. POSTリクエストによるユーザ認証は安全か,もっと強固な認証方法はあるか.** **3. クライアント,サーバ両サイドでのハッシュ処理は妥当か.** login.php では,利用者はメールアドレスとパスワードによって認証します. 認証は,平文のメールアドレスと,「パスワードにソルトを付与し,複数回ハッシュ関数を通したもの」をPOSTリクエストによって送信します. サーバサイドでは,POSTリクエストを読み取り,ハッシュ関数を通したパスワードに,更にソルトを付与し,ハッシュ関数を施します.このハッシュ値で,データベースに問い合わせてログイン処理とします. POSTリクエストに情報を乗せるのは,URL引数に比べ安全かと思います.しかし,これ以外の送信手法について詳しくないため,これよりも安全性に優れるものがあれば,教えてください. パスワードのハッシュ化は,クライアントのみで行うと,容易に偽装可能である.サーバサイドのみで行うと,クライアントはパスワードをPOSTリクエストに平文で乗せなければならない.という問題があると思いますが,実際はどのように対処しているのでしょうか.POSTリクエストに平文を乗せても良いのでしょうか.実際,POSTリクエストは第三者からどこまで読めるのでしょうか. **4. POSTリクエストによる個人情報を含むデータ送信は妥当か.** insert.php では,利用者はコメントを送信します. コメントは,massagesテーブルのうち,receiving_timeを除くすべての要素を含むPOSTリクエストによって送信します. サーバサイドでは,POSTリクエストを読み取り,整合性の確認(ユーザの存在確認,本文の内容確認),HTMLパース可能な文字列のエスケープを行い,SQLインジェクション対策を行ってinsert文を実行します. 個人情報を含まないのであれば,POSTリクエストに平文が乗っていても大丈夫であると思っています.メッセージ本文には,個人情報を特定できる文が含まれる可能性がありますが,POSTリクエストを用いるべきではないのでしょうか. **5. URL引数による個人情報を含まないデータ送信は妥当か.** massages.php では,利用者はコメントを見ることができます. コメントは,receiversテーブルから,自分自身を含むmessage_idによって,messageをselectして出力します.URL引数による検索を備えます.例) massages.php&senderid=23 個人情報を含まないので,GETリクエストに平文を乗せようと考えております. -- 依頼により追加 -- **6. HTTPS通信の優位性は何か.** 現在,すべての通信をSSLなしのHTTP通信で行うことを考えております. しかし,SSLなしのHTTP通信は、設定によりGET/POSTリクエストの中身が見えてしまう場合があるとお聞きしました.POSTリクエストはhidden属性によって,第三者から隠すことができる認識でおりましたが,この通りではない状況があるのでしょうか. また,SSLは,ブラウザとサーバ間の通信を暗号化し,その間の通信を盗み見ることを難しくする認識でおりました.これは,GET/POSTリクエストに対してどの程度効果があるのでしょうか.また,SSL+POST(hidden)ならば,その通信は秘匿されると考えてよいのでしょうか. -- -- の6点について,1点でもいいので,教えていただければ幸いです.どうぞよろしくお願いします.
回答: > > 6. HTTPS通信の優位性は何か. > > > SSL/TLS解説 HTTPSによる通信は、途中経路の暗号化、改竄からの保護、及び受信者が成りすましを行っていないことが保証されます。(所謂オレオレ証明書ではDNSポイゾニングやhostsの書き換えによる通信先の錯誤に対して無力) (ただし、これはアルゴリズムやCPUの性能の進化によって陳腐化する可能性はあります。) それに対してHTTPによる通信は全て平文で送信されるため、途中経路のあらゆる地点で盗聴が可能です。 暗号化されていない/wep等の脆弱な暗号化通信の無線LANの場合はその電波を受信できる人全員、 内部ルータの管理者、スイッチングハブの管理者、内部プロキシサーバの管理者、プロバイダの管理者、相手先サーバのルータ管理者、サーバ管理者、その他あらゆる箇所でです。 hidden属性は単純に「ブラウザがレンダリングする時に表示しない属性」であって、安全性とは一切関係ありません。