「クロスサイトスクリプティングの名称と種類」

この記事の前の記事批判してみたのですが、大垣氏からの反応が無くてさみしいので粘着してみる事にします。

と言っても、今回の記事は XSS の説明をしているだけなので それほどツッコむ点は無いのですが。やや難癖付け気味。


まず一読して気になるのは、「第7回 いまさらながらクロスサイトスクリプティングの基礎の基礎」との内容の重複。これだったら第7回に今回の内容を載せておけばいいじゃないかと思ってしまいます。

月一ペースの連載で この進み方はどうなんでしょう。第7回の掲載から二ヶ月以上が経つというのに、この連載だけでは未だに XSS に実際どう対処したらいいのか判らぬままです。

もっと深い部分から理解させようという連載(例えば「XSSは知ってても、それだけじゃ困ります?」などは そういう連載になりそうな気がする。)ならば時間をかけてもいいでしょうが、この連載がそうであるとはちょっと思えません。表面的な「対策」を教えるだけであれば、やたらに話を引っ張らないで早く「対策」を教えて下さい。説明一回 対策一回の 計二回くらいで充分です。


スクリプトインジェクションはほかのインジェクション攻撃と同じく,完全なバリデーションとエスケープで防御できます。

完全なバリデーションってなんなんでしょうかねぇ。未だにその実体が見えないので何とも言えません。

ほかのインジェクション攻撃と同じく、と言っているので、以前の SQL インジェクションに関する記事(第5回 / 第6回)の中に「完全なバリデーション」とやらが載っているのかと思って読んでみましたが、残念ながらというか思った通りというか、そんなものの事は載っていませんでした。それどころか、仮にHTMLフォームなどからの入力時に完全なバリデーションを試みていても,入力時のバリデーションに不具合があるケースは多くあります。とか言っているんですが。「完全なバリデーション」、駄目じゃん。というか不具合があるのに「完全なバリデーション」って何?(「フォームからの入力値には『完全なバリデーション』を行ったが、それ以外の入力値のバリデーションを忘れている」って意味でしょうか。)


DOMベーススクリプトインジェクション,ローカルスクリプトインジェクションとも呼ばれるタイプの脆弱性です。

一体大垣氏は何を見てこの記事を書いているんでしょうか。

"DOM Based XSS" / "DOM Based Cross Site Scripting" なら引っかかるんですけどね。記事の前半で「『クロスサイトスクリプティング』という名称は解りにくい。『スクリプトインジェクション』の方が適している。」と主張しているので、「DOM Based XSS」を「DOMベーススクリプトインジェクション」と呼ぶ事自体は別にまぁ自然な話ですが、何故今まで一度も使われていない単語を とも呼ばれると言っちゃうんでしょう。


ところでこの連載、「なぜPHPアプリにセキュリティホールが多いのか?」と言いつつ PHP 関係無い記事の方が多いのはツッコむところですか?

CGI スクリプトのバージョンは表示するべきか

少し前に「サーバのバージョンは表示するべきか」という話題が流行っていましたが、その話題は思っていたよりずっと早く収束してしまいました。

この話題が比較的アッサリ終わった理由は、一つには「バージョンを表示するか否かよりも、ちゃんとアップデートする事の方が遥かに大事」という事ではないでしょうか。アップデートする事に比べれば、バージョンの表示非表示など どちらも些細なメリット / デメリットしか持たず、個人の好みレベルの問題に過ぎない、と。


さて本題。自作 CGI スクリプトを配布しているサイトは多いですが、そうした CGI スクリプトのバージョン情報は表示するべきでしょうか?

…一見するとサーバのバージョン問題と同じ構造に思えますが、サーバの場合と違い、バージョンを表示するかどうか決める人間(= CGI スクリプト製作者)と アップデートを適用する人間(=設置者)が異なるため、「そんな事よりもちゃんとアップデートする方が…」で済ませる事ができません。

また、サーバのバージョン情報は HTTP ヘッダやエラーページなど 検索エンジンに引っかからない場所に現れるのに対し、 CGI スクリプトのバージョン情報は 検索エンジンに引っかかり得るという違いもあるため、「表示するか否か」の二択ではなく、以下の三択になります。

  • バージョンを表示しない。
  • バージョンを表示はするが、検索エンジンに引っかからない方法で表示する。
    • 画像にするとか、 CSS や JS で生成するとか、別ページにしてロボット避けを入れるとか。
  • バージョンを検索エンジンに引っかかるように表示する。

とりあえず、私の思いつく限り利点・欠点を挙げてみます。

人間に見える位置に表示する場合

利点
  • セキュリティに気を使う利用者が、脆弱性のあるバージョンを使っているページの利用を避けられる。
  • そのページの利用者が、脆弱性のあるバージョンのままアップデートしていない設置者に対し、アップデートを促せる。
欠点
  • 攻撃者が、脆弱なバージョンか否かをすぐに判断できる。
    • とはいえ、バージョンが判らなくても とりあえず攻撃してみるって輩も当然いるわけで。特に削除機能のある掲示板などの場合、失敗しても 削除すれば証拠を消してしまえますし。

検索エンジンに引っかかるように表示する場合

利点
  • 善意の人間が、脆弱性のあるバージョンのままアップデートせずに使っているページを探し出し、設置者にアップデートを促せる。
    • そんな人いるのだろうか。
      • あ、でも「善意の人間」ではなく「製作者」が、ってパターンならありえますかね。そんな事している製作者 見た事無いですけど。
欠点
  • 攻撃者が、脆弱なバージョンのままアップデートせずに使っているページを簡単に探し出し、攻撃できる。

私の結論

…そんなわけで、「バージョンを表示はするが、検索エンジンに引っかからない方法で表示」というのが最適、ただし「検索エンジンに引っかかるように表示」との差は 個人の好みレベル、という感じではないかと思うわけですが、どうでしょう。


余談

古いバージョンの CGI スクリプトを使い続けているサイトを結構見かけます。製作者のサイトを見るのは設置する際だけで、その後はまったく見ないという人が多いのでしょう。

デスクトップアプリケーションでは、アップデートが無いか自動的に確認して アップデートを促す(或いはアップデートも自動的にやってくれる)ものが多くありますが、それと同じような仕組みを こうした CGI スクリプトにも持たせてやった方がいいんじゃないでしょうか。

やり方は簡単、例えば CGI スクリプト中に 製作者のサーバ上にある画像を表示するタグを埋め込んでおく。そして最初は 1x1透過画像を置いておき、バージョンアップしたら画像を「新しいバージョンが出ています。至急アップデートして下さい。」というものに置き換えるだけ。

…ただこの方法では、転送量がひどい事になり得るとか、外部からの埋め込みリンクを弾く設定にしているサーバ(無料レンタルサーバの多くはそうですね。)しか持っていないと行えないなどの欠点があるわけで。もっといい方法は無いものか。

スタンスとまとめ

基本的には私は、ウェブの理念だとか、はたしてリンク自由な世界とそうでない世界はどちらが全体の利益になるか?など諸々の理由からリンク自由派ですが、そうした面を捨て、できる限り無断リンク禁止派に妥協して書いてみたのが例の文章です。あれで妥協しているのかと無断リンク禁止派は思うかもしれませんが、本当にできる限りの妥協です。

今までも、無断リンク禁止派へ「技術的にリンクを制限すれば?」とか「命令ではなくお願いとして書けば?」などの妥協的な提案が行われてきましたが、そうした提案は 無断リンク禁止派個人個人が行うべき事の提案でした。それに対して、あの文章の主題は無断リンク禁止派全体が行うべき事の提案であり、要約すれば

「せめてこれくらいの事をしないと、あなたがたの望む世界は手に入りませんよ?」

という事であって、逆に言えば

「これくらいの事もしないうちは、無断リンクされても文句は言えないぞ。」

という事です。

「じゃあ、それをやったらリンクポリシーを守るのか?」という話ですが、例の文章の最後で「そうなったならば、そうした意見に同調してもいいと思いますよ。」などと書いたものの、実際のところ、どうせそんな事やらないだろうと思っているから適当に言っている面があります。だって技術的なリンク制限だって面倒くさがってやらない人たちが殆どですし。個人レベルでは行動するかもしれませんが、全体での行動を起こせるとは思えません。

無断リンク禁止派が行動を起こさない限り(そして恐らくそれは永遠に行われない。)、私はリンクポリシーを無視する口実を得たわけです。もちろん、リンクポリシーに法的拘束力なんて無いんですから そんな口実必要ないっちゃないんですけども。

「面倒だから駄目」という要約はあながち間違っていませんが

はてなブックマークコメントより。

2007年09月16日 rusica [無断リンク] えー、面倒だからダメって、ちょwwおまwwwってやつですよ。

2007年09月16日 rag_en [無断リンク] リンクする側がメンドクサイので無断リンク禁止がダメってwwwwwwwwwwww…まさかこれが前回書かれてた「何故問題か」の内容? /そんなに面倒ならリンクするのもやめたらイイんじゃないですか?

お二人の「面倒だから駄目」という要約はあながち間違っていません。ですが、私はその「面倒さ」が(現状)理不尽なレベルの面倒さであるから駄目だ、と主張しています。

実際、お二人はこのはてブコメントを付ける前に、私のブログに「リンクポリシー」がないか確認されたのでしょうか。恐らくしていないでしょう。何故なら、実はこっそり作っていた「リンクポリシー」を守っていないのですから。前回の記事に リンクポリシーの書かれうる場所について「ブログ」の場合、「一番最初の記事」であったり、とヒントを出してみたのに。(もちろん見たけど無視した可能性もありますけどね。)

私は「理不尽なレベルの面倒さ」である理由をできるだけ示したつもりです。そこまでの面倒さではないと思われるならば、その理由を示していただけないでしょうか。

また、rag_enさんはそんなに面倒ならリンクするのもやめたらイイんじゃないですか?と気軽におっしゃいますが、私の話は「無断リンク禁止サイトにリンクする時の話」ではなく、「あらゆるサイトにリンクする時の話」です。rag_enさんはリンクの無い世界をお望みですか。私は(理不尽なレベルに)面倒なのも、リンクの無い世界も望みません。

追記

rusica さんがコメントを追加されていたので。

# 2007年09月16日 rusica 無断リンク えー、面倒だからダメって、ちょwwおまwwwってやつですよ。/ 私は根っからのリンク自由派なのでリンクポリシーは読みません。「面倒だから」だけでは無断リンク禁止派は納得しないよって言いたかっただけです。

うーむ、無断リンク禁止派を納得させられるよう最大限努力して書いたつもりなのですが、どの辺が弱いでしょうか。…ってリンク自由派に訊くのもなんですが。

無断リンクの話の続きと、私が無断リンク禁止派が嫌いな理由

問題は「『無断リンク禁止』が一般的になる」事ではない。」の続き。「『(無断)リンク禁止』というルールは絶対守らなければならないようになる」のがどうして問題であるか?

なぜならそれは、非常に大きな世界の変革であり、現状のまま無理に進めれば 多くの不都合が発生するからです。

「非常に大きな」世界の変革、と書きましたが、これは「逆のケース」を考えてみれば大きさの違いが良くわかります。「逆のケース」とは、つまり「元々『リンクは許可を得るのが当然』であった世界に、『ウチへは無断で自由にリンクして構わない』という人が現れ、それを守らなければならなくなる(自由度が増えているのに『守らなければならない』というのも変ですが、一応対応させる関係上。)」場合。

この場合は、人々の行動は特に変わりません。あるサイトにリンクしようと思った人は、まずは いつも通り連絡先を探します。その過程で「無断リンクOK」である事に気づいて連絡をやめるかもしれませんが、最初の行動は変わらないのです。

対して今回のケース、「元々『リンクは無断で自由にできる』世界に、『ウチへは無断でリンクしてはならない』という人が現れ、それを守らなければならなくなる」場合。

あるサイトにリンクしようと思っても、そのサイトが無断リンク禁止を掲げているサイトかどうかはすぐには判りませんから、まずはリンクポリシーを探す必要があります。…が、以前ならばリンクは無断で自由にできた以上そんな行動は必要無かったのです。前回書いた通り『極論を言えば、たとえ「無断リンク禁止!」と言う人がたった一人であろうが』、さらに言えば 実際には「無断リンク禁止!」と言う人が想像上の存在で実在しなかろうが、そのために全ての人間がリンクを行う際の行動を変えなければならないのです。

…「リンクポリシーを確認するくらい大した手間ではないじゃないか」と思われるかもしれませんが、しかし 意外にそれは面倒な事なのではないかと思います。ちょっと件の記事へのはてなブックマークコメントから引用。

# 2007年09月10日 z0rac [無断リンク][駄目] 本当にリンクの度にそのサイトを隅から隅まで読んで「無断リンク禁止」と書かれていないことを確認してる?やってなければ貴方も「無断リンク」してるんだよ。/問題を把握せずに道徳を説くのは間違い。

リンクの度にそのサイトを隅から隅まで読んで「無断リンク禁止」と書かれていないことを確認、というのは極論にすぎる印象で 流石にそこまでする必要はないと思われますが、しかし「一般的にリンクポリシーの書かれうる場所」というのはなかなか多岐にわたり、現状ではその全てを手動で確認する必要があります。

  • 「このサイトについて」的ページ
  • リンクページ
  • メインページ
  • 入り口ページ

しかも(以下長いのでこの段落は読み飛ばし推奨)、見つけた記事には戻るリンクが存在しないので URL を削ったら「入り口ページ」へ移動して、どうやらそこにはリンクポリシーが書かれていないようなので他を探すために「ENTER」をクリックしたら「注意事項をちゃんと読まないような奴は死ね!」とか言われて 入り口ページの注意事項をよく見たら「ENTERの文字は偽者で、下のほうに小さく本物の入り口があります。」と書かれているのを発見して ようやく「メインページ」に移動したら、各ページへのリンクがアイコンで示されているくせに そのアイコンが微妙で何を示しているのか判らず、ファイル名も「page1.htm」とかで判別不能、やっとの思いで「このサイトについて」に移動したところ、サイトについての情報が キャラクター同士の掛け合い漫才で書かれているという読んでて殺意を覚える構成で、しかも肝心のリンクポリシーは一番下に「└|・/勹レニ⊃レヽτ」とかページ内検索で検出不可能な文字列で書かれていたりするんです。以上、個々については完全実話。

さらに上では『「このサイトについて」的ページ』と一つにまとめましたが、実際には『アバウト』だったり『最初にお読み下さい』だったり『注意事項』だったり、「ブログ」の場合、「一番最初の記事」であったり、或いは逆に最後の記事(最新日記を表示した際に常に上に表示されるよう、遠い未来の日付)だったり。

一回のリンクでこれだけの確認をしなければなりませんし、しかも他サイトが既にリンクしている記事だからといって「このサイトはリンク自由だ」と リンクポリシーの確認をしなくて済むわけではありません。(その「他サイト」は 無断リンク禁止サイトに許可を得てリンクをしたのかもしれませんし、「他サイト」が無断で勝手にリンクしているだけかもしれませんし、さらに言えば「○○なサイトからは可、××なサイトからは不可」というリンクポリシーかもしれません。)また、以前リンク自由であることを確認したサイトの記事だからといって、その後リンクポリシーが変更されている可能性があるのでリンクの度に確認が必要です。

それからリンクというのは張る瞬間だけの話ではないでしょう。リンク自由だからとベタベタリンクをして、ある時「やっぱりリンク禁止!」と言われれば 今まで張ったリンクを全て除かねばならない――という事にもなりかねません。

www はリンクが自由なものとして作られたのであり、それ故 世界がリンクを(技術的な意味で)自由にできるようになっているこの現状で「『(無断)リンク禁止』というルールは絶対守らなければならない」と主張するのは、これだけの齟齬を起こそうとする行為なんですよ。本気で「『(無断)リンク禁止』というルールは絶対守らなければならない」ようにしたいならば、それに合わせて根本的に世界を創りなおすところから始めなければならないのです。


さて、それでも「リンクポリシーの確認は大した手間ではない」と思う人はいるかもしれません。確かに、リンクを滅多にしない人にとってはそうかもしれませんし、まして サイトや公開オンラインブックマークを持っていない人は「自分には関係無い」と思っているかもしれません。

しかし、毎日大量にリンクをする人――いわゆる「個人ニュースサイト」の管理人や、アルファブックマーカーなどと呼ばれる人たち――はどうでしょうか。そうした人たちにとっては、リンクポリシーの確認は確実に大きな負荷となります。そうなれば彼らの情報発信能力は確実に下がります。サイトを持っていないからといって「自分には関係無い」と思ってはなりません。彼らの集める情報を楽しみにしている/重宝しているという人ならば、「『(無断)リンク禁止』というルールは絶対守らなければならない」などという意見に気軽に同調してはならないのです。

私が無断リンク禁止派が嫌いな理由

無断リンク禁止派全員がそうというわけではないですが、しかし多くは「無断リンクするな!」と命令するばかりで、自分は何も「行動」しません。上で書いた通り それは非常に大きな変革であり、つまり多くの「行動」が必要だというのに。…それが嫌いな一つの理由。ボランティアのゴミ拾いに参加してたら「オラお前らちゃんと拾えー!」とか言うばかりで自分は何もしてない奴がいたらムカつくでしょう?それと同じ。

無断リンク禁止派がとるべき「行動」には、一つには「個人的に技術的手段(.htaccessとかCGIとか『リンクが嫌ならコレ使え!』とか)で対応する」というものがあります。が、無断リンク禁止派は そうした技術に明るくない人が多いせいか、そうした行動はあまり行われません。ましてや、プロトコルなどのレベルから世界を創りなおすなどできないでしょう。

しかし、技術に明るくなかろうが可能な事もあるのに、無断リンク禁止派はそれをしない。それが私が無断リンク禁止派を嫌う最大の理由です。

「技術に明るくなかろうが可能な事」…それは、「リンクポリシー表記方法の統一」。上で書いた通り、リンクポリシーが書かれうる場所があちこちあるのが問題の原因の一つです。現状の仕組みを維持しつつ リンクポリシーを絶対守らなければならないようにするなら、これは絶対必要であると言ってよいでしょう。

私の試案。

  • リンクポリシーを書くページは、そのサイトの最も上のページ(http://id.example.com/ とか http://example.com/~id/ とか http://example.com/id/ でアクセスできるページ)。
    • できれば「全てのページに」と言いたいところですが、「アクセス解析つけてるのトップページだけだから トップ以外にリンクするな!」→「全てのページにアクセス解析つければいいのでは?」→「そんなの面倒だ!」とか言っちゃう人がいるらしいので、妥協。
  • 書く文字列は厳密に指定。
    • 機械的に判別しやすくするため。
      • そもそも「機械的に判別しやすくする」なら robots.txt のリンク版みたいなのが理想ですが、ブログとかだと置けないですし。
  • この方式に基づかないリンクポリシーの表記は、守らなくてよい。(超重要)
  • また、リンクした時点でのリンクポリシーに従えばよく、その後変更があっても それ以前のリンクを解除する必要は無い。
    • 「以前からずっとリンク禁止と書いていた!」とか嘘吐く人が出たらどうしよう。 Internet Archive とかで確認できなければ無効とか?

こんなもんでどうですか。>無断リンク禁止派

さて、では何故無断リンク禁止派はリンクポリシー表記方法の統一を行わないのか?…と考えると、「リンクする側のことを全然考えていないから(だからリンクポリシー表記方法が統一されていない現状が、リンクする側にとって非常に迷惑である事に気付かない)」という理由しか思い浮かばないわけで、そうしてますます無断リンク禁止派が嫌いになるのでありました。(他に理由あります?)


こうした行動が行われ、そして現在見ているページのリンクポリシーを機械的に判断できる術が広まった(ブラウザ標準機能として搭載されるのが理想ですが、そこまで行かなくても Firefox 拡張とか。)ならば、そうした意見に同調してもいいと思いますよ。

しかし現状において、それも本人が何も行動を起こさないで「リンクポリシーは絶対守らなければならない」などと言っているようでは、断じて同調するわけにはいきません。

問題は「『無断リンク禁止』が一般的になる」事ではない。

なんか「無断リンクを防ぐ機能を標準装備の Blog / レンタルサーバサービス作ったら人気出るんじゃね?」的な意見をちらほら見かけますが↓

そしたら、Webサービス会社は、外部からリンクできないような仕掛けを施したサービスに商機があるよね。

具体的には、他サイトからアクセスがあった場合、何も表示されないようにする。しかし管理人からは、どのURLからアクセスがあったか分かる。そして管理人は、そのアクセス元を調べ、問題がないと感じたらアクセスを承認すればよい。非常に簡単な技術だ。

大手のブログサイトは、この機能を採用すべきである。全然コストもかからないはずだ。もちろん、オプション機能でね。初期設定ではオフになってるんだけど、無断リンクを禁止したい人だけオンにすればいい。

そこは我々が1000年(近く)前に通過した場所だッッッ!!

そうした人が大勢いるとなると、「他サイトからのリンクによるトップ以外のページへのアクセス」を弾く(=ディープリンク禁止)サイトスペース・ブログを作ったら結構繁盛するんじゃないですか?さらに設定次第でトップページですら特定のサイト以外からのリンクによるアクセスも弾く(=無断リンク禁止)事も可能に。

まぁ、どうせそれ以前にも誰か考えていた人はいるでしょうけど。


ところで、無断リンクに関してこんなエントリがありました。

このエントリを始め、彼らが言うには、無断リンク禁止を容認すればやがてそれがネットの常識となり、ネットの価値が著しく落ちるのだそうです。中には、「アマゾンが無断リンク禁止って言い出したらどうするんだろう」みたいなことをブクマコメ欄に書いて下さった方もいました。でも冷静に考えて下さい。そんなことはありえないんです。

そうじゃないんですよ。問題なのは「『無断リンク禁止』が一般的になる」事じゃないんです。(まぁなったら困りますが、そうはならないという点ではこのエントリに同意。)「『(無断)リンク禁止』というルールは絶対守らなければならないようになる」事なんですよ。だから私は「無断リンク禁止!うちのサイトに絶対リンクするな!」とか言う人よりも、「別にうちはリンクフリーだからどうでもいいんだけどさー、でも人が嫌がってるのにリンクするのはよくないよねー」とか言う人の方が罪が重いと思っています。一見正論に見えるから余計タチが悪い。

無断リンク禁止派が少数であろうが多数であろうが それは直接は関係無いんですよ。極論を言えば、たとえ「無断リンク禁止!」と言う人がたった一人であろうが、それを守らなければならないというコンセンサスが生まれてしまったら問題になるんですよ。

何故それが問題かというのは、また後日。…書く時間と気力が無いなぁ。

Geocities 無料版で (多分)合法的に広告非表示にする方法

はじめに

Yahoo!Geocitiesは 非常に人気のある無料レンタルサーバですが、無料である以上 当然広告が表示されます。 CSS などを使って広告を消してしまうこともできなくはないですが、それは規約に反している以上 アカウント削除されてしまいます。

しかし、無料版 Geocities において 規約に反さずに広告の無いサイトを作る方法を思いつきました。チャレンジャーな方は是非お試しあれ。

方法

  1. 全ての HTML ファイルを、 well-formed な XHTML で記述する。
  2. HTML ファイルの拡張子を全て「 .xml 」にリネーム。(それに合わせて、サイト内リンクの拡張子も変更する事。)
  3. XML 宣言の次行に、 <?xml-stylesheet href="/自分のID/noad.xsl" type="text/xsl" ?> という一行を追加。
  4. 以下のテキストを、「 noad.xsl 」という名前で保存し、一番上のディレクトリにアップロード。
<?xml version="1.0" encoding="UTF-8" ?>





規約に反していないか?

Yahoo!ジオシティーズ上で作成するすべてのHTMLページに自動的に掲載されるYahoo! JAPANの広告について、その掲載を回避する措置を講じたり、完全な形で表示されないようにするなどの行為を禁止します。

すべてのHTMLページに、とありますが、この点に対して「 HTML じゃなくて XML ですから!」と言い訳できます。もし「でも中身は HTML そのままじゃないか!」と言われるようなら、 XSL の知識さえあれば HTML の名残を残さないような XML にする事もできます。

Geocities 以外について

同様の規約で、かつ 拡張子だけを見て広告を入れるか判断している(⇔中身を見て HTML か判断している)サービスならば、同じことが可能でしょう。

注意

本当に規約に反していないかは検討の余地がありますし、規約が変更される可能性もありますので、この方法を試したところ アカウント剥奪されてしまっても文句は言わないで下さい。

また、古いブラウザでは見ることができません。