上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--|スポンサー広告||TOP↑
フレームワークを使わず、html出力を行うphpスクリプトを書いたことがあるなら、まず避けては通れない関数にhtmlspecialchars() というのがある。
これは一部のHTML特殊文字を文字実体参照に変更する。
本文中にユーザー入力をそのまま出力した場合、入力にタグがあったときにそのままタグが有効になってしまう。これはページのデザインを破壊する場合もあるし、掲示板などでは勝手にスクリプトを埋め込まれるなどの問題を発生させる。
また、タグ内の属性値も、ダブルクォーテーションなどで勝手に閉じられて、いろいろと書かれてしまう。
この辺を防ぐにはhtmlspecialcharsが大変便利である。というか、その目的のためだけに提供されている関数である。

だが、いくつか問題がある。
まず、同関数はphp他の文字列関数のご多分にもれず、シングルバイト文字列の処理を前提にしているため、日本語などのマルチバイト文字列で不安がある。実際には第三引数に文字コードを指定可能だが、デフォルトはASCIIのようである。
次に、とにかく名前が長い。頻繁に使用すると思われる関数がこんな長くていいのかと言いたい。

もっとも、これらについては適当なラッパー関数を使用することで対処可能である。
perlにはh()という名称の同様の関数があるらしい。そこで、こうする。

function h($val)
{
    return htmlspecialchars($val, ENT_QUOTES, 'EUC-JP');
}

で、htmlに埋め込む時に<?php echo h($foo) ?>で解決。
ちなみに私はさらにnl2brとまとめて

function hbr($val)
{
    return nl2br(htmlspecialchars($val, ENT_QUOTES, 'EUC-JP'));
}

とか作ってある。
(ちなみに、nl2brを使うなら先に改行コードをまとめる処理を入力時にやっておく必要がある)

なお、上記の方法はブラウザにユーザーが入力したタグをタグと解釈させずに入力した通りの文字列として表示させる処理である。単にタグを取り除きたいなら、事前にstrip_tags()を使用するほうが一般的だろう。
私の場合は上記のhbr()をよく使う。理由はphpソース中で表示する文字列を作る場合に、"<br />"なんぞと書かなくていいからである。"\n"で済むし、もしも出力対象がHTMLからただのテキストになっても修正が容易である。(まぁ、まずないとは思うけど。)
というか、strip_tagsはマニュアルを見る限りでは単に正規表現でタグを拾って取り除くだけのようなので、不完全なタグでも削除を行うようだ。
ユーザー入力値をHTMLとして解釈させるような処理自体が結構面倒なので、基本的にはユーザー入力値はHTML埋め込み段階でひたすらhtmlspecialchars()しとけばいいと思う。
というか、strip_tags()って使ったことないんだよね。
スポンサーサイト

04/08|プログラムコメント(0)トラックバック(0)TOP↑
この記事にコメント
名前:
コメントタイトル:
メールアドレス:
URL:
コメント:

パスワード:
管理人だけに表示:
管理者にだけ表示を許可
この記事にトラックバック
プロフィール

G.U.Nex

Author:G.U.Nex
職業:プログラマ
趣味:ゲーム(PC、コンシューマ)、ネットサーフィン、ニコニコ動画視聴、プログラミング、鉄道全般
PHP, C, C++, VB(系), Java, JavaScriptを使える。
最近はRubyにはまってる。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム
ブログ内検索
RSSフィード
リンク
フリーエリア
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。