>2011-04-14■パスワードと個人情報を扱うサービスを作る際に気をつけたことHTMLはわかるけど、サーバーサイドはお遊びでphpを触ったぐらいだったので、会員制でデータをためこむサイト作りに初めて挑戦した。今回重視したのは、「いかに個人情報をお漏らししないようにして、万が一漏らしても被害を少なくするか」ということ。世の中、有償サービスでもパスワードを平文で保存してるサービスが意外と多いらしいので、流出した時のリスクを少しでも減らせる対策として書きます。今回のシステム構成サーバー:ロケットネットのキャンペーンにでレンタルサーバ年1000円ポッキリプランクライアント側の処理:HTML+CSS+jQuery(とプラグインもろもろ)サーバ側の処理:PHPWebサーバー:Apacheデータベース:MySQL個人情報こわい!個人情報ビビる。漏洩とかまじ困るし怒られるしこわい。俺も巻き込まれたところでは、サミータウンがメールアドレスとパスワードセットでお漏らししてお詫びに1ヶ月無料なにそれこわい。共通化してメアドとパスワードをどこかのサービスが一箇所でも漏らすと、ヤフオクID乗っ取り事件みたいなことになる。http://internet.watch.impress.co.jp/cda/news/2008/09/26/20967.html俺だってできれば人様のメールアドレスとパスワードとか預かりたくない。万が一、肉親のメールドレスを発見してパスワードにrapemeとか入ってたら明日からどういう顔すればいいかわからない。ググってみてもどこにも情報のってない。ダメもとで「個人情報ってどうやって保存したらいいんだろう。」って、twitterでつぶやいたら、「住所とかは可逆暗号化でいいけど、パスワードはハッシュで不可逆化しないとだめだよ!」と、呪文のようなありがたい言葉を教えてもらった。・可逆暗号=元のデータに戻せる暗号化方式。・ハッシュ=ハッシュ値を使った、元のデータに戻せない暗号化方式うーん。電話番号とか住所は、第三者が使用する情報なので、可逆が必要。パスワードは、認証にしか使わないので、ハッシュ値の結果が一致すれば元のデータがわからなくてもOK、という方式なのでこういった暗号の使い分けをする。暗号化キーは開発者が指定する。→(ハッシュ値抽出)→!"$#'$#="※二つのハッシュ値が合っていれば、パスワード一致として認証する。可逆暗号(電話番号とか住所とかに適用)今回はMySQLの関数で実現した。encode関数で暗号化して、decode関数でもとに戻す。テーブル名;これで、データベース格納時は暗号化(バイナリ化)されて、データベースから取り出してHTML表示する時に復号化はされる。ハッシュ(パスワードとかに適用)今回はphpのhash関数で実現した。<ユーザ登録時>$password=(フォームから取得)$hash=hash('sha512',$password)//ユーザ登録時は、ここで生成した$hashをデータベースにぶっこむ。ユーザ認証時は、入力されたパスワードと、データベースのパスワードが一致するかチェック。'ログインしますよ!';//ここにログイン処理を書くelsedie('メアドとパスワードがあってないよ!');これでもしSQLインジェクションとかでデータが流出しても、ハッシュ暗号のパスワードに関してはまず解析されないはず。可逆暗号のデータもphp側の暗号化キーが盗まれない限りバレない。「個人情報」とは、生存する個人に関する情報であって、当該情報に含まれる氏名、生年月日その他の記述等により特定の個人を識別することができるもの(他の情報と容易に照合することができ、それにより特定の個人を識別することができることとなるものを含む。http://ja.wikisource.org/wiki/%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E8%AD%B7%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%B3%95%E5%BE%8B#2これで、もし漏れても、俺、ウンコ漏らして臭いけど、パンツから出てないからいいよね?というレベルにはなった。お漏らさないようにキツくする万が一漏れても大丈夫!と書いたけど、そもそも漏らすなというお話になる。調べた結果、以下の対策をほどこした。・当初jQuery側でSQL組み立ててPHPに渡してたので、これだと任意のSQLが実行できて漏らし放題なのでやめる。・GETとかPOSTでDBに渡すパラメータを扱ってる場合、ちゃんとエスケープする。1=1で、誰でもログイン出来ちゃう!ので、mysql_real_escape_stringでエスケープしたり、渡されたパラメータが想定した値かどうか(例えば数値かどうか、とか)のチェックをいれたりする。クロスサイトスクリプティング・保存するデータにタグやJavascriptを埋め込まれないように、保存されたデータを出力する場合はPHP側でhtmlspecialchars関数使ってエスケープするようにする。こんな感じでお漏らし対策をした。間違いがあったら教えて欲しい。ちなみに出来上がったサイトはこれ。