PHPのエスケープやエンコード関数

HTMLエスケープやURLエンコードハッシュ関数など、WEBアプリケーション作成においてよく使うPHPの関数をまとめた。

HTMLエスケープ

HTML中で使われる『&』や『<』、『>』などの記号を、『&amp;』や『&lt;』、『&gt;』などに書き換えるのがHTMLエスケープだ(元に戻すのはHTMLアンエスケープ)。HTMLエスケープを行わなければ、例えば<はタグの開始点とご認識されてしまうかもしれない。また、ユーザーが入力した内容をそのまま表示するようなアプリケーションでは、HTMLエスケープが行われていないと悪意あるHTMLタグやJavaScriptを埋め込まれる危険性がある。


HTMLエスケープ

<?php
htmlspecialchars('you & I > he & she');
// 結果: you &amp; I &gt; he &amp; she
?>


HTMLアンエスケープ

<?php
htmlspecialchars_decode('you &amp; I &gt; he &amp; she');
// 結果: you & I > he & she
?>


"や'のエスケープに関する設定や、より多くの文字をエスケープするhtmlentities()に関しては下記のマニュアルやリンク先を参照。変換テーブルはget_html_translation_table()で取得することができる。

htmlspecialchars()
htmlspecialchars_decode()
htmlentities()
html_entity_decode()
get_html_translation_table()
HTMLエンティティ

URLエンコード

URLエンコードをよく使うのはGETでパラメータを送る場合だ。URLに使える文字は決められているので、それ以外の文字を使う場合は『茶』→『%E8%8C%B6』のようにエンコードしなければならない(元に戻すのはURLデコード)。


URLエンコード

<?php
urlencode('私はMaryです。');
// 結果: %E7%A7%81%E3%81%AFMary%E3%81%A7%E3%81%99%E3%80%82
?>


URLデコード

<?php
urldecode('%E7%A7%81%E3%81%AFMary%E3%81%A7%E3%81%99%E3%80%82');
// 結果: 私はMaryです。
?>


これらの関数のマニュアルは↓。

urlencode()
urldecode()

ハッシュ関数MD5SHA-1

ハッシュは与えられたデータから別のデータへの一方向(つまり、エンコードエスケープと違い元に戻すことができない)の変換だ。例えば、『神はサイコロを振らない』→『5544aab3533a4dd52850659e54df490316837fdd』のようになる。ハッシュは、「パスワードをDBにそのまま格納するのを避けたい」というようなときによく使われる。DBにはハッシュ値を格納しておき、入力されたパスワードのハッシュ値を計算して比較すれば良い。

よく使われるハッシュのアルゴリズムMD5SHA-1だが、MD5は安全性の問題が指摘されているので、より安全なSHA-1を使った方が良い


MD5(※MD5を使わずにSHA-1を使うべき)

<?php
md5('神はサイコロを振らない');
// 結果: 876bc50991c9adfe738fe1bb62c1c086
?>


SHA-1

<?php
sha1('神はサイコロを振らない');
// 結果: 5544aab3533a4dd52850659e54df490316837fdd
?>


これらの関数のマニュアルは次のリンクを参照。また、ハッシュの衝突耐性についての解説へのリンクも併せて記しておく。

md5()
sha1()
ハッシュの衝突耐性について

SQLエスケープ

SQLインジェクションを防ぐために、よくaddslashes()やpg_escape_string()などを使う方法が紹介されているが、SQLインジェクションはプリペアードステートメントで対処する方がシンプルで安全だと思う。

DBにアクセスするのも、MySQL関数PostgreSQL 関数などを使うのではなく、MDB2PDOを使った方がいいと思う。その方がDBの移行はずっと楽になり、プログラムとしても美しい。

MDB2に関しては後日解説を書く予定。