HTML挿入プラグイン
- 投稿者: あき
- カテゴリ: 新規
- 優先度: 普通
- 状態: 提案
- 日時: 2004年11月04日 21時18分04秒
内容
HTMLで記載したページを挿入するプラグインです。HTMLタグ挿入プラグインの代替用です。
HTMLタグ挿入プラグインはとても有用なのですが、公開用ページで使用するのは非常に危険、とのことでその代替案を考えてみました。(どうしても任意のHTMLを記述したい箇所があり、一般には書き込みを禁止にしてHTMLタグ挿入プラグインを使っていたのですが、同プラグインを使用する際にはコメント挿入プラグインすらも使ってはいけないと解り、困惑していました)
とても単純な発想ですが、有用そうなので公開します。
あまりに簡単に発想できて実装までできてしまったので、ひょっとすると何か大きな勘違いをしてしまっているかもしれません。セキュリティ上問題があるようでしたら、どうかご指摘下さい。本当に、単なる勘違いかもしれません。
サンプルページはこちらです。
更新履歴
- include_html.zip(787)
- 初版リリース。
- include_html_rev01.zip(726)
- パート指定に対応。参照権限がユーザ以上でなくても、凍結されたページでも可とした。
- include_html_rev02.zip(788)
- パート指定の際、記述HTMLソース内に空行が含まれているとそこでincludeが止まってしまうバグを修正した。
- include_html_rev03.zip(1432)
- 第2引数の前にスペースが入っていた場合、パート指定を上手く抽出できない不具合に対応。
インストール方法
添付ファイルを解凍し、ディレクトリごとpluginディレクトリ下に放り込んでください。プラグイン設定画面でinclude_htmlを有効にしてください。
使用法
- まず、予めHTMLタグ形式で記述したページを(Wikiページとして)作成します。
- そしてこのページを「ユーザ」以上の参照権限に変更するか、又はページを凍結します。
- 最後に、表示させたいページで、本プラグインを用いてHTML形式で作成したWikiページ名を引数に指定して記述します。
- HTMLで記述するページと、それを読み込んで表示するページを分けてページを作成することになります。(HTMLで記載するページもWikiのページです。外部URLではありません)
- rev01からパートの指定に対応しました。一つのページに、パートを分けて複数のHTMLを定義しておけるようになりました。
ページ:banner_html
!バナー1 <a href="http://aaa.bbb.com"> <img border="0" src="http://aaa.bbb.com/theme/banner.gif" alt="aaa.bbb.comのバナー"> </a> !バナー2 <a href="http://ccc.ddd.com"> <img border="0" src="http://ccc.ddd.com/theme/banner.gif" alt="ccc.ddd.comのバナー"> </a>
表示させるページ
{{include_html banner_html, "!バナー1"}} {{include_html banner_html, "!バナー2"}}
上記のように、頭に「!」を付けてパート名を記述するとパート名として扱われます。パート名を省略すると初版どおりページの全内容が対象となります。
補足
HTMLで記載するページをユーザ以上に制限することにより、悪意ある閲覧者によるページの改竄を防ぎます。
HTMLで記載したページは、通常のページとして表示する分にはサニタイジングされているため、害はありません。もちろん、そのままWikiの1ページとして表示しても、HTMLソースがそのまま表示されるだけで、単独では価値のないページとなってしまいます。
インラインプラグインですので1行に複数記載することが可能です。
展開したいHTMLのバリエーションだけページを作成しなければならないのが欠点です。(将来的にはパートを分けて、すべてを1つのページにまとめて記載させる方法も無くはないですが・・・。ま、要望があれば、ということで・・・) →rev01にて対応しました。
動作確認バージョン
3.5.6〜3.5.10
3.5.10での動作を確認いたしました。 by とあるユーザ 2005/12/16
ライセンス
GPL。ご自由にお使いください。
改造その1
大変便利なプラグインだと思います。しかし、僕を含め、ユーザーがこの機能を使うことに危険を感じる人も少なからず思います。例えば、<meta http-equiv="refresh" content="2;url=about:blank">は、bodyタグ内でも機能しますので...(以下略)
これらを避け、あくまで管理者である自分のみが使えるように改造するには次のようにするといいみたいです。
初版時
IncludeHtml.pm Line:48-50
if($wiki->get_page_level($page)!=2){ return &Util::inline_error("ページの参照権限は管理者でなければなりません。"); }
rev01〜03時
IncludeHtml.pm Line:74-76
if($wiki->get_page_level($page)!=2 && !$wiki->is_freeze($page)){ return &Util::inline_error("読み込むページの参照権限はユーザ以上か、又は凍結されたページでなければなりません。"); }
Wikiを導入すると、どうしても他のCGIスクリプトとの連携が難しくなると思います。このスクリプトを利用すれば簡単に他のCGI用のフォームを取り込むことができますので、幅が広がりそうですね。
と、わかりきったことをちょっと書いてみました。しょぼい改造ですみません。
teapots - (2005年3月11日)
- すみません。とても重要な指摘だと思うのですが、どういう意味で危険なのかが分かりません。「以下略」と書かずに最後まで書いて頂けると嬉しいです。 - あき (2005年03月13日 22時48分29秒)
- あっ、それとも、単に「自分以外(管理者以外)は信用できないから管理者のみ有効にすべきでは?」という提案でしょうか? ソースを見るとそのようですが・・・。う〜ん。これはどういう人をユーザ(ログインできる人)として選んでいるか次第ですね。少しでも信用できないユーザがいるようであれば、確かに管理者のみに限定すべきだと思います。ってそういう意味合いのご指摘で合ってますでしょうか? - あき (2005年03月13日 23時02分26秒)
コメント
- {{include_html http://www.asahi.com/index.html}} - Mo (2004年11月05日 00時41分04秒)
- 使えないようですが、ページが見つからないというmessageです。 - Mo (2004年11月05日 00時42分38秒)
- 挿入するのはFSWiki内のページです。URLではありません。 - あき (2004年11月05日 01時06分02秒)
- Wikiのページとして、内容はHTMLタグを使ってガンガン書いてください。そしてそのページを「ユーザのみ」または「管理者のみ」の参照権限で保存し(又は登録後、管理者メニューのページ管理で設定し)、そのHTMLを埋め込みたい場所(例えばFrontPage等)で、{{include_html 作成したページ名}}と記述してください。 - あき (2004年11月05日 01時17分02秒)
- 説明文にも補足を追加しておきました。 - あき (2004年11月05日 01時27分32秒)
- thank you very much. I can use it now. - Mo (2004年11月23日 14時04分22秒)
- このプラグインで、Wikiページ中に目次へ戻るや前のページへ戻る、ウィンドウを閉じるといったボタンを追加でき重宝しております。
このプラグインで引数を使うことができれば、画像のサムネイル表示などをパーツ化でき、Web上での表現の幅が広がるのですが、そういった拡張は可能でしょうか?
たとえば {{include_html サムネイル表示,外部ファイル名}} で サムネイル表示 のページには <a href="外部ファイル名"><img src="外部ファイル名" border=0 width=150 height=100></a> といった記述を行うことで、サムネイル表示パーツとして使用ができるのですが、 (って引数におかしなことされて、セキュリティホールになってしまうかな、、?)
- テトラン (2005年11月02日 20時57分52秒)
- 面白そうな機能ですね。ですが仰るとおり、かなり危険かもしれません。「使い方を誤ると」ですが…。基本的に、HTMLで記述するページは管理者(又はユーザ)しか編集できませんので、管理者がわざわざ怪しいHTMLのページを書いたりしない限りは大丈夫なのですが、本人がそう意識していなくても、知らぬ間に脆弱性を含むHTMLのページを作成してしまうことは十分に考えられます。例えば、「<iframe src="外部URL" …>」とかですね。「外部URL」の部分を引数にすると、悪意のあるユーザ(外部の者)が問題のあるURLをこの引数に指定することでとんでもないことが行えてしまいます。そういった意味では補足の欄にも書いてますが、取りうるパターンを全て1つのHTMLのページに記載しておいて、パラメータでどのパートを表示するか切り分けるようにする拡張の方が安全だと思います。引数は、パート識別子ということになるでしょうか? もっと拡張して、HTMLの一部(例えば<a>タグのURLの部分だけとか)を予め定義しておいたいずれかの文字列(例えばURLかな?)に置き換えて表示する、といったものも良いかもしれません。あ、いいですねぇ。これなら安全性が確保できます。拡張計画に入れておきます。 - あき (2005年11月02日 23時01分45秒)
- パート指定に対応しました。{{ref include_html_rev01.zip}}です。しかし、上述した「HTMLの一部だけを予め定義しておいたいずれかの文字列に置き換えて表示する」というものにはまだ対応しておりません。下手に対応するとパフォーマンス面で負となり得ますので、今後も対応するか否かは未定ということにさせて下さい。 - あき (2005年11月03日 21時03分45秒)
- パート指定動作確認しました。前のページに戻るボタンやウィンドウを閉じるボタンなど、よく使うHTMLを一つに統合でき使いやすくなりました。ありがとうございます。 - テトラン (2005年11月10日 09時18分55秒)
- *_htmlのページを作りサイドバーに表示させると、末尾に<BR>タグがどうしても入ってしまうことがあります。ユーザー編集の<BR>変換は使用するままにしておきたいので、*_htmlファイルのみ末尾の<BR>をいれないためにはcoreプラグインに関わる部分だと思うのですが、どの辺になりますでしょうか。画面表示の変化についてはI.Eのみの現象のようです。(なにか勘違いであればすみません。とても便利に使わせて頂いており、ありがとうございます。) - すなぷ (2005年12月10日 12時33分50秒)
- 書き込みに気付いてませんでした。「末尾」とは、全ての行の末尾でしょうか?それとも、最後の行の末尾でしょうか?「入ってしまうことがある」ということは、「必ず入るわけではない」ということでしょうか?同プラグインはインラインプラグインですので、{{ include_html 〜 }} と記述した後、改行を含めるとその改行が<BR>タグに化けてしまいますが、そういったことでしょうか? - あき (2005年12月12日 13時31分25秒)
- サイドバー云々は関係なく最後の行の末尾でした。失礼しました。改行を含めていなくても<BR>となるようです。なにか対処方法ありましたらよろしくお願いします。 - すなぷ (2005年12月12日 15時06分46秒)
- *_htmlに直接<div style="position: absolute;・・・ で回避できました。おさわがせしました。 - すなぷ (2005年12月12日 17時33分45秒)
- 3.5.10で利用させていただいていますが、気になる点を数点。1.partに分ける際に、HTML記述に空白行を入れてしまうと、そこでincludeが止まってしまうようですね。2.記述例に書かれている「{{include_html banner_html, "!バナー1"}}」ですが、第二引数の前にスペースを入れると、”パートの指定形式が不正です”エラーになってしまいますね。「{{include_html banner_html,"!バナー1"}}」と、第二引数の前にスペースを入れなければ、大丈夫なようです。 - とあるユーザ (2005年12月27日 12時43分17秒)
- ご指摘ありがとうございます。「1.」については原因が分かりました。「どう修正すればいいか?」もだいたい分かっているのですが、検証をしたいので今晩くらいまで待って下さい。「2.」に関しては引数を「"」で囲む場合の制限事項とお考え下さい。プラグインに渡された時には「"〜"」の「〜」の部分だけになっています。 - あき (2005年12月28日 07時58分18秒)
- 修正しました。考えていた修正方法では駄目でした。正規表現のオプションを変えるだけで対応できました。{{ref include_html_rev02.zip}}です。「2.」は「"」で囲ってても囲ってなくても同じですね。「"〜"」内にある「,」をエスケープするだけなのかな? - あき (2005年12月28日 18時15分01秒)
- 早速の修正ありがとうございます。「2.」に関してですが、私はfswikiのプラグイン仕様はよくわからないのですが、第二引数の前にスペースが入っていると""の中だけにはならないようですね。そこで、inline関数の最後のifの直前に以下のような置換を入れてみてはいかがでしょうか?
$part =~ s/^\s*//; $part =~ s/^\"*(.*?)\"*$/$1/;
- とあるユーザ (2005年12月29日 16時41分34秒)
- 調査ありがとうございます。「そんなはずは…」と思って確認してみました。ナルホド、第2引数の前にスペースが入っている場合はエスケープ処理が行われないようですね。でもこれはプラグイン側で対処すべき問題ではない気が…。ですが、使用法に書いてる通りで動かないのも問題ですね。対応しておきました。{{ref include_html_rev03.zip}}です。 - あき (2005年12月30日 01時57分37秒)
- tutenzeともうします。include_html貴重なプラグインだと思います。とても重宝しております。このプラグインのおかげで小生のfswikiページが豊かに表現できるようになりました。ジャバスクリプトも取り込み表示できるのですごいなと思います。今後後もすばらしいプラグインの開発をお願いします。作者のあき様ありがとう - tutenze (2006年01月07日 17時38分39秒)
- このプラグインをDLしてプラグインフォルダにいれてプラグインのチェックをONにしたのですが、その後の使い方がまったくわかりません。- やーな (2006年01月29日 07時06分19秒)
- 使用方法が少々変速的で分かりづらいですね。ですが、安全性確保の為ですので、どうかご理解下さい。では、具体的な使用方法を、チュートリアル形式で記載しておきます。まずは、下記のまんまを実行して頂けると使い方が理解できると思います。- あき (2006年01月29日 09時23分39秒)
1.メニューバーの『新規』をクリックし、「html」というページ名で新規ページを作成します。
2.ページ内容として、下記を貼り付け保存します。
!Google <!-- Google --> <div class="plugin_google" align="center"> <form method=GET action="http://www.google.co.jp/search" > <a href="http://www.google.co.jp/"><IMG SRC="http://www.google.com/logos/Logo_25wht.gif" border="0" ALT="Google" align="absmiddle"></a> <INPUT type=submit name=btnG VALUE="検索"><input type=hidden name=hl value="ja"><input type=hidden name=ie value="EUC-JP"><br> <INPUT TYPE=text name=q size=20 maxlength=255 value=""> </form> </div> <!-- Google --> !検索 <form method="GET" action="wiki.cgi"> キーワード <input type="TEXT" name="word" size="20"><br><input type="RADIO" name="t" value="and" checked> AND <input type="RADIO" name="t" value="or"> OR <input type="SUBMIT" value=" 検 索 "><input type="HIDDEN" name="action" value="SEARCH"></form>
3.メニューバーの『編集』をクリックし、再度、編集画面を開きます。
4.ページの参照・更新権限を『ユーザのみ』に変更し、『参照権限を変更』ボタンをクリックします。
5.メニューバーの『新規』をクリックし、『HTMLの表示』というページ名で新規ページを作成します。
6.ページ内容として、下記を貼り付け保存します。
!!検索 {{include_html html,"!検索"}} !!Google {{include_html html,"!Google"}}
- 解説ありがとうございます! テストでやってみましたが、ページが存在しませんとでました…これはあってるのでしょうか? あと、ページ名は必ずHTMLではいけないですか?複数のページでテーブルタグを使用したいので… - やーな (2006年01月29日 17時03分50秒)
- 解決しました^^; {{include_html html,"!検索"}}のhtmlを1でつくったものと完璧おなじにすればよいのですね。本当にありがとうございました! - やーな (2006年01月29日 17時12分03秒)
- 複数のページで使いたいときは 見出しで区切るんじゃないですか?!1のテーブル !2のテーブルとか。 - むーん (2006年01月30日 12時45分03秒)
- はい、そうです。htmlのページに「!1のテーブル」「!2のテーブル」と区切って記述しておくと、様々なページから、「!1のテーブル」の部分を呼び出したり「!2のテーブル」の部分を呼び出したりできます。 - あき (2006年01月30日 13時01分32秒)
- FreeStyleWiki3.5.11で導入してみましたが、パート呼び出しができず、指定されたパートは存在しません。が表示されます。 - - (2006年05月15日 21時40分54秒)
- 返事が遅くなってすみません。呼び出す側の注意事項としては、パート名に半角スペースが入っているような場合はパート指定部分をダブルクォーティション「"」で囲ってやる必要があったりします。それ以外では、HTMLソースを記載した側のページでは、各パートの区切りに1行分余分に空行を入れてやると、ひょっとすると動くようになるかもしれません。どうしても動かないようでしたら、サンプルを提示して頂いても良いです。(ページ内容をファイルのまま添付とか…) - あき (2006年05月17日 08時08分59秒)
最終更新時間:2006年05月17日 08時08分59秒