PHPプロ!TIPS+
1. Newtを使ってユーザインタフェースを作ろう
TIPSメーリングリストでは何回か対話形式のコマンドラインプログラムを紹介しています。今回はNcurses端末画面制御関数の回で少しふれたNewtという拡張モジュールを紹介したいと思います。
このNewt拡張モジュールは、RedHat Newtライブラリを用いて対話形式のインターフェースを作成する拡張モジュールです。使用するにはlibnewtが必要になるので、あらかじめシステムにインストールしておかなければなりません。
libnewtの準備ができたらこの拡張モジュールをインストールします。なお、libnewtを使用するためWindowsプラットフォームでは使用することができません。
pecl install newt
これで完了です。では、早速使ってみることにしましょう。以下、サンプルスクリプトを実行してみてください。
<?php
newt_init();
newt_cls();
newt_draw_root_text(0, 0, "サンプルスクリプト");
newt_push_help_line("");
newt_draw_root_text(-9, 0, "PHPプロ!");
newt_centered_window(34, 17, "メニュー");
$form = newt_form();
$list = newt_listbox(3, 2, 10);
$item_list = array("アイテム1", "アイテム2", "アイテム3", "アイテム4");
foreach ($item_list as $item) {
newt_listbox_add_entry($list, $item, $item);
}
$button_next = newt_button(5, 12, "次へ");
$button_exit = newt_button(21, 12, "終了");
newt_form_add_component($form, $list);
newt_form_add_components($form, array($button_next, $button_exit));
newt_refresh();
newt_form_run($form, $result);
newt_pop_window();
switch ($result['component']) {
case $button_next:
$select_item = newt_listbox_get_current($list);
newt_win_message("結果", "OK", "選択したのは「" . $select_item . "」で
す");
break;
case $button_exit:
newt_win_message("終了", "OK", "終了します");
break;
default:
break;
}
newt_finished ();
newt_form_destroy ($form);
?>
実行すると、4つのアイテムをリスト表示されて「次へ」「終了」というボタンが表示されます。いずれかのアイテムを選び「次へ」ボタンをクリックすると選択したアイテム名を表示します。また「終了」ボタンを押すと終了します。
このサンプルスクリプトでは日本語を使用しています。もし文字化けやレイアウト崩れがある場合は、スクリプトの文字コード、ターミナルのローケルがEUC-JPになっているか確認してください。EUC-JPの環境であればこのように日本語でも使用することができます。
今回はリストボックスとボタンを使用しましたが、この他にもチェックボックスやテキストボックスなど各ウィジェットがそろっています。興味のある方は使ってみてはいかがでしょうか。
2. Crack関数でパスワードの安全度を確かめよう
セキュリティについて、みなさん開発者なら当然細心の注意を払って開発を行っているとは思います。しかし、システムを利用する側の多くのユーザは、システムをある程度信頼し、IDとパスワードがかかっていれば大丈夫などと思いがちです。
そのため、パスワードに覚えやすいものや、入力しやすいものを設定する人も多いのが現状です。しかし、そういった単純なパスワードは「ブルートフォースアタック」と呼ばれる、辞書ファイルなどからの総当り攻撃に非常に弱いといった問題があります。そこで、PHPのCrack関数の出番です。
Crack関数( http://www.phppro.jp/phpmanual/php/ref.crack.html )とは、PECLとして提供( http://pecl.php.net/package/crack )されており、パスワードの「強度」を試すためのCrackLib( http://sourceforge.net/projects/cracklib )ライブラリが使用可能となります。
ユーザがパスワードを設定する際に、パスワードの強度をチェックすることができます。
それでは、早速試してみたいと思います。今回の環境は、CentOS5、PHP5.1.6、crack-0.4となります。(CrackLibライブラリがインストールされていない方は、上記CrackLibのサイトからダウンロードしインストールしてください。)
まずは、crackモジュールのインストールです。PECLとして、提供されていますので、インストールはpeclコマンドで簡単に行えます。
$ pecl install crack
(しかし、今回の環境ではエラーがでてしまいましたので、以下の方法でインストールしました。)
$ pecl download crack $ tar xvzf crack-0.4.tgz $ cd crack-0.4 $ phpize $ ./configure $ make $ make install
そして、crackモジュールをphp.iniで読み込むように設定します。
$ vi /etc/php.ini extension=crack.so
apacheを再起動し、phpinfoで確認してみましょう。
※phpinfoの内容
次にCrackLib用の辞書ファイルを用意します。英単語ファイルはyumでインストールできます。
yum install words.noarch
インストールした、wordsファイルから、CrackLib用の辞書ファイルを作成します。
$ create-cracklib-dict /usr/share/dict/linux.words $ ls /usr/share/cracklib/ cracklib.magic pw_dict.hwm pw_dict.pwd pw_dict.pwi
これで、準備が整いました。
それでは、動作をマニュアルにあるサンプルスクリプトで試してみます。
<?php
// CrackLib 辞書をオープンする
$dictionary = crack_opendict('/usr/share/cracklib/pw_dict')
or die('Unable to open CrackLib dictionary');
// パスワードチェックを行う
$check = crack_check($dictionary, 'password');
// メッセージを取得する
$diag = crack_getlastmessage();
echo $diag;
// 辞書を閉じる
crack_closedict($dictionary);
?>
上記では、チェックする文字列を「password」としています。すると結果は「it is based on a dictionary word」と辞書ファイルに基づいた値だと、メッセージを返してくれます。
強度チェックによるメッセージ(crack_getlastmessageの戻り値)は、以下の9種類になります。
- it’s WAY too short
- it is too short
- it does not contain enough DIFFERENT characters
- it is all whitespace
- it is too simplistic/systematic
- it looks like a National Insurance number
- it is based on a dictionary word
- it is based on a (reversed) dictionary word
- strong password
このように、簡単にパスワードの強度を判定することができます。
文字数制限などはよく見かけますが、こういった辞書の単語を使った強度チェックをしているところはあまり見かけません。弱いパスワードだからといって設定させないようにすると、ユーザの使い勝手が悪くなってしまうことがあるでしょう。
エラーとしてではなく、あくまでも警告程度で表示をしてあげるくらいの価値はあると思います。
システムを堅牢に作っているからこそ、ユーザにもある程度強度のあるパスワードを設定してもらうことが望まれます。ユーザに、セキュリティの意識を持たせる意味でも是非、利用してみてください。
バックナンバーについて
TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。






ページのトップへ


今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!