[入門]PHPでセキュリティ対策を実施する。
こんにちは、はるまきです。今回は「自作Webサービス解説シリーズ」です。今回で第6回目! 自作Webサービスのアクアリウム専門の質問サイト→ Q&Aquarium
このシリーズでは、初学者の僕が学んだことや、ハマったポイントなどを紹介しています。間違っている箇所があればご指摘お願いします。※あくまで僕(はるまき)流の解釈をもとに作成しています。
今回はPHPで実施できるセキュリティ対策を紹介します。
なぜセキュリティ対策が必要なのか?
言わずもがな! 悪〜い人たちがいるからですね。Webサービスを運用するとユーザーの個人情報など、様々なデータが蓄積していきます。それらが流出したら、それはそれは恐ろしいことが起こってしまうわけです。
セキュリティ対策はきちんとしよう!!
簡単に実施できるPHPのセキュリティ対策
PHPが言語レベルで用意してくれているセキュティ対策があります。それらを紹介します。
暗号化を実施するmd5
有名でしょうか?受けた文字列をハッシュ値を使って暗号化します。
通常、データベースにパスワードを保管する場合、オリジナルの文字列のまま保存しません。例えば、harumakiABCというパスワードがあったとしても、データベースには"harumakiABC"ではなく、それを暗号化した"kanAs4e3fA3FEaoyp1tyq"みたいなランダムな文字列として、保管されているわけですね。
新卒の時、研修の講師の方に、はるまきは質問を受けました。「データベースの中にパスワードは保存されていますか?いませんか?はい、はるまき君」「ファッ!!? 当然保存されてるに決まってるやろ、それ以外にどこに保存すんねん」「ぶぶー!!ひっかかりましたね〜〜〜🌝」みたいなやりとりがありました。笑
んで、その暗号化する時の値があるわけですね。それがハッシュ値っていうやつです。逆算が難しいアルゴリズムで作られているようです。今回紹介したmd5もそのうちのひとつです。 実際の使い方は以下!
$hogePassword = md5($hogePassword);
これだけです。md5というメソッドに文字列を入れれば、戻り値としてハッシュ化された文字列が返ってきます。これをDBに保存します。次にそのユーザーがログインする時には、フォームに入力された値をmd5化した時の文字列と、DB内のハッシュ化された文字列が同じであれば、ログインOK!みたいな感じです。
htmlspecialcharsでSQLインジェクション対策の一助へ
SQLインジェクションとは、簡単に言えば、入力フォームにSQLを入力してサーバーに送りつけて、データの改竄や削除をおこう攻撃手法です。こちらを参考に。
それを防ぐ為の方法の1つがhtmlspecialcharsでございます。これは「意味のある文字列」を「意味のない文字列に変換する」機能を持っています。
イメージがつきにくいですよね。例えば、あるサイトでフォームに入力されたID番号のユーザー情報を示す機能があったとします。サーバーでは、PHPで以下のような、値を受け取ってそれをそのままSQL文として処理するコードがあったとします。
$sql = "select * from sample where id = '{$input}'"
この時に、悪い人が、このフォームに
1′ or '1’ = '1’;–
と入力すると、結果的にサーバーの中では、
SELECT id,password FROM users WHERE id='1' or '1' = '1'-- AND password='$password';
こんな感じになります。最後の"–“はコメントアウトを意味してます。注目するべきは
or '1’ = '1’;
ですね。これはTrueを意味してしまい、結果、全てのレコードを返してしまいます。
ここでhtmlspecialcharsが 登場。意味を持つ記号をエスケープしてただの文字列路して扱うようにする。使い方は簡単。
$hogeId = htmlspecialchars($hogeId);
これで、意味のある悪いSQLが送られてきても対応の一助になる。ただこれだけでは不足なので他の書籍やサイトを参考にしていただきたい。
最後に
セキュリティ対策は大切だから必ず実施しないといけないが、奥がかなり深いです。基本的には自分でセキュリティを構築するよりも、言語やフレームワーク が準備してくれているものを使うのが賢明と思います。
そもそも、悪いことしないでほしい!!涙 このやろー!!
今回は以上です。 自作Webサービスのアクアリウム専門の質問サイト → Q&Aquarium
このシリーズでは、初学者の僕が学んだことや、ハマったポイントなどを紹介しています。間違っている箇所があればご指摘お願いします。※あくまで僕(はるまき)流の解釈をもとに作成しています。 次回もお楽しみに〜。