カテゴリ:カスタマイズ プラグイン改造

変更箇所のまとめ

  • XSS対策
  • ベースネーム表示機能の追加。
  • 画像非表示機能の追加。
  • ページ名からリンクを作成する機能を追加。 (内部リンクのみ)
  • 画像の拡張子を判別して表示する機能追加。

変更の詳細

XSS対策を施す

そのまま使うとXSSの危険性があったためいくつか修正を施す。

URLが不正であった場合にエラーを返すようにする

デフォルトだとURL先のページが存在しなかった場合でもカードの作成に入ってしまうので、そこを修正する。

    $graph = OpenGraph::fetch($ogpurl[0]);
    if ($graph) {
      ...
-   }
+   } else return '#ogp Error: Page not found.';

カード作成前にサニタイズする

例えばリンク先がWikiだった場合、存在しないページでも編集画面に繋がってしまう。
そのため上記修正のみだと不十分なため、return前の適当な場所で引数をサニタイズしておく。

  $imgtag = 'img class="ogp-img"' ;
}

+ $ogpurl[0] = htmlspecialchars($ogpurl[0]);

  return <<<EOD

修正箇所を2つ挙げたものの、XSS対策としては2つ目 (サニタイズ) のみでも大丈夫。多分。

ベースネーム表示と画像非表示オプションを追加

ベースネーム表示機能
Wikiだとページ名が "AAA/BBB/CCC" のように階層化されている場合がある。
この "CCC" に当たる部分がベースネーム。
階層が深くなりすぎると、ページ名が長すぎて行数制限内に収まりきらないことがあるため、オプションでベースネームのみを表示するように指定できるようにする。
画像非表示機能
デフォルトだとリンク先のOGPタグに画像が指定されていないと表示が崩れるため、画像そのものを非表示にする機能を追加する。

最後の方にあるampオプションの処理部分を改変する。

-if($ogpurl[1] == "amp"){
-    $imgtag = 'amp-img class="ogp-img" layout="fill"' ;
-} else {
-    $imgtag = 'img class="ogp-img"' ;
-}
+foreach ($ogpurl as $param) {
+	switch ($param) {
+		case 'amp': // amp
+			$imgtag = 'amp-img class="ogp-img" layout="fill"' ;
+			break;
+		case 'noimg': // 画像なし
+			$imgtag = 'img class="ogp-noimg"';
+			break;
+		case 'base': // ページのbasenameのみを表示 (Wiki系のサイト用)
+			$title = array_pop(explode('/',$title));
+	}
+}
+if (!isset($imgtag)) $imgtag = 'img class="ogp-img"';

CSSに以下を追加。

img.ogp-noimg { display: none; }

画像の拡張子を判別する

そのままだと画像を全て.imgで保存・表示していたため、拡張子を判別する機能を追加する。

まず$imgcacheを別の場所で使うため省略。

 $datcache = CACHE_DIR . 'ogp/' . $ogpurlmd . '.dat';
-$imgcache = CACHE_DIR . 'ogp/' . $ogpurlmd . '.img';

キャッシュがある場合の処理を改変。
datから画像パスを持ってくる。

-if(file_exists($datcache) && file_exists($imgcache)) {
+if (file_exists($datcache)) {
 	$ogpcache = file_get_contents($datcache);
 	$ogpcachearray = explode("<>", $ogpcache);
 	$title = $ogpcachearray[0];
 	$description = $ogpcachearray[1];
-	$src = $imgcache ;
+	$src = $ogpcachearray[2];
 } else {

キャッシュがない場合の処理を改変。
拡張子の判別と画像の保存、datへの書き込みを行う。

        $imgfile = file_get_contents($src);
-       $imginfo = pathinfo($src);
-       /* $imgname = $imginfo['basename']; */
-       file_put_contents($datcache, $title . '<>' . $description . '<>' . $ogpurl[0]);
-       file_put_contents($imgcache, $imgfile);
+       if (empty($imgfile)) {
+           // file_get_contentsに失敗したら専用画像表示
+           // $imgcache = $src; ← 直リンver (オススメはしない)
+           $imgcache = IMAGE_DIR . 'noimg.jpg';
+       } else {
+           // 成功したら画像を保存
+           $extension = array_pop(explode('.', $src)); // 拡張子を取得
+           if (preg_match('/(.+)(\?|\&).+/', $extension, $match)) {
+               $extension = $match[1];
+           }
+           $imgcache = CACHE_DIR . 'ogp/' . $ogpurlmd . '.' . $extension;
+           file_put_contents($imgcache, $imgfile);
+           }
+           file_put_contents($datcache, $title . '<>' . $description . '<>' . $imgcache);

pukiwikiカスタマイズ箇所/ogp.inc.php - 腫瘍学レ点ノート

質問や指摘などあればどうぞ。

コメントはありません。 コメント/プラグインの変更箇所/ogp.inc.php