Hatena::ブログ(Diary)

岩本隆史の日記帳

2008-04-11

ENT_QUOTES脳?

builder編集部の大野です。初出時、2ページ目最下のソースコードにおいて、htmlspecialchars($_REQUEST ['my_name'])となっていましたが、特別な理由がない限りhtmlspecialchars($_REQUEST['my_name'], ENT_QUOTES)とすべきなので、第2引数を追加しました。(強調は引用者)

http://builder.japan.zdnet.com/sp/php-for-desinger-2008/story/0,3800085347,20371133,00.htm?p=1&mode=all#comment-1:title

htmlspecialchars() の間違った使い方。いい加減にしてほしい。 / 正しい使い方 → http://blog.ohgaki.net/htmlentitiesa_raspa_a_afia_a_s / 修正された。(強調は引用者)

はてなブックマーク - heavenshellのブックマーク / 2008年4月10日

問題のソースコードはこれ。

main.php

こんにちは。<?php echo htmlspecialchars($_REQUEST['my_name'], ENT_QUOTES); ?>さん

Webデザイナが知っておくべきPHPセキュリティ - builder by ZDNet Japan

「こんにちは」から始まる1行のみmain.phpに書かれているということだろう。

このコード、htmlspecialcharsの第2引数が「ENT_QUOTES」でなかったらどんな問題があるというのか。私にはまったく分からない。

「いや、問題がある」という方は、高木浩光さんの下記記事も批判してみてはどうか。

タグの属性部分を出力するときは次のように書く。

    htmlout('日時文字列を入力してください。');
    htmlout_tag('<form>');
    htmlout_tag('<input type="text" name="strdate" value=');
    htmlout_quote($strdate);
    htmlout_tag('>');

使用した関数の定義はたとえばこんな感じだ。

function htmlout($str) {
    echo htmlspecialchars($str, ENT_NOQUOTES);
}
function htmlout_quote($str) {
    echo '"' . htmlspecialchars($str) . '"';
}
function htmlout_tag($str) {
    echo $str;
}
「サニタイズ言うなキャンペーン」とは何か

返す刀でバッサリ斬られる覚悟があればどうぞ。

追記(2008-04-12)

あと何故 ENT_QUOTES を書かなくても問題ないと思われたのか是非教えて頂きたいです。

Re:ENT_QUOTES脳? - Memo

ずるい言い方ですが「問題ない」とは書いていません。「問題があるとされる理由が分からない」と書いたのです。

main.phpにおいて「'」が「&#039;」に変換されないことでXSSの危険性が増すというなら、ぜひ攻撃例を教えていただきたい。