・フォームの入力値にサニタイジングしたいけど、やり方がわからない。
・htmlspecialchars関数の使い方を知りたい!
PHPのフォーム処理では、セキュリティ対策としてサニタイズと呼ばれる特殊文字変換を行いますが、やり方がわからない人も多いでしょう。
そこでこの記事では、PHPで入力値のサニタイジングをする方法について解説していきます!
この記事を読めば、サニタイジングの意味やhtmlspecialchars関数の使い方がわかり、正しくサニタイジングすることができるでしょう。
PHPでサニタイジングについてよくわからない、htmlspecialchars関数の使い方を知りたいという人は、ぜひ最後までご覧ください。
目次
サニタイジングとは?
サニタイジングとは、HTMLコードにある特殊文字を別の文字列に変換することです。
この「サニタイジング(サニタイズ)」は、本来「消毒する」という意味がありますが、プログラミングでは入力値などを無害化するという意味で使われています。
例えば、サニタイジングは上記のように「<」や「>」などの記号を、「<」や「>」などに変換することができます。
HTMLコードをそのままブラウザに表示しようとすると、HTMLコードとして認識されますが、特殊な文字を別の文字列に変換することで、ブラウザにHTMLコードとしてではなく、ただの文字列として表示されるようになります。
サニタイジングについて、もう少し詳しく知りたい人は、以下の記事をご覧ください。
プログラミング初心者向け「サニタイズ・サニタイジング」まとめサニタイズしなかった場合の危険性
もし、このサニタイジングをしなかった場合、どのような危険性があるのでしょうか?
入力フォームを実装した場合を例に、考えてみましょう。
上記のように、入力フォームがあったとします。
そこに、例のようなJavaScriptのコードを入力して、送信ボタンを押してみましょう。
すると、ブラウザには、以下のようなポップアップが表示されました。
本来であれば、入力フォームには名前やメールアドレスなどの個人情報を記述します。
しかし、入力値にサニタイジングしなかった場合、このような悪意のあるスクリプトタグが埋め込まれ、意図しない動作を引き起こしてしまう可能性があるのです。
今回は、ポップアップを表示するためのスクリプトタグを埋め込みましたが、別ページに遷移してしまうようなスクリプトタグを埋め込まれる場合もあります。
このようなサイトの脆弱性を悪用した攻撃はXSS(クロスサイトスクリプティング)と呼ばれ、個人情報を悪用されてしまう非常に危険な攻撃です。
XSSの攻撃に遭わないためにも、PHPのフォーム処理ではサニタイジングが必要となるのです。
フォームの入力値にサニタイジングする方法
では、ここからはPHPでフォームの入力値にサニタイジングする方法について解説していきます。
このサニタイジングはセキュリティ対策として重要な処理なので、しっかりと理解していきましょう。
htmlspecialchars関数
フォームの入力値でサニタイジングするには、htmlspecialcharsという関数を使うことで、実装できます。
変換前 | 変換後 |
---|---|
「&」アンパサンド | & |
「’’」シングルクォーテーション | "e; |
「””」ダブルクォーテーション | ' |
「<」小なり | < |
「>」大なり | > |
htmlspecialchars関数を使うと、上記のような記号を文字列に変換することができます。
1 |
htmlspecialchars($string, $flags, $encoding, $double_encode) |
htmlspecialchars関数は、第1引数にサニタイジングしたい文字列を指定することで、特殊な文字を別の文字列に変換してくれます。
第2引数から第4引数はオプションですが、第2引数のフラグは「ENT_QUOTES」を指定しておくといいでしょう。
この「ENT_QUOTES」はシングルクォーテーションとダブルクォーテーションの両方を変換してくれるフラグです。
htmlspecialchars関数の使い方
では、実際にhtmlspecialchars関数を使って、入力値にサニタイジングを行ってみましょう。
「index.php」という名前のPHPファイルを作成します。
コードの書き方は次の通り。
■index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!DOCTYPE html> <html lang="ja" dir="ltr"> <head> <meta charset="utf-8"> <title>サンプルページ</title> </head> <body> <form action="index.php" method="post"> <input type="text" name="message"> <input type="submit" value="送信"> </form> <?php echo htmlspecialchars($_POST['message'], ENT_QUOTES); ?> </body> </html> |
※データの送信先は同じファイル内にします。(formのaction属性にこのファイルの名前「index.php」を指定しておきます)
テキストを入力するinputタグがあるだけのシンプルな入力フォームです。(inputタグのname属性は「message」としています)
この入力値を受け取る際に、悪意のあるスクリプトタグが埋め込まれないようサニタイジングしていきます。
今回のフォームでは、formのmethod属性を「post」にしているので、入力したデータを受け取るには、$_POST[’message’]となります。
htmlspecialchars関数の第1引数に、この$_POST[‘message’]を指定し、第2引数に「ENT_QUOTES」を指定しましょう。
結果がどのようになるのか確認するために、echoを使って出力してみます。
入力欄に一度スクリプトタグを入力して、送信ボタンを押すと次のような結果になるでしょう。
入力値にサニタイジングをしたことで、スクリプトタグはただの文字列に変換されて表示されました。
よって、htmlspecialchars関数を使ったサニタイジングは、うまく実装できているということですね。
このように、サニタイジングすることで、XSS(クロスサイトスクリプティング)のような悪意のある攻撃を防ぐことができます。
PHPのフォーム処理では、重要なセキュリティ対策になるので、しっかり覚えておきましょう。
XSS(クロスサイトスクリプティング)について、さらに詳しく知りたい人は、以下の記事をご覧ください。
HTMLのサニタイズとは?XSSを防ぐための実装方法を解説まとめ
今回は、PHPのサニタイジングについて解説しました。
PHPのフォーム処理では、悪意のある攻撃を防ぐために、サニタイジングを行う必要があります。
サニタイジングは、htmlspecialchars関数を使って特殊文字を変換することが可能です。
使い方を覚えて、正しくセキュリティ対策を行えるようになりましょう。
この記事がPHPの学習に役立つと幸いです。