Archive : 2008

DEC
12

Eclipse CDT セットアップメモ

Published:2008-12-12 21:45:03 UTC

大学の授業で今学期からC言語を触り始め、gccを使う必要に迫られているのですが、自分はIDEがなければ何も出来ないヘタレなので、Eclipse CDTをセットアップし、IDEでデバッグ出来るようにしてみました。このエントリはその際の自分向け参考URLメモ。

組み込み開発におけるEclipseの有効性(1/2) - @IT MONOist

基本はこの流れにそって環境構築。但し、cygwin のパスマッピングについての設定が更に必要だったので、その点についてはK-na TechNotes | CDT のトラブル対策を参考にしました。

ここでは、以下のマッピングを設定します。マッピングは [Add…] をクリックすることで行うことができます。

Compilation path Local file system path
¥ C:¥
¥cygdrive¥c C:¥
¥usr¥lib C:¥cygwin¥lib

なお、「C:¥cygwin」は Cygwin をインストールした場所に置き換えてください。 

あと、上記サイトのこの記述ですが、¥cygdrive¥cの円マークは、入力時は「/」であることに注意。

DEC
10

Expanded Live Mesh for Mobile CTP

Published:2008-12-10 11:55:26 UTC

imageWindows Mobile向けLive Meshを利用できるユーザー数が拡大されたようです。

Live Mesh : Expanded Live Mesh for Mobile CTP

ということで自分も早速入れてみました。

正直言ってIEコンポーネントを利用していると思しきUIの操作性はあまりよろしくないのですが、撮った画像がいつの間にかに同期されてラップトップのフォルダ内に納まっているというのは、確かに夢がありますね。

image

追記:

特に自動起動でバックグラウンドで走り出すようではないようです。とりあえずスタートアップに登録してみてあるのですが、いちいちフォームが表示されるのはリソースの無駄だよなぁ、と思わないでもありません。UIの使いづらさは、WindowsMobileである以上どうしようもないものだとあきらめていますが、それ以外は機嫌よく使えています。

DEC
10

Touch Diamondのセンサ

Published:2008-12-10 00:30:40 UTC

マルチタッチこそないものの、Touch Diamondにも豊富なセンサが搭載されています。加速度センサ、環境光センサ、カメラ、GPS…。スタイラスがホルダに挿入されているかさえTouch Diamondはセンスしています。しかし、Windows MobileのAPIで取得できるのはカメラ映像とGPSだけに限られており、HTCもAPIを公開していないので、標準では加速度センサなどの情報を自作アプリから取得することは出来ません。

ですが。世の中には凄い人もいるもので、それら公開されていないセンサ情報を取得する方法を調べあげ、マネージコードから扱えるライブラリとして纏めてしまった方がいます。

Scott’s Weblog
My Brain Hurts: HTC Touch Diamond Nav Sensor API

自分でもサンプルを動かしてみたり、スタイラスの状態取得ライブラリを使うツールを書いてみたりしましたが、色々応用が利きそうで面白いですね。プログラマブルな高性能小型デバイスとしては、iPhone/iPod Touchがメジャーですが、どうせなら.NETの知識を生かして開発したいという方は、HTCのTouchシリーズを検討されてみてはいかがでしょうか。

DEC
8

WordPressのセキュリティ

Published:2008-12-08 02:01:06 UTC

高木浩光@自宅の日記 – 公衆無線LANで使うと危ないiPod touchアプリに注意

こういう記事を見るたびに不安になるのだけれど、WordPressでセキュリティを確保するのってどうすりゃいいんでしょう?自分はセキュリティについて殆ど知識がないんですが、HTML Form経由でもXML-RPC経由でもパスワードは平文で送信された筈ですが、これは相当ヤバいんでしょうか。Atom-Pub経由なら長めのパスワードを設定しておけば安全と考えていいのかな?

DEC
8

今年のお気に入りの一品リスト

Published:2008-12-08 00:32:17 UTC

hiromasaさんのところにさらに続きまして、自分も今年買ったものでお気に入りの一品を紹介してみます。

まずハードウェア。

image 一番手はBenQのG2000Wという液晶モニタ。これは良かった。別にBenQのこの商品が取り立てて優れているというわけじゃないんだけど(でも二万強という値段は素晴らしかった)、使い始めてみて、広い画面の快適さ、デュアルディスプレイ環境の快適さに感動。このBenQのモニタにVisual Studioを表示させながらラップトップの液晶にFirefoxでググれるのは便利なことこの上なし。大学でプログラム書くよりも、家で引き籠って書くようになりがちなのはこのモニタの影響が非常に大きいかも。

imageそれに続くは、やはりEmobileのTouch Diamond。先代のW44T時代から使っているBluetoothオーディオレシーバーと組み合わせることで、音楽を聴きながらブラウジングをするという長年の夢が叶いました。カメラもAFが付いていたりと使い勝手が良いのでついつい長く使ってしまい、電池の減りが激しくて困ることもありますが…。自分でプログラムを書いてみて遊ぶーというのは、なかなか暇がなくてあんまりまだ出来ていないですが、色々試してみたいことは溜まっているので、これからも楽しめそうです。

次、本。

今読んでいる本ですが、この「標準講座C#」という本は凄く分かりやすくてC#の文法の総復習に役立っています。オライリーの本やMicrosoft Pressの本は小難しく書かれていて文字ばっかで、読んでいて引っかかるところが多いのでちょっと苦手です。しかし文法の話とFCLの話の区別さえされていないような簡単な本というのもちょっと…という僕みたいな人間には最高にマッチしていました。図やサンプルコードが多くて、でもHead Firstシリーズのようなゴテゴテ感はなくて、自然と頭に内容が入ってくる良本です。これは装丁が良いのか、訳が上手いのか、原文からして解りやすい名文だったのか…きっと全部でしょう。そのうちこの本を読んで初めて知った機能や仕様についてエントリにまとめてアップしてみようかと考えています。

そしてソフトウェア。

買ったもの―とは言えませんが、WordPressとWindows Live Writerの組み合わせが今年一番のヒットでした。このスキームなくしてこんなに効率良くエントリを上げていくことは出来てないと思います。ところで、このBlogの前のBlogの過去エントリを漁ってみると、今年の二月の頭の時点では自分にとって「WordPress?何それ美味しいの?」ってレベルだったんですよね。PHPも文法すらまったく知らなかったし。最初はMovableTypeを使ってレン鯖でブログを立ち上げようとして、MovableTypeのテンプレートタグの訳分からなさに挫折して、PHPでテンプレートが書ける!という話を聞きつけてWordPressに転向したのが二月の半ば。それからちまちま整備を進めてよくこそここまでこれたなぁと思う今日この頃です。

WP-XML-RPCLib、バグフィックスのため差し替えました。原因はblogger系のXMLRPCメソッドに渡すべきパラメータをちゃんと把握していなかったため。例えばdeletePostメソッドですが、

	/* blogger.deletePost ...deletes a post */
	function blogger_deletePost($args) {
		$this->escape($args);

		$post_ID     = (int) $args[1];
		$user_login  = $args[2];
		$user_pass   = $args[3];
		$publish     = $args[4];

上のxmlrpc.phpの抜粋を見てわかるように、使うパラメータのインデックスが1から始まっています。実は元々のbloggerのAPIでは0番目のパラメータとしてappkeyが入る仕様だったようですが、WordPressではそこは空ける仕様になっていました。

ind_img_04[1]溜まっていたRSSを処理していて知ったのだけれど…

フルキー&テンキー搭載スマートフォン「Dual Diamond」
イー・モバイルから – ITmedia News

ばっかやろう!
キーボード付端末を出すなら早く言え!

と悪態をつきかけたのは自分のTouch Proへの未練の深さゆえか。だってやっぱりTouch Diamondの文字入力はしにくいですから…(2.8inchの画面でソフトウェアキーボードを操るのはどうひいき目に見ても相当厳しい)。

幸いなことに?このDual Diamond、よくスペックを精査してみると、搭載OSがWM6.1 Standard版であることからわかるように、Touch入力がなかったり、画面の解像度が低かったりと別に美味しい端末でも何でもなかった。いやはや焦った焦った…。

DEC
5

Gregariusインストール

Published:2008-12-05 23:58:00 UTC

hiromasaさんのところで紹介されていたサーバー設置型RSSリーダー、Gregariusの設置を試みています。ラップトップが壊れてみて、一週間ほどRSSのチェックが出来なくなっていた反省から、Webベースのリーダーに移行してみようかなぁということで。これまではUIの貧弱さからWebベースのアプリは嫌っていたのですが、自分のサーバーで動かせるのは魅力的かなぁと思い、心がわりしてみました。

image

とりあえず、XAMPPで走らせられるのを確認。

12-06 00:26 追記:sharplab.netでも動いたー!

12-06 01:10 追記:Firefoxにフィードリーダーとして登録できるんですね。こりゃ便利。

image

突然ですが、ここで問題です。以下の二つの文の結果は、同じものであると考えてよいでしょうか?

the_search_query();
echo(get_search_query());

これ、同じと考えては駄目なんですね。異なると考えた人も、ちゃんと異なる結果が返されうる理由を説明できましたでしょうか?これを勘違いしたままWordPressのテーマを書いていると、クリティカルな脆弱性の元になるので、結構重要な問題です。

実は、get_search_query関数の戻り値は、the_search_query関数の出力と異なり、サニタイズがかかっていません。そのため、<?php echo(get_search_query()); ?>というコードがテーマ中に存在すると、script injection攻撃を仕掛けられる危険性があります。攻撃を受けた場合、投稿データなどの全削除すらされ得るでしょう。

パッと思いつく攻撃方法としては、Javascript呼び出しを含むタグを仕込んだ攻撃用検索クエリURLをエンコードしたtinyURLをそれっぽい誘導文とともにコメントとして攻撃対象のBlogに貼り付け、といった具合でしょうか。上手いこと管理権限を保持したままBlogの管理人がそのリンクを踏んでくれれば、管理人に対し任意のスクリプトを埋め込んだ状態で対象サイトを表示させることが出来ます。WordPressで作られたサイトは、普通一般に見せる部分と管理画面とで、ドメインが異なるということがないので、スクリプト実行時のクロスドメイン制約に悩まされることなく、iframeなどを使ってやりたい放題出来るんじゃないでしょうか。

昨日大学の研究会のD1の先輩に、「一般論としてセキュアなコーディングをする上で心掛けることってなんでしょう?」と訊いたところ、「とにかくプログラムの入力に渡されうる値を把握すること」と言われましたが、これもまさに同じことで、WordPressの関数であっても、the_search_query()とget_search_query()は出し方が違うだけで返すデータは一緒だろ―と安易に考えず、ちゃんとサニタイズされているかを確認する必要がありますよ、というお話でした。

ちなみにこの落とし穴、自分でこのサイトのテーマを弄っているときにうまくサニタイズされていないことに気づいたのがきっかけで知ったのですが、WP2.5の時点ではデフォルトテーマでさえ引っかかっていたようです。((;゜Д゜))))

DEC
5

XMLRPCでeval

Published:2008-12-05 21:24:24 UTC

今回もWordPressのXML-RPCについて。但し、今回はサーバーサイドのお話。XML-RPCを使うと、WordPressのエントリやコメントなどを外部のプログラムから弄ることが出来てなかなか便利ですが、アクセスできるのはあくまでもXML-RPCのメソッドとして公開されている部分だけです。自分でメソッドを追加できたらなー。寧ろ任意のPHPスクリプトを実行できたら便利じゃね?ということで、引数として渡したPHPコードをeval関数で評価した結果を返すXML-RPCサーバーをxmlrpc.phpを改変して作ってみました。思いつきで試しに書いてみただけなので、プラグインとして纏まっていないのはご愛嬌。customrpc.phpとでも名前をつけて、xmlrpc.phpと同じディレクトリに配置すると動きます。

<?php
/**
 * Custom RPC Server
 * created by shiroica
 * @license GPL v2 <./license.txt>
 * Most of this code is based on "xmlrpc.php" file of WordPress.
 */

/**
 * Whether this is a XMLRPC Request
 *
 * @var bool
 */
define('XMLRPC_REQUEST', true);

// Some browser-embedded clients send cookies. We don't want them.
$_COOKIE = array();

// A bug in PHP < 5.2.2 makes $HTTP_RAW_POST_DATA not set by default,
// but we can do it ourself.
if ( !isset( $HTTP_RAW_POST_DATA ) ) {
	$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
}

// fix for mozBlog and other cases where '<?xml' isn't on the very first line
if ( isset($HTTP_RAW_POST_DATA) )
	$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);

/** Include the bootstrap for setting up WordPress environment */
include('./wp-load.php');

include_once(ABSPATH . 'wp-admin/includes/admin.php');
include_once(ABSPATH . WPINC . '/class-IXR.php');

// Turn off all warnings and errors.
// error_reporting(0);

/**
 * Posts submitted via the xmlrpc interface get that title
 * @name post_default_title
 * @var string
 */
$post_default_title = "";

/**
 * Whether to enable XMLRPC Logging.
 *
 * @name xmlrpc_logging
 * @var int|bool
 */
$xmlrpc_logging = 0;

/**
 * logIO() - Writes logging info to a file.
 *
 * @uses $xmlrpc_logging
 * @package WordPress
 * @subpackage Logging
 *
 * @param string $io Whether input or output
 * @param string $msg Information describing logging reason.
 * @return bool Always return true
 */
function logIO($io,$msg) {
	global $xmlrpc_logging;
	if ($xmlrpc_logging) {
		$fp = fopen("../xmlrpc.log","a+");
		$date = gmdate("Y-m-d H:i:s ");
		$iot = ($io == "I") ? " Input: " : " Output: ";
		fwrite($fp, "nn".$date.$iot.$msg);
		fclose($fp);
	}
	return true;
}

if ( isset($HTTP_RAW_POST_DATA) )
	logIO("I", $HTTP_RAW_POST_DATA);

/**
 * error2ExceptionConverter - handle an error and throw it as an exception.
 */
function error2ExceptionConverter($errno, $errstr, $errfile, $errline) {
	throw new Exception($errstr, $errno);
}



/**
 * XMLRPC server implementation that enables users to evaluate passed PHP code.
 */
class custom_rpc_server extends IXR_Server {

	/**
	 * Register all of the XMLRPC methods that XMLRPC server understands.
	 *
	 * PHP4 constructor and sets up server and method property. Passes XMLRPC
	 * methods through the 'xmlrpc_methods' filter to allow plugins to extend
	 * or replace XMLRPC methods.
	 *
	 * @since 1.5.0
	 *
	 * @return wp_xmlrpc_server
	 */
	function custom_rpc_server() {
		$this->methods = array(
			'eval' => 'this:callEval'
		);
		$this->methods = apply_filters('xmlrpc_methods', $this->methods);
		$this->IXR_Server($this->methods);
	}

	/**
	 * Evaluate passed PHP code by "eval()" function.
	 * @param array $args Method Parameters.
	 * @return depends "eval()" function returned.
	 */
	function callEval($args) {

		$user_login = $this->escape($args[0]);
		$user_pass  = $this->escape($args[1]);
		$code_str   = $args[2];

		set_current_user( 0, $user_login );
		if( !current_user_can( 'edit_posts' ) )
			return new IXR_Error( 401, __( 'Sorry, you do not have access to user data on this blog.' ) );

		if (!$this->login_pass_ok($user_login, $user_pass)) {
			return $this->error;
		}
		set_error_handler('error2ExceptionConverter');
		try{
			@$result = eval($code_str);
		}
		catch(Exception $exception){
			restore_error_handler();
			return new IXR_Error( 500, __( 'Runtime error was occurred while executing your code.' ) );					
		}
		restore_error_handler();
		if($result === false){
			return new IXR_Error( 500, __( 'Parse error was occurred while executing your code.' ) );					
		}
		return $result;
	}

	/**
	 * Check user's credentials.
	 *
	 * @since 1.5.0
	 *
	 * @param string $user_login User's username.
	 * @param string $user_pass User's password.
	 * @return bool Whether authentication passed.
	 */
	function login_pass_ok($user_login, $user_pass) {
		if ( !get_option( 'enable_xmlrpc' ) ) {
			$this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this blog.  An admin user can enable them at %s'),  admin_url('options-writing.php') ) );
			return false;
		}

		if (!user_pass_ok($user_login, $user_pass)) {
			$this->error = new IXR_Error(403, __('Bad login/pass combination.'));
			return false;
		}
		return true;
	}

	/**
	 * Sanitize string or array of strings for database.
	 *
	 * @since 1.5.2
	 *
	 * @param string|array $array Sanitize single string or array of strings.
	 * @return string|array Type matches $array and sanitized for the database.
	 */
	function escape(&$array) {
		global $wpdb;

		if(!is_array($array)) {
			return($wpdb->escape($array));
		}
		else {
			foreach ( (array) $array as $k => $v ) {
				if (is_array($v)) {
					$this->escape($array[$k]);
				} else if (is_object($v)) {
					//skip
				} else {
					$array[$k] = $wpdb->escape($v);
				}
			}
		}
	}
}

$custom_rpc_server = new custom_rpc_server();

?>

ユーザー名、パスワード、評価させたいPHPコードを引数として渡すと、評価された結果が帰ってきます。戻り値はThe Incutio XML-RPC Library for PHPでパースできるデータ型で構成されていないとまずいかも。自分でも全然使っていないからよく分からない(笑)。あと、eval関数の都合上、戻り値がfalseだと実行時エラーと区別がつかないので、戻り値はbool型はやめましょう。