ホーム > PHPセキュリティー > 4 エスケープ > 4-1 エスケープ処理 [PHPセキュリティー]
UPDATE:2017年08月09日

4-1 エスケープ処理 [PHPセキュリティー]

PHPセキュリティ
PHPセキュリティー エスケープ | wepicks!


エスケープとは

POINT

  • エスケープは出力先に合わせてデータを適切な形にすること

エスケープは非常に大切であり、セキュリティーの要となります。エスケープとは出力先であるリモートソースに合わせてデータの内容を適切な形にすることです。例えば、httpクライアント(ブラウザ)への出力時データベースへ送信時、など、PHPから別の場所にデータを送信する際には、そのデータを適切にエスケープ処理する必要がある。出力先で誤った解釈をさせるとアプリケーションに重大な脆弱性が発生する可能性があります。


出力エスケープの三段階

POINT 出力エスケープの三段階

  • 出力の識別
  • 出力のエスケープ
  • エスケープされたデータとそうでないデータの区別

最初に出力を識別する必要があります。どのデータをどこへ出力するのか識別しましょう。そして出力と識別されたデータを適切にエスケープ処理ます。最後に、エスケープしたデータとそうでないデータを区別して、混同しないようにしましょう。


出力の識別

POINT

  • 出力の識別
  • 主な出力先は、httpクライアント、URL、データベース

出力とは、PHP以外のリモートソースにデータを送信することです。主な出力先(リモートソース)は、httpクライアントURLデータベース、などです。

httpクライアント

httpクライアントへデータを出力する際は、

等を使用します。echo や print を使用して、httpクライアントへデータを出力していることになります。この場合、httpクライアントへデータを出力しているという識別が出来ます。

URLの場合

URLへデータを出力する場合は、


等を使用します。上記の場合はURLへデータが出力されるという識別が出来ます。

データベース

データベースの場合は、データベースへ送信するクエリのデータが出力データになります。MySQLの場合は、mysqli_query()でSQL文を送信する場合に識別できます。


出力のエスケープ

POINT

  • 出力のエスケープ
  • htmlentities() mysqli_real_escape_string() urlencode()

上記で示したように出力と識別されたデータは適切にエスケープする必要があります。出力のエスケープとは、出力先であるリモートソースに合わせてデータを適切な形に変更することです。

httpクライアント(ブラウザ)出力時のエスケープ
POINT

  • htmlentities()

httpクライアントへ送信するデータをエスケープする場合、PHPの関数 htmlentities() を使用しましょう。この関数でデータをエスケープすることで、htmlとして意味のある文字列が変換されて無効化されます。

※[ ]は省略可能

この関数を使用する場合、オプションの引数を2つ付けて、「引数様式」と「文字セット」を指定すると適切にエスケープできます。

引数様式は、ENT_QUOTES を指定してシングルクォートとダブルクォートも変換しましょう。文字セットは Content-Type に一致させましょう。

頻繁に出力する送信先の httpクライアント、データベース、URL などに対して、エスケープするための固有の関数がPHPで用意されています。

データベースエスケープ

POINT

  • mysqli_real_escape_string()

データベースへデータを送信する際のエスケープ関数は mysqli_real_escape_string()です。
この関数は以下の文字について先頭にバックスラッシュを付加し、データベースで意味のある文字列を無効化します。

URLのエスケープ

POINT

  • urlencode()
  • htmlentities()

この例は $string に対して2種類のエスケープを考慮する必要があります。
$string は、URLのクエリ文字列であると同時にHTMLのデータでもあります

下記のエスケープ処理が必要になります。


エスケープされたデータとそうでないデータの区別

POINT

  • エスケープされたデータとそうでないデータを区別する

エスケープされたデータを汚染リスクのない初期化した変数に代入してしっかりと区別しましょう。

初期化した変数へエスケープ後のデータを格納します。


タグ(=記事関連ワード)

日付

投稿日:2017年8月6日
最終更新日:2017年08月09日

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

https://wepicks.net/phpsecurity-escape/trackback/

page top