ノリブログ?

XOOPSのアップデート

カテゴリー:PHP

XOOPSを使い、管理しているサイトの1つにXOOPSのバージョンが古い(2.0.7.3)のままアップデートされていないものがありましたので、脆弱性をふさぐためアップデートを行いました。

XOOPS本体のアップデート

http://xoopscube.jp/modules/xigg/index.php/blog/43
上記の公式サイトより2.0.7→2.0.10 JP→2.0.11 JP→...→2.0.16a JPとCube以前の最新安定版までアップデートしました。
アップデートの方法は圧縮ファイルを展開したディレクトリの中のhtmlディレクトリを使用しているXOOPSのルートディレクトリにコピーするだけで大丈夫です。

module(piCal)のアップデート

XOOPSのmoduleの1つpiCalを使用していましたが、こちらも旧バージョン(0.85x以下)に脆弱性があるので、アップデートを行おうとしました。
http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=54
上記のサイトから最新バージョンをDLしてきてXOOPSのルーとディレクトリに展開。
しかし、その後モジュール管理からモジュールアップデートを行おうとすると以下のようなエラーが出ました。

 Could not update piCal

そこで、一度アンインストールしてから再インストールしようと思いアンインストールの操作をするとまた以下のようなエラーが出ました。

ERROR: Could not delete piCal
メインメニューファイルへの書き込みに失敗しました

どうやら、ファイルのパーミッション関係がおかしくなっていることが原因なようです。今回原因を特定して解決するところまでできなかったので、脆弱性が解決するまで、このXOOPSを停止することにしました。

 

 

PHP - トラックバック送信プログラムの文字化け - UTF-8の半角スペースの文字コード「C2A0」

カテゴリー:PHP

問題
PHPでトラックバックの送信プログラムをUTF-8で作成した。
ところがトラックバックを送信すると半角スペースが「??」に文字化けしてトラックバック先に送られていた。

この原因を調べてみるとトラックバックを送信する際に半角スペースが文字コード:C2A0になっていることがわかった。(UTF-8はASCIIと上位互換があり半角スペースを文字コード「C2A0」,「20」のどちらでも表示する)

これはトラックバックデータを送信するプログラムに、1つ前のプログラムから中のフォームのhiddenの内容を渡される際に が文字コード「C2A0」に変換されることによるものだった。


具体例

  • headのmetaタグ指定例
    <meta content="text/html; charset=UTF-8" http-equiv="content-type">
  • 送信元コード例
  •  <form method="post" action="test3.php">
    <input type="hidden" name="test" value="te&nbsp;st" />
    <input type="submit" />
    </form>
  • 送信先コード例
    <?php echo $_POST["test"];?>

上記の例だと送信もとのinputの値が「te&nbsp;st」になっているのに送信先のechoの結果は「te st」になっており が半角スペースに自動変換されていた。
またこの半角スペースをrawurlencodeして文字コードを表示させると
te%C2%A0st
となっており、スペースの文字コードが「C2A0」になっている。
どうやらこれはブラウザ側がinput hidden内における&nbsp;をUTF-8の文字コード「C2A0」に変換しているようだ。
そしてそれをトラックバック先に送信すると受信先が文字コード「C2A0」をうまく処理できていないため文字化けしていると思われる。


なお、この記事に本文に関係のないトラックバックやコメントがついているのはトラックバック機能のテストを行ったためです。

PHPで日本語簡単グラフ生成

カテゴリー:PHP

PHPでフラッシュのグラフを作る「PHP/SWF Charts」
GIGAZINEに以前PHPでフラッシュグラフを作成するという記事が紹介されていて、
グラフを表示する機能を作る必要が出たので、紹介されているPHP / SWF Chartsを試してみることにしました。

チュートリアル通りにつくってみると案の定、日本語の表示の部分でつまってしまいました。
そこで検索してみると下のサイトにわかりやすく日本語がまとめられてたので参考にしました。
memo.xight.org-PHP/SWF Charts の利用

が、上のソースだと円グラフだと確かに表示されるんですが
グラフを形を"bar"だとか"column"など軸に日本語が出るようなタイプを選ぶと
その部分が表示されないところでハマっちゃいました。

下の画像の感じです。


chart1
営業成績が名前の部分が日本語なので表示されなくて匿名になっちゃいます。。。
これだとグラフだと一発で成績不良がわかっちゃう一番上の彼なんかは大喜びでしょうが
2番のがんばった人なんかが、やるせない気持ちになるとおもいます。

ということでどうやったら日本語が表示できるか調べてみました。
フォント変えてみたり、いろんなグラフの種類を試してみたりしましたが、、、
マニュアルのリファレンスにちゃんとありました。
http://www.maani.us/charts/index.php?menu=Reference
「axis_category」部分の値が表示されない部分に該当してるようです。
ということで以下のようにフォント指定
$chart ['axis_category'] = array(  'font' => "Sans Serif", );
すると、、、
chart2
ちゃんと軸部分の日本語も表示されるようになりました。
成績が伸び悩んでいたのは原君でした。
匿名営業成績なんてものなんかに期待しないでがんばってください。
(原君はテストデータのためにつくられた架空の人物なので彼のことを心配された心優しい方はご安心ください。)

今回のXMLを作成するPHPプログラムのソースは以下のとおりです。

include "charts.php";
$chart [ 'chart_type' ] = "Stacked bar";

$title = array("","山本","田中","山田","原");

$score["1"] = array("1月","5","1","3","1");
$score["2"] = array("2月","2","3","7","2");
$score["3"] = array("3月","3","6","5","1");

$chart [ 'chart_data' ]['0'] = $title;
$chart [ 'chart_data' ]['1'] = $score["1"];
$chart [ 'chart_data' ]['2'] = $score["2"];
$chart [ 'chart_data' ]['3'] = $score["3"];

$chart [ 'chart_value' ] = array(
'font' => "Sans Serif",
);
$chart [ 'legend_label' ] = array(
'font' => "Sans Serif",
);


$chart ['axis_category'] = array(
'font' => "Sans Serif",
);
$chart ['draw'] = array(
array(
'type' => 'text',
'font' => 'Sans Serif',
'x' => '0',
'y' => '-10',
'h_align' => "center",
'v_align' => "bottom",
'color' => "000000",
'size' => 14,
'bold' => true,
),
);
SendChartData($chart);



今回簡単なものをPHP / SWF Chartsで作成しましたが、ソースを見てわかるように、
日本語部分でハマった以外は恐ろしく簡単にできました。これなら複雑なものでもそんなに
時間をかけずにできると思います。
グラフをWebで表示する必要があるかたは是非一度お試しください。

PHPによるHTMLタグの自動補完が原因でjavascript内でエラーが発生

カテゴリー:PHP

ユーザ認証を用いたPHP、javascirptのコードを書いていたが、
どうもブラウザ(firefox 2.0)の起動して1回目にページを表示したときのみ動作しなくなっていた。
動作しない原因を調べるとjavascript内でhtmlタグを格納している関数部分に
ブラウザで出力するときに余計なinputタグが付属してエラーの原因になっていた。

実際のファイルコード

   <script type="text/javascript">
var test;
test = "<form>";
-----略------
</script>
ブラウザに出力されるコード
<script type="text/javascript" src="jkl-resizable.js"></script>
<script type="text/javascript">
var test;
test = "<form><input type="hidden" name="PHPSESSID" value="b0d36a01a4740082be618b92156b9eb5" />";
-----略------


<input type="hidden" name="PHPSESSID" value="b0d36a01a4740082be618b92156b9eb5" />
の部分が勝手に付属したこと"の中にエスケープしていない"が出力されてしまっているのでjavascriptがその部分でエラーを起こし止っていた。
このinputタグがブラウザによって補完されたものなのかサーバ側で補完されているのか確かめるためにetherealでローカルに送られてくるデータを確認した。
送られてくるデータはすでにinputタグがついていたため、これはサーバ側の問題のよう。

そこでPHPのマニュアルを調べると以下のような記述を発見
http://jp.php.net/manual/ja/ref.session.php
url_rewriter.tags  string

url_rewriter.tagsは、透過的なセッションIDの 付加機能が有効となった場合に、セッションIDを含めるために書き換 えられるHTMLタグを指定します。
デフォルトは、 a=href,area=href,frame=src,input=src,form=fakeentry,fieldset= です。

この機能によってjavascriptのコード部分でも<form>という記述があると無理やり書き換えられてしまっているようです。
解決策としてこの自動的に付加される部分のクオーテーションはすべて"であるため、javascript側のコード内のクオーテーションを「'」で書くとエラーは起こりません。

環境
Apache/2.0.52 (CentOS)
PHP/4.3.9

メール送信する際にタイトルが文字化け(mb_send_mail)

カテゴリー:PHP

メールの送信を行うプログラムでmb_send_mailによる多重エンコードが原因で文字化けが発生したのでそのときの解決方法をのせておきます。
ソースは以下のようなものでした

$subject = "タイトル日本語";
$subject = mb_encode_mimeheader(mb_convert_encoding($subject, "JIS", "EUC-JP"), "JIS");
$header .="Content-Type: text/plain; charset=\"ISO-2022-JP\"\n";
mb_language("Japanese");
mb_send_mail("address",$subject, mb_convert_encoding("本文", "JIS", "EUC-JP"), $header);
このソースで2行目でタイトルをメール送信用にエンコードしてますが、mb_send_mailは元からsubjectをmime,base64エンコードするように実装されているため、上記のソースでは多重エンコードされていたようです。
なのでmb_send_mail関数をmail関数に変更して多重エンコードを避けると問題は解決しました。

なおメーリングリストにmb_send_mailにはパッチがあたってないバージョンではバグが存在しているとの情報がありました(下記URL参照)
http://ns1.php.gr.jp/pipermail/php-users/2005-November/028156.html

<< Before