[[../]] RIGHT:&size(12){Category:[[Design>:Design]]}; *内部・外部リンクを区別し、外部リンクにメッセージをつける [#efa9da7d] **概要 [#ge4cffea] ネットゲーム系でちょっとでも人の多いwikiには、RMT業者が広告を、ウィルス配布者がアカウントハックウィルスを含むファイル(主に*.exe)へのURLをバシバシ貼り付けてきます。 URLが貼り付け放題のwikiにおいて、閲覧者がおかしなサイトに飛ばないようにwiki管理者側で制限をかけることを実現します。 **実施概要 [#mb58fa8a] -wikiのmake_linkで、指定されたURLひとつずつについてランキングを行い、ランクに応じてhtmlタグを作成します。 -ランキング判断情報を追加します。 -外部サイトマークを定義します。 ランキングには以下の4タイプを用意します。 :内部リンク(inner) |サイト内リンクです。 :認可リンク(approve) |管理者が知っている無害なサイトへのリンクです。 :禁止リンク(forbid) |管理者が知っている有害なサイトへのリンクです。 :未知リンク(unknown) |管理者の知らないサイトです。 **実施結果 [#xd7492a9] wiki内のリンクは以下のように表示されます。 内部リンクは、(自身に自信がある限り)安全であり、警告などを表示しません。 前:http://inner.site/ 後:http://inner.site/ 認可リンクは、おそらく安全なので警告はしませんが、外部サイトである旨は表示します。 前:http://approve.site/ 後:http://approve.site/[→] 禁止リンクは、その場所に危険なURLが貼られたことを表示し、リンクは表示しません。 前:http://forbid.site/ 後:(この場所に危険なリンクが貼られました。他の部分も信用しないで下さい。) 未知のリンクは、外部サイトであることを表示し、危険性が不明である旨を警告します。 前:http://unknown.site/ 後:http://unknown.site/[→](このサイトは危険かもしれません) **変更箇所 [#a14e5c25] pukiwiki1.4.7で実施しています。 やることは大きく4箇所です。 +wikiのmake_linkに、危険度ランキング判断とhtmlタグを作成するfunctionを定義。 +wikiのmake_linkに、従来は<a>タグを自作していた部分で、上記functionを通して作成するよう振り向け措置。 +rules.iniに、ランキング判断情報を追加。 +外部サイトマークを定義。 まず/rules.ini.phpに、以下のようにランキング判断情報を追加。設定はもちろん各自用に変更してください。 -添付ファイル:[[うちのページ>http://aden.jias.jp/dt/?PukiWiki%B2%FE%C2%A4%2F%A5%EA%A5%F3%A5%AF%A4%CE%C6%E2%B3%B0%C8%BD%C4%EA]]の''link_permission_list.txt'' この変数は単純な配列で、その要素は連想配列が入っています。この連想配列の内容は以下の通りです。 :lank| 危険度ランクです。inner、approve、forbidのいずれかが入ります。このリストに該当しないものはすべて未知扱いです。 :url| URLです。正規表現(ただし/exp/のような前後のスラッシュはつけない)です。ひとつずつマッチさせて調べます。 :notice| メッセージです。禁止リンクが貼られた場合に、リンクを表示せず、それが危険である理由を説明します。noticeがない場合はデフォルトの警告メッセージを表示しますので、必須ではありません。 次に、ランキング判断functionを作成します。/lib/make_link.php内のどこかに、以下のfunctionを貼り付けて作成完了です。長いのでテキストファイルで。 -添付ファイル:[[うちのページ>http://aden.jias.jp/dt/?PukiWiki%B2%FE%C2%A4%2F%A5%EA%A5%F3%A5%AF%A4%CE%C6%E2%B3%B0%C8%BD%C4%EA]]の''checkoutersiteurl.txt'' そして、<a>タグを自作している部分を、上記functionを通して作成するように変更します。/lib/make_link.php内には3箇所の該当個所があるので、すべて改造します。 class Link_url extends Link ~略 function toString() { ~略 //return '<a href="' . $this->name . '"' . $rel . '>' . $this->alias . '</a>'; return checkOuterSiteURL($this->name,$this->alias); } class Link_url_interwiki extends Link ~略 function toString() { //return '<a href="' . $this->name . '" rel="nofollow">' . $this->alias . '</a>'; return checkOuterSiteURL($this->name,$this->alias); } class Link_mailto extends Link ~略 function toString() { //return '<a href="mailto:' . $this->name . '" rel="nofollow">' . $this->alias . '</a>'; return checkOuterSiteURL('mailto:'.$this->name,$this->alias); } 最後に外部マークの定義ですが、cssの編集になります。/skin/pukiwiki.css.phpを開き、以下のように付け加えます。 div#body a.external{ padding-left:16px; background:url(outside.png) no-repeat left bottom; } そして、outside.png(外向きリンクであることを示す画像)を適切な位置にアップロードすれば準備完了です。なお、「div#body」を付けるのを忘れると、メニューバーにも外部サイトマークがついてしまうので場合によっては不便です。付けておけば、本文部だけにマークがつきます。 *ヒント [#mcc9356f] -ランキング判断情報は、リストの上にあるものほど優先度が高くなります。たとえばリストの一番上に「*.exe」を「禁止」にする設定をしておけば、「認可」サイト内にexeがある場合も「禁止」が優先されます。 -ウィキファームを作るなど、ひとつのサイト内にrules.iniが沢山できてしまうような使い方をしている場合は、ランキング判断情報を/lib/make_link.php内に直接書いておくと設定を共通化できます。 *すぺさるさんくす [#l5c6c3c6] [[でぃあばぁ]]さんの [[cubic9.com:PukiWiki/改造/内部・外部リンクを区別する]] を改造させていただきました。m(_ _)m *コメント [#a4d0b79c] - こちらの需要でこんなもの考えてみました。突っ込みをお願いします。 -- [[フォルグロス]] &new{2006-10-21 (土) 18:14:36}; - お疲れ様です。これはいつ、誰による仕事で、でぃあばぁさんのどの仕事をどう改造したのですか? -- &new{2006-10-21 (土) 20:03:47}; - すいません、よくみたら経緯がぜんぜんなかったですね。[[BugTrack/730#v827bf64]]の会話にあった「内部・外部サイトを区別する」について、「外部サイトの危険性を判断する」機能を自分が取り付けたものです。 -- [[フォルグロス]] &new{2006-10-22 (日) 20:49:46}; #comment