rm -rf /をするとどうなるのか

7月 22nd, 2007 admin

Matz日記からこんなサイトを見つけた。

こんなTシャツはエンジニアしか思いつかないぜ!夏/Tech総研

こういうネタ系Tシャツはあまり好きじゃないのだけど、この中に

rm -rf /

とプリントされたTシャツがあった。これはルート以下のファイルを全部消すということなのでWindowsでいうならCドライブのファイルを全消去するようなものだ。

しかし

FITムートン: 「rm -rf /」は全消去ですね。rootで打つってことは、もう何から何まで……。

という発言が気になった。確かに全消去だけど、全部は消えないでしょ
そこでなんだか昔から100万回は繰り返されてきた実験な気もするけど、やっぱり自分でやってみたいのでテストしてみた。
(そんなの小学生の時に終わらせておけという声が聞こえてきます・・・)

準備

  • VMwarePlayer
  • Debian etch

ビビリなんで仮想環境で・・・まあcoLinuxなんかとは違うので(何とかエミュレーション、なんていうのかは忘れた)実機と同じことができると思われる。

実験方法

root権限で

rm -rf /

と入力するだけ。

予想

  • /bin/rmが消えて止まる->再起不能
  • /sbinが残る

結果

console.png

途中で止まるのかなと思いましたがそうでもなく、普通に終了しました。
消せなかったファイルは

  1. Operation not permitted
  2. Debice or resource busy

の2種類のようです。

console2.png
コマンドもこれだけに減っていました。

結論

残ったディレクトリは

  • sys
  • dev
  • lib
  • prog

でした。僕の予想ははずれ/sbinも/binも消えてしまい、けっこう絶望的な状態になりました。それでもコマンドが打てるのはスーパーハカーすげーという感じです。ログアウトしてみたら、もう動かなくなりました・・・

残ったディレクトリについてはDebian ディレクトリー構成に説明があります。

CakePHP::mcrypt用(暗号化)のコンポーネント

7月 16th, 2007 admin

個人情報を扱うアプリケーションなどで、万が一データベースの中身が抜かれても(復号キーさえ盗まれなければ)(ほぼ)大丈夫なようにデータを暗号化して保存しておくことを考えてみた。

ダウンロード


cakephp_components_mcrypt.zip

cakephp_components_mcrypt1.zip v0.2

準備

通常はVMWAREなどでテスト環境を作って開発を行うのだけど、今回はお手軽にXAMPPを使っている。
XAMPPのphp.iniはなぜか3つあり、mcryptを有効にするまで3つとものextension=php_mcrypt.dllを有効にした。(たぶんどれか必要ない)

c:\xampp\bin\php.ini
c:\php\php.ini
c:\php\php4\php.ini

でapacheを再起動

debianだと

apt-get install php5.1-mcrypt
apache2 -k graceful

だけでOK。

mcryptが使えない人にはPEAR::Crypt_Blowfishがあるが、これはブロック暗号化モードでECBモードしか選べないということなので十分に安全とはいえないので注意。

設置

/app/controllers/components/mcrypt.php
に置くだけ

使用例

/app/controllers/users_controller.php

class UsersController extends AppController {

  var $name = 'Users';
  var $components = array("Mcrypt");

  function index(){
    $test = "VISA::0011-2233-4455-6677::日本タロウ";
    $encrypt = $this->Mcrypt->encrypt($test);
    $decrypt = $this->Mcrypt->decrypt($encrypt);
    echo $encrypt."";
    echo trim($decrypt)."";
  }
}

出力

�pZ�s“ ���Du�n���"��SE�"�Q{x����u�b
VISA::0011-2233-4455-6677::日本タロウ

参考サイト

mcrypt 関数 (コロンブスの卵)
ブロック暗号モード(block cipher mode) triplefalcon
人力検索 PHPでの文字列暗号化で、どの暗号種類を使ってよいかわかりません・・・

Todo

  • row_keyを置く場所は、apacheしかアクセスできない場所がよい

mysqlに保存するときは

PHP: mcrypt_generic - Manual

もし MySQL データベースにデータを格納する場合は、 varchar フィールドに値を挿入する際に末尾のスペースが取り除かれることを 覚えておきましょう。暗号化されたデータの最後にスペース(ASCII 32)が 含まれていた場合、この処理によってデータが破壊されてしまいます。 かわりに tinyblob/tinytext (あるいはより大きな) フィールドを 使用してください。

2007/07/16 追記
初期化ベクトルIVを毎回初期化していたのですが、セッションをまたぐ場合にIVの値が違うと復号できないので固定に修正。
phpマニュアルでは固定では駄目なようなことが書いてあるが、そのコメントのところでは「それは間違っている」と書いてある。
僕も間違っていると思うのだが・・・

CakePHP::ViewをJavascriptで出力

7月 12th, 2007 admin

ViewをJavascriptで出力という表現があっているかどうかわかりませんが・・・Viewの内容をdocument.writeで書き出してくれます。

コード

/app/controllers/ads_controller.php

< ?php
class AdsController extends AppController {

	var $name = 'Ads';
	var $layout = "javascript";

	function index(){
		$this->set('data','exaple data');
	}
}
?>

/app/views/layouts/javascript.thtml

< ?php
header("Content-type: application/x-javascript");
$content_for_layout = r(array("\r\n","\n"),"",$content_for_layout);
echo 'document.write("'.r('"','\"',$content_for_layout).'")';;
?>

/app/views/ads/index.thtml

< ?php echo $data ?>

example.html

<script type="text/javascript" src="http://localhost/cake/ads/"></script>

出力

example.html

exaple data

ポイントはコントローラーでjavascript用のレイアウトの使用を宣言すること、レイアウトで、javascriptのヘッダを出力し、ビューの改行を削除しているところです。(1行づつdocument.writeをつけたほうがいいかも。)

※r()はCakePHPが用意してくれているstr_replaceのラッパー

PHPで標準あいまい検索

7月 11th, 2007 admin

あいまい検索の実装について考えていたら、考えるまでもなく標準で実装されていました。similar_textっていう関数らしいです。

php.netのあいまい検索を使ってJavaScriptのリファレンスを検索する
http://labs.gmo.jp/blog/ku/2007/04/phpnetjavascript.html

PHPには similar_text という二つの文字列が似ている度合いを計算してくれる関数があるのをこのとき知りました。それもPHP4からあります。PHPは文字列の類似性判定をする関数が豊富で、このほかにも levenshtein, soundex, metaphone があるそうです。

すごいなー。英単語にいたっては音が類似しているものまで検索可能だそうです・・・こういうのが標準で入ってるあたりがPHPっぽいですね。

早速試してみました。日本語でもなんとなくいけているっぽいです。
noreturn.GIF

コード

noreturn.php

<form action="" method="get">
<input type="text" name="str" value="<?=$_GET['str']?/>">
<input type="submit" name="submit" value="あいまい検索"/>
</form> 
< ?php
$dic = array("ノーダウト","ノープロブレム","ノーリスク","ノーリターン");
$point = 0;
$per = 0;
$answer = '';

if(isset($_GET['str'])){
$str = $_GET['str'];
foreach($dic as $word){
$new_point = similar_text($word,$str,$per);
echo $word."と".intval($per)."%似ています<br>";
if($point < $new_point){
$point = $new_point;
$answer = $word;
}
}

echo "<br>もしかして<strong>".$answer."</strong>?";
}
?>

CakePHP::Simple SMTP Mailer ja(メール送信+日本語対応)

7月 10th, 2007 admin

CakePHPでのメール送信のコンポーネントを探してみたんだけど無いので今日もthe Bakeryから適当なソースを探してきた。

メール送信についてはSwiftMailer Componentってやつのほうが有名っぽいんですが、どちらかというとmail()関数のラッパーを探しているだけなのでSimple SMTP Mailerというコンポーネントを使い、かつ日本語にも対応してみた。というかCakePHP1.2以降では標準でメール送信の仕組みがあるらしい。1.2にしようかな・・・

ダウンロード

SwiftMailer Component の日本語版
mailer.zip

変更箇所

  • ヘッダ・本文を日本語用にJISにエンコード

使用方法

1.ファイルを配置します。(/app/controllers/components/mailer.php)
2.mailer.php内の$fromと$fromnameを自分用に書き換えます
3.コントローラーで読み込み、送信します。
users_controller.php

class UsersController extends AppController {
    var $components = array("Mailer");
    function mypage(){
        $this->Mailer->AddAddress("日本タロウ","tarou@example.com");   //送り先1
        $this->Mailer->AddAddress("日本ハナコ","hanako@example.com");//送り先2

        $this->Mailer->Subject = "日本語のタイトル";
        $this->Mailer->Message = "日本語の本文";
        $this->Mailer->socketmail(); 	//送信
	}

}

以上でOK。メール本文の雛形をビューからもってくるか、DBからもってくるか、テキストからもってくるか悩み中。どうするのが多いんだろうか。