ネットにつながなくてもPM読めるようにしてみたよ

一番星
記事: 41
登録日時: 2013年5月27日(月曜日) 11時52分
連絡する:

ネットにつながなくてもPM読めるようにしてみたよ

投稿記事 by 一番星 »

先日、富重さんからPMをいただいた時に、下のほうに
「フォルダのエクスポート」ボタンがあることを発見。
なんだろうと思って押してみたら、富重さんからのPMの履歴がダウンロードされてました。

が、よく見ると、これXMLファイルなので入れ子のデータしか見れない。
そこでちょっとビューアー作ってみたら、とりあえず使えました。
初めてXML使って何か出来た :D

コード: 全て選択

<!DOCTYPE html>
<html lang="ja">
<head>
<meta http‒equiv="Content‒Script‒Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="" />
<title>PMデータを表示</title>

<style type="text/css"><!--
body{ background-color:#F0F0F0; font-family: "游ゴシック体", "Yu Gothic", YuGothic, "ヒラギノ角ゴシック Pro", "Hiragino Kaku Gothic ProN", Meiryo, "メイリオ", sans-serif;}
table, tr, th, td {background-color:white; border:solid 1px black;}
table {width:600px; margin: 0 auto;}
 th{color:white; font-weight:bold; background-color:#4F8D50;}
--></style>

<script type="text/javascript"><!--

  //デバッグ用 alert(xmlDoc.documentElement.childNodes.length); 
  //PMの総数を確認するために一時的に設けた

//読み込み。他によい置き所がないか悩んでます・・・
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc .async = false;
xmlDoc.load("data.xml");

var num=0;   //ボタンで操作するのはこちら側。
var prvmsg = xmlDoc.documentElement.childNodes.length;   // 命名がわかりづらいかも。PMの総数

function display(){
             var i = num;    //表示対象を入れ替えるための変数
             var node = xmlDoc.documentElement.childNodes[i];   //長いDOMを何度も書くのは効率が悪いので、変数にまとめた
             no.innerHTML = i;   //この欄はデバッグ用に設けただけなので0始まり。普通に表示させたいなら1足す
             sub.innerHTML = node.childNodes[0].firstChild.nodeValue;   //件名 <prvmsg>の最初の子要素
             from.innerHTML = node.childNodes[1].firstChild.nodeValue;   //差出人
             date.innerHTML = node.childNodes[2].firstChild.nodeValue;   //日付
             msg.innerHTML = node.childNodes[3].firstChild.nodeValue;   //メッセージ
};
//--></script>
</head>
<body onload="display()">
<p align="center">
     <input type="button" value="前へ" onclick="if(num <=0 ){num=prvmsg -1;} else{num--;}; display();" />
     &nbsp;&nbsp;PHPBB PMデータの読み込み&nbsp;&nbsp;
     <input type="button" value="次へ" onclick="if(num >= prvmsg -1){num=0;} else{num++;}; display();" />
</p>

<table>
<tr>
    <th>No.</th><td id="no"></td>
</tr>

<tr>
    <th>件名</th><td id="sub"></td>
</tr>
<tr>
    <th>From</th><td id="from"></td>
</tr>
<tr>
    <th>日付</th><td id="date"></td>
</tr>
<tr>
    <th>内容</th><td id="msg"></td>
</tr>
</table>

</body>
</html>
上記ファイルをファイル名「○○.html」、文字コード「UTF-8」で保存し、
掲示板からダウンロードしたdata.xmlを同じフォルダの中に入れる。
こうすれば閲覧できます。

とはいえ、まだJavaScript学び始めて1か月しかたってないので、コードがひどいと思う・・・。
読み込み方がさっぱりわからないので、とりあえずXML解説では有名な某ページを参考にして、
ActiveXで読み込ませてみた。
でもこれだと、InternetExplorerだけでしか見られないみたいです・・・。
まあ、とりあえず試作段階で作ってみただけなので。
デザインも、機能づくり優先でかなり大ざっぱな作りです。
良いアイデアがあったら改造してくださいm(_ _)m

最初、1ずつ加算することによってページめくりできるようにしたら、これだと永遠に数が足されていくことに気付いて(笑)、
勘で循環するコードを作ってみた。まあ、なんとか動いてます(;^_^A

今のままだと、改行が反映されてない、リンクがプレーンのまま、日付がデータのままという問題が残ってます。
まだまだ改善の余地はありますね。
一番星
記事: 41
登録日時: 2013年5月27日(月曜日) 11時52分
連絡する:

脆弱性発見・・・

投稿記事 by 一番星 »

すみません・・・。挙げるの早まりすぎたかな。

作成の段階から、これはネット上のXMLも読み込めるのだろうかとの疑問があったので、ちょっと試してみました。
で、GIGAZINのRSSを読み込ませてみたらあっけなく表示されてしまいました。


てっきりjavascriptはセキュリティ上、同一オリジン(同じサイト内)のXMLだけ読み込めるのかと思っていたのですが、
違うみたいです・・・。
RSSはPHPやPearlで読み込むものというイメージがあったのでちょっと意外でした。

まあ、この掲示板はBBコードというのを使用しているため、まずいスクリプトが仕組まれるということはまずないです。
もしPMに変なコードが書き込まれていたら開いた時点で気づきますし。
上記コードも、この掲示板内のものを表示させてみるという前提で作ったので、
その使用範囲内であればまず問題は起こりません。
が、それ以外の用途に使用しようとすると、
innerHTMLの部分で悪意のあるコードが実行される恐れがあるかなと・・・。

このinnerHTMLをinnerTextにすればスクリプトも無毒化され、改行も反映されるのですが、これはInternetExplorerの独自仕様のイメージが強い・・・。

ActiveXも古いやり方(IE6以下)なので、XMLHttpRequestとDOMParserに切り替えないとと思います。
返信する