エンジニアが発信する【2007年12月】の記事です

エンジニアが作る最新ITブログ トップ>【2007年12月】

2007年12月31日

IIS 7 マネージャ接続許可を与える方法

■ サイトへの接続許可を与える方法 (GUI を使う)
・左側ツリーでサイトを選択し、中央で IIS Manager Permissions をダブルクリック。
・Allow User ダイアログでユーザーを選択。

iis7manager


■ サイトへの接続許可を与える方法 (GUI を使わない)
どうも、appcmd.exe は administration.config をエディット出来ないっぽい。

では、どうやるか?

Microsoft.Web.Management.Server.ManagementAuthorization クラスの Grant メソッドを使うと OK っぽいです。
(C# IDE の IntelliSense でがんばって探しました)



PowerShell でやるとこんな感じ。




PS C://\/i/iUsers//\/i/iAdministrator> [Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Management")

GAC Version Location
--- ------- --------
True v2.0.50727 C://\/i/iWindows//\/i/iassembly//\/i/iGAC_MSIL//\/i/iMicrosoft.Web.Management//\/i/i7.0.0.0__31bf3856ad364e35//\/i/iMicrosoft.Web....


PS C://\/i/iUsers//\/i/iAdministrator> [microsoft.web.management.Server.managementAuthorization]::Grant("EVO320//\/i/ikyoto_mgr", "/osaka
web site", $FALSE)

ConfigurationPath Name IsRole
----------------- ---- ------
/osaka web site EVO320//\/i/ikyoto_mgr False





2007年12月31日

[思]大晦日

今年も残すところ5時間余りとなってしまった.だからといって別に焦っている訳でもない.今年も色々あったなと一年間を振り返ってみた.

仕事ではVisual Basic 6.0の呪縛から解放され(メンテや改造の場合は使う場合もあるが...),開発言語を一気にC#へシフトした.Visual Basic 6.0の中途半端なOOPからC#の完璧なOOPな仕様に満足してのアプリ開発は充実していて楽しかった.またターゲットO/Sもデスクトップ用Windowsだけではなく,Pocket PCやWindows Mobile 5.0向けのアプリを開発する機会に恵まれた.Windows CE 3.0とは段違いにアプリの開発が楽になっていて驚いた.此はO/Sだけが理由ではなく開発ツールの進化による処も大きいものがある.やっぱり開発ツールをVisual Studio 2005へシフトして正解だったと実感した.

仕事では新しい技術に触れる機会があったのは喜ばしいことだが,嬉しくないこともあった.大型プロジェクトを受注できるからとアサインされた.其れに伴い他の案件を断ってきたが結局は受注できずと元請企業より連絡を戴いたときはくらくらしてしまった.機会損失が長期間続いたのが売り上げに諸に影響して,悲惨な状況に陥った.まあその間に時間だけはあったので新しいことを学ぶ時間には恵まれたので,怪我の功名と自分で自分を慰めることにしよう.

私生活では密かにブラウジングしていたしょこたん☆ぶろぐであるが,blogでひょんなことからブラウジングしていることをカミングアウトした.カミングアウトした後は何も躊躇することなくしょこたん関連の話題をエントリに上げるようになった.まあ好みは人の自由だから,しょこたんが好きでも良いよねということで.

ネット関連ではmixi繋がりな方々から蕎麦や林檎を贈って戴いたりし,本当に有り難いことが続いた.所詮ネットだから,たかがネットだからという人もいるが,ディスプレイに表示される無機質な文字の向こうには,血が通って心を持っている人が居るんだよということを改めて実感した.

今年を振り返ってみると以上の通りで,悪いことより良いことの方が多かった一年間だった.来年も充実した楽しい一年になると良いな.其れからこのblogを読んでくださっている方々にも良き一年になることを祈っています.其れでは皆様良いお年を.

2007年12月31日

【PHP関連】「」(アンパサンド)をエスケープしなければならない実例



ここ最近、htmlspecialchars関数について調べていて、いろいろ記事にしていたのですが、コメントをいただいた。参照となるページを教えていただいたのですが、実はそのページは、この記事を書く前に既に読んでいました。コメントに書かれていたページのURLをここに記させていただくと、

●「サニタイズ言うなキャンペーン」私の解釈(2006/11/29)
http://kmaebashi.com/zakki/zakki0042.html

です。で、私の文章の書き方が悪かったのかもしれませんが、私はこの方の解釈とほぼ一緒(のつもり)です。ただ、このページで例として挙げられている「Taro&Jiro's castle サウスポール」の「&」は別に「&」とエスケープしなくても「Taro&Jiro's castle サウスポール」と表示されます。

そのため、そもそも「&」を「&」とエスケープしなければならない場合とは何かということを考えていました。その実例がやっと見つかりました。今回いただいたコメントをきっかけに気づいた事例もあるのですが(コメントを下さったshiさん、ありがとうございます。)、それは後述するとしまして、まず、下記をご欄ください。

あいうえお&rlo;こけくきか

上の文字列は、「あいうえおかきくけこ」と見えると思いますが、ソースは「あいうえお&rlo;こけくきか」となっています。

&rlo;」はUnicodeの制御文字で、文字列の方向を変えるためのものです。アラビア語などでは右から左に文字を書くので必要ということらしいです(昔の日本語も確かそうだった?)。

この「&rlo;」(数値参照文字なら「‮」)が出現すると、後続の文字列がおかしくなる(全部ではなく、一定のパターンでストップがかかるみたいです。)ので、
http://live.2ch.net/dome/kako/1010/10104/1010445506.html

のような現象が起きます。この2chの「&rlo;」騒動は2002年当時からあったみたいですね。今頃知って、お恥ずかしい。

&rlo;」が入った場合にどれだけの後続の文字列を道連れにするかはまだ十分に検証できていませんが、HTMLソースのパターンによっては大規模な「表示化け」が起こりそうです。実際、Googleの検索結果でも、こちらのページはページタイトルや検索結果の件数が表示されている部分が、文字の順番が逆になっています。

&rlo;」を入力され、「&」を「&」にエスケープしない場合(あるいは、htmlspecialchars関数を通した後、「&」を「&」に戻す処理を入れている場合)、ページの一部分の表示が乱れることももちろん問題ですが、
  • 例えば、NGワードを決めているような掲示板やブログがあっても、それをスルーされてしまいます。「氏ね」をNGワードにしたいのに、「&rlo;ね氏」と入力されてしまうとチェックできまないことになります。
    (--2007年12月31日午後17時13分頃の追記 start--)
    でも、考えてみれば、「&」を許可してしまうと、「「氏ね」と書けば「氏ね」と表示されることになります。NGキーワード形式を取っているサイトでは「&」を許可してしまうと、数値文字参照方式での記述も同時にNGワードかどうかチェックして(10進数形式ではなく、16進数形式の「氏ね」でも駄目としなければなりません。)、NGワードに該当すればブロックできるようにプログラミングしておかないといけないので、なかなか面倒そうですね。

    そういう意味でも、EUCの補助漢字を処理する場合、「&」については、「原則はタグとして実行されるのは禁止(=エスケープ処理)で、例外的なものも一部認める」というホワイトリスト方式にしないといけなさそうです。つまり、「htmlspecialchars関数の仕様は、実に理にかなっている。」ということになりそうです。
    (--2007年12月31日午後17時13分頃の追記 end--)

  • 掲示板やブログが荒れる元になりえます。そういうことをして喜ぶ連中に狙われると大変です。
  • 別の脆弱性を突く攻撃との組み合わせなどで、何かあるかもしれません。(私は知らないだけで、何かあるのかもしれません。)
という問題が考えられると思います。ですから、「htmlspecialchars関数を通した後、「&」を「&」に戻す処理を入れること」は、やはり慎重になったほうが良さそうです。

さらに、前述のように、今回コメントで書いていただいたページ(「サニタイズ言うなキャンペーン」私の解釈(2006/11/29))は既に読んでいたのですが、この記事を書くために、改めて読み直し、さらにHTMLソースを見させていただいて、あることに気づきました。文字参照の末尾のセミコロン「;」があってもなくても、ちゃんと表示されるんですよね。ということは、「Taro&Jiro's castle サウスポール」の場合は、「&」をエスケープしなくても問題ないのですが、「Taro&copy's castle」の場合は、エスケープしないと「Taro©'s castle」になります。

私はセミコロンがないと動かないと思い込んでいたため、「Taro©'s; castle サウスポール」と入力して、「Taro©'s; castle サウスポール」のように表示されているかといって、「『Taro©'s; castle サウスポール』と表示されるべきなのでは? 」と文句を言う人がいたら、ただのクレーマーだと思っていたのですが、「;」なしでも動くなると、場合によっては、文字参照と解釈してほしくない場合だってあるかもしれないと思えてきました。

URLを紹介する場合に、パラメータに「copyright」というのがあって、これに「&」が付くと、
http://www.example.com/example.php?hoge=1&copyright=1
のようになります。この時、エスケープしないままURLがソース内にありますと、
http://www.example.com/example.php?hoge=1©right=1
のように、IE7やIE6 SP2では表示の際に「&copyright→©right」と解釈して、問題(Firefox 2.0.0.11やOpera 9.24では大丈夫)ということになりますから、ソースレベルでは、
http://www.example.com/example.php?hoge=1&copyright=1
と書いて、
http://www.example.com/example.php?hoge=1&copyright=1
と表示されるようにしなければなりません。以下、ブラウザの解釈によって違うようですが、

http://www.example.com/example.php?hoge=1&ampm=1
とソースの中で記述しなければ、
http://www.example.com/example.php?hoge=1&m=1
のようになります。「&ampm→&m」のように解釈されます。

http://www.example.com/example.php?hoge=1&regist=1
とソースの中で記述しなければ、
http://www.example.com/example.php?hoge=1®ist=1
のようになります。「&regist→®ist」のように解釈されます。

http://www.example.com/example.php?hoge=1&century=21
とソースの中で記述しなければ、
http://www.example.com/example.php?hoge=1¢ury=21
のようになります。
&century→¢ury」のようにIE6 SP2やIE7は解釈します。

ちゃんとエスケープしないと、
http://www.example.com/example.php?hoge=1&times=1
と表示したいのに、
http://www.example.com/example.php?hoge=1×=1
にのように表示されることがあります。これらの文字が問題になりえます。

http://www.example.com/example.php?hoge=1&para=1
と表示されたければ、
http://www.example.com/example.php?hoge=1&para=1
とソースの中で記述しなければなりません。そうでなければ、「&para → ¶」のようになります(これはIEだけでなく、Firefoxでもそうなるみたいです。Operaではなりませんでした)。パラメータの意味で「para」とかいう名称は使いたくなりそうですし、気をつけたほうが良さそうです。

下記のリンクにカーソルを合わせていただくと、IEやFirefox(2.0.0.11)では、リンク先URLが文字化けしていることが分かります。実際クリックすると、予期しないページに飛びます。
¶

「そんなの当たり前」と思われるかもしれませんが、私は「;」がなくても表示されることを知らなかったため、このような事例に今の今まで気づきませんでした。

ここ最近の記事を書くきっかけになった「EUCのページにおける補助漢字の処理」に関しては、結局のところ、どうしていいか分からないというのが実情です。「‮」対策を考えると「正規表現+例外処理」になりそうですが、これだと漏れが生じる可能性もあるかもしれません。

&」のエスケープにより、「鷗」やフランス語などの一部外国語ぐらい(補助漢字ではありませんが、ハングルなどの一部外国語)しか実質・文字化けしないのであれば、下手に触らないで、今のまま放置しておいたほうが無難であるという感じに思えてきました。

もしくは、数千字ある補助漢字や、「©」「®」などの文字実体参照のうち、「わりと使う文字だけ」をピックアップして、変換テーブルを作成して対処するホワイトリスト方式がいいのかもしれません。一律にpreg_replace関数で変換し、例外処理もプラスするブラックリスト方式は何だか怖い気がします。

エンジニアが作る最新ITブログ トップ>【2007年12月】

メンバー紹介

タグパネル

ランキング

エンジニアが作る最新ITブログ DODA