PHPのエスケープやエンコード関数
HTMLエスケープやURLエンコード、ハッシュ関数など、WEBアプリケーション作成においてよく使うPHPの関数をまとめた。
HTMLエスケープ
HTML中で使われる『&』や『<』、『>』などの記号を、『&』や『<』、『>』などに書き換えるのがHTMLエスケープだ(元に戻すのはHTMLアンエスケープ)。HTMLエスケープを行わなければ、例えば<はタグの開始点とご認識されてしまうかもしれない。また、ユーザーが入力した内容をそのまま表示するようなアプリケーションでは、HTMLエスケープが行われていないと悪意あるHTMLタグやJavaScriptを埋め込まれる危険性がある。
HTMLエスケープ
<?php htmlspecialchars('you & I > he & she'); // 結果: you & I > he & she ?>
HTMLアンエスケープ
<?php htmlspecialchars_decode('you & I > he & 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です。 ?>
これらの関数のマニュアルは↓。
ハッシュ関数(MD5、SHA-1)
ハッシュは与えられたデータから別のデータへの一方向(つまり、エンコードやエスケープと違い元に戻すことができない)の変換だ。例えば、『神はサイコロを振らない』→『5544aab3533a4dd52850659e54df490316837fdd』のようになる。ハッシュは、「パスワードをDBにそのまま格納するのを避けたい」というようなときによく使われる。DBにはハッシュ値を格納しておき、入力されたパスワードのハッシュ値を計算して比較すれば良い。
よく使われるハッシュのアルゴリズムはMD5とSHA-1だが、MD5は安全性の問題が指摘されているので、より安全なSHA-1を使った方が良い。
<?php md5('神はサイコロを振らない'); // 結果: 876bc50991c9adfe738fe1bb62c1c086 ?>
<?php sha1('神はサイコロを振らない'); // 結果: 5544aab3533a4dd52850659e54df490316837fdd ?>
これらの関数のマニュアルは次のリンクを参照。また、ハッシュの衝突耐性についての解説へのリンクも併せて記しておく。
SQLのエスケープ
SQLインジェクションを防ぐために、よくaddslashes()やpg_escape_string()などを使う方法が紹介されているが、SQLインジェクションはプリペアードステートメントで対処する方がシンプルで安全だと思う。
DBにアクセスするのも、MySQL関数やPostgreSQL 関数などを使うのではなく、MDB2やPDOを使った方がいいと思う。その方がDBの移行はずっと楽になり、プログラムとしても美しい。
MDB2に関しては後日解説を書く予定。