PHPでWebサイトを作るなら、セキュリティに関する4つのリスクと対策が必要になります。
「セキュリティってよくわからないなぁ。」
40歳でプログラミングを学びはじめた私は、こんなふうに感じていました。
ただ、自分が作ったサイトで情報漏洩が起きてしまったとしたら…
こわいですよね。フリーランスなら、もう依頼がこなくなる可能性もあります。
そんなことにならないよう、PHPプログラマを目指すなら、初心者でも知っておくべき3つのリスクと対策を紹介しますね。
PHP学習者がwebサイトのセキュリティで知っておくべき4つのリスク
Web系で知っておくべき4つのリスクと、PHPでプログラミングを行う際の対策を説明します。
クロスサイトリクエストフォージェリ(CSRF)
最初に紹介するのはクロスサイトリクエストフォージェリ。
舌を噛みそうな名前ですが、もっと短く、シーサーフ(CSRF)やXSRFとも呼ばれます。
ユーザーがログインしている状態のときに行われる詐欺です。
たとえば、次のような被害が起こります。
クロスサイトリクエストフォージェリ例
①ユーザーが掲示板などにログインしている状態。
②悪意あるサイト「お金持ちになれる」を訪問。
実はこのサイトには、ユーザーの名前で投稿をしたり、商品を購入する仕組みが施されている。
③「お金持ちになれる」サイトから、ユーザーの掲示板のログイン情報を使って、勝手に投稿を行われる。
④ユーザーは周囲から言われて初めて、自分の名前で掲示板におかしな投稿がされたことに気づく。
クロスサイトリクエストフォージェリ(CSRF)対策
CSRFを避けるには、ワンタイムトークンを設定するという対策が一般的。
トークンがあれば、先ほどの例だと、次のようになります。
①掲示板サイトは、ユーザーにトークンを発行する。
②ユーザーは掲示板サイトで投稿するときにもトークンが発行される。
掲示板サイトは、ユーザーが既にもっているトークンと、投稿時のトークンがあっているか照合する。
あっていれば、ユーザーは投稿ができる。
③トークンがないユーザーが投稿しようとしても、投稿できない。
こういった仕組みです。
このトークンの仕組みは、会員制サイトのコードに埋め込む必要があります。
こちらの【掲示板の作り方】を紹介する記事でコードを紹介しているので、気になったら見てみてください。
公式マニュアルではこちら。
PHPフレームワーク Laravelなら、CSRF対策がしやすい
トークン発行の仕組みを作るのは、面倒です。
それに正しく設定できているのか、不安も残ります。
PHPのフレームワーク、Laravel(ララベル)を使えば、CSRF対策が行いやすくなります。
フォーム内に@csrfと入力するだけでOK。
こちらがララベルで作成したフォームをブラウザで表示させたもの。
これだけみると、CSRF対策がなされているかよくわかりません。
ですがソースコードをみると、トークンがちゃんと入っていることが分かります。
Laravelについて、もっと知りたい方はこちらをお読みください。
クロス サイト スクリプティング(XSS Cross-Site Scripting)
次に紹介する詐欺は、クロスサイトスクリプティング。
お問い合わせフォームなどにJavaScriptで悪意あるコードをしこむという方法。
具体的には、こんなことが起こります。
クロスサイトスクリプティング例
①悪意あるユーザーが、A社のフォームを攻撃しようとします。入力フォームの中にJavaScriptのコードを埋め込みます。
②A社のフォームに訪れた普通のユーザーは、メールアドレスやパスワードなど個人情報を入力します。
ですが、これらの情報は、あらかじめ仕込まれたコードにより、悪意あるユーザーのサイトに転送されます。
③こうしてA社サイトにフォームを入力したユーザーの個人情報が悪用されてしまいます。
この詐欺は、A社の本物のサイトと偽物のサイト、ふたつのサイトを使って悪事を働くことから、「クロスサイト」と呼ばれています。
クロス サイト スクリプティング対策
対策としては、フォームに入力されるJavaScriptのコードを無効にする方法が考えられます。
プログラミングのコードの特徴は下記のとおり。
つまり、こういった部分をコードではなく、ただの文字列として扱うようにすればOK。
PHPのコードでこれを行うには、フォーム内でhtmlspecialchars関数を使います。
たとえば、こんなふうに入力します。
【通常のコード】
- echo $_POST[‘name’];
【htmlspecialcharsを付けたコード】
- echo htmlspecialchars($_POST[‘name’], ENT_QUOTES);
これによって、ユーザーがもしコードを入力しても、それはただの文字列になります。
ですがこれ、毎回入力するのは結構めんどうですよね。
省略する方法含め、こちらの記事に実際のプログラミングで使用している例を載せています。
PHPフレームワーク Laravelなら、カッコを付けるだけでOK
なお、【htmlspecialchars」も、先ほど紹介したLaravelなら波カッコ{{}}で変数を囲むだけでラクです。
★引用:Laravelマニュアル https://readouble.com/laravel/5.4/ja/blade.html
Laravelなどフレームワークを使うと、セキュリティ対策もあらかじめ準備されているので、対策しやすくなります。
クリックジャッキング
次に紹介する詐欺の手口は、クリックジャッキング。
これは、透明のボタンを通常のサイトにかぶせてしまう手法。
ハイジャックが飛行機を乗っ取るように、クリックボタンを乗っ取ってしまうのです。
悪意あるサイトでは、こんなことが起こります。
クリックジャッキング例
①ユーザーの画面上で、「おめでとうございます!当選しました!」というメッセージが表示されます。
②ユーザーが喜んで「賞品を受け取る」ボタンをクリック。
ただこれは、本当は「商品を購入する」ボタン。透明なので、ユーザーには見えないようになっています。
③ ユーザーら知らぬうちに高額なものを購入させられ、あとから代金を請求されることに。
これは悪意あるサイトでの例です。
ただ通常のサイトがのっとられて、詐欺ページがかぶせられてしまうこともあります。
クリックジャッキング対策
phpのプログラムコードを書く際、下記を入れておきましょう。
- header(‘X-FRAME-OPTIONS:DENY’);
これで、「このページには、他のページを重ねて表示できませんからね。」という意味。
インラインフレーム(iframe)上にページを表示させないようになります。
また、先ほど解説したクロスサイトスクリプティング対策(htmlspecialchars関数)が役立ちます。
SQLインジェクション
最後に紹介する詐欺の手口は、SQLインジェクション。
データベースを操作されてしまう詐欺です。
攻撃されると、お客様情報などが盗み取られるなど、大変な被害が起こります。
SQLインジェクション例
①A社のフォームなどからSQLとの接続部分のコードが攻撃され、悪いユーザーがデータベースを操作できるようになります。
②データベースを勝手に書き換えたり、データを盗み出したりします。
③盗み出されたお客様データが悪用され、A社は情報漏洩により信頼を失い、売上が激減。
SQLインジェクション対策
狙われるのはSQL文で、一気に命令を書いてしまうようなコード。
SQL文とは、データベースに対する命令文。
たとえば、こんなふうに書くと攻撃されてしまいます。
$_POST[‘name’] のあとにコードを埋め込まれたりする危険性があります。
そこでSQL文を書く際、プレースホルダを使って二段階にして書くと攻撃を回避できます。
たとえばデータベースに値を挿入するSQL文であれば、次のように記述します。
$変数名->prepare(‘INSERT INTO データベース名 SET 項目名1=?, 項目名2=?’)
$statement->execute(array(
このあとに、項目名をひとつずつ代入していきます。
こうしておくと、executeメソッドが項目をSQL命令に埋め込まないようにしてくれます。
もし項目の中にSQLの命令を書き込まれていても、実行されないように、適切にエスケープ処理(命令ではなくただの文字列をみなすようにする処理)をしてくれるのです。
実際のコードは、こちらのページに例があるので、気になったら見てみてください。
ただ、通常は教材などで安全な書き方を指導しているので、教わったとおりの方法を使っていれば大丈夫かと思います。
まとめ
今回はWebサイトに潜む4つのセキュリティリスクと対策を紹介しました。
- クロス サイト スクリプティング
- クリックジャッキング
- クロスサイトリクエストフォージェリ
- SQLインジェクション
ただ、いちからセキュアな環境を作っていくのは大変。
Laravelなどのフレームワークを使えば、セキュリティ面でも必要な対策が施されているので便利です。
Laravelについて興味があれば、こちらも読んでみてください。