2012-03-02

Windows 8 Consumer Preview をVMware Player に入れてみた (1)

出たよ。 Consumer Preview版。
見たよ。ネットのニュースで。
何よ。おんさんはもうついていけない。
何さ。あのインターフェイス。



ということで、只今、64bit版のISOイメージをダウンロード中。

そう言えば、Windows 7 で32bit版OSは最後じゃなかったっけ?

MSさんのサイトに、32bit版もあったな。




ダウンロードはこちら。

Windows 8 Consumer Preview ISOイメージ
http://windows.microsoft.com/ja-JP/windows-8/iso

2012-02-25

同一セッションに悩まされ

Internet Explorer も、気がついてみたらFirefoxまでも、複数タブ・ウィンドウ間で同一セッションになってしまった。確か、Firefox 3.6のときは、ウィンドウが別だったらセッションも別になっていたと思ったのになぁ...

で、同一セッションになって困るのは、セッション変数の扱い。

同じフォームを二つのタブやウィンドウで開くと、後から開いた方の値でセッション変数は上書きされてしまう。

これを防ぐには、フォームがはじめて表示されたときにフォームに対して一意の値を生成し、そいつを毎回POSTする。
そして、セッション配列へフォームの値を保存するときは、POSTされた一意の値をセッション配列のkey、保存したいフォームの値をvalueとすればよい。
で、いらなくなったときに、セッション配列の要素をunset()してやればいい。

この考え方は、ワンタイムチケットと同じ。

こっちも参照してね。

ワンタイムチケットでなくても、例えばログインフォームで一意の値を生成し、そいつをフォーム間で引き回せば、同じことができる。

ただし、ログインフォームで生成した一意の値が仮に悪意の第3者に漏れた場合、何をされるかわからないので、できれば、一定間隔で再生成する仕組みを考えた方がいい。

2012-02-05

クロスサイトスクリプティング対策とかいろいろチェック

基本は出力時のエスケープ


外部から取得した値は、出力時に必ずエスケープする。


<?=htmlspecialchars(外部から取得した値, ENT_QUOTES)?>


外部から取得できる値
  • ポストされた値
  • URIのパラメタ値
  • アップロードされたファイルの内容
  • データベースから取得した値


しかし、URIを指定できる場所へエスケープして出力しても、「javascript:」で始まる文字列はエスケープされないため意味がない。

<?php
// この変数 $var へ代入する値が、$_POST や $_GET
$var = 'javascript:window.alert("XSS成功")';
?>
<a href="<?=htmlspecialchars($var, ENT_QUOTES)?>">リンク</a>

このような場所へは、外部からの取得値を出力してはならない。



また、エスケープが意味をなさない次の場所へは、外部からの取得値を出力してはならない。

<style>ここ</style>
<script>ここ</script>



不正なマルチバイト文字対策

外部入力値に不正な文字コード(EUC-JPなのに1バイトだったなど)が含まれていたり、アップロードしたファイルが壊れていて、正しく文字エンコードを判別できないような場合、意図しない動きになる。特に、日本語のようなマルチバイト文字を使う場合は、必ずチェックする。


mb_check_encoding(外部入力値, 'UTF-8');


mb_check_encoding()は、第一引数で指定したバイトストリームが、第二引数で指定する期待した文字エンコーディングとして有効な場合はtrue、無効な場合はfalseを返すので、無効な文字エンコーディングと判断されたときは、(処理にもよるが)強制終了すればいい。


$var = isset($_GET['param1']) ? $_GET['param1'] : '';
if (!mb_check_encoding($var, 'EUC-JP') {
    die('Invalid Access!');
};



NULLバイト攻撃の対策

まず「NULLバイト」の説明。

エスケープシーケンスで表すと「\0」。

PHPには、このNULLバイト (バイナリ値) が渡された場合でも正しく処理できる関数 (バイナリセーフな関数) と、NULLバイトが渡されると、NULLバイトを文字列の終端と判断してしまう関数 (バイナリセーフでない関数) が存在する。




文字エンコードは正しく

header()でcontent-type を送信するか、php.ini の default_charset を指定する。
表示するページのエンコードも、上で送信する文字エンコードに合わせる。

php.iniで次のよに設定されていれば何も意識しなくてよい。
default_mimetype = "text/html"
default_charset  = "UTF-8"

このように設定されていれば、header()で次のように送信しなくても自動で送信される。
header('Content-Type: text/html; charset=UTF-8');

仮に、php.iniで default_charset が空の場合、Content-Typeヘッダ で charsetオプションパラメタ は送信されない。
・php.ini
default_mimetype = "text/html"
default_charset  =

・送信されるヘッダ
Content-Type: text/html

送信されるヘッダにcharsetがないからといって、charasetだけ送信すると、今度はmimetypeが送信されない。Content-Typeヘッダを送信するときは、mimetypeもcharsetも
header('Content-Type: charset="UTF-8"');            //  これはNG
header('Content-Type: text/html; charset="UTF-8"'); //  mimetypeとcharsetはセットで送信

結論
php.iniで正しく設定するか、毎回 header()でContent-Typeを送信する。




session_get_cookie_params()

第4引数の意味:
× HTTPSのときだけ、サーバーからブラウザへセッションクッキーが送信される。
○ サーバーからブラウザへは常にセッションクッキーを送信するが、HTTPSのときだけ、ブラウザからサーバーへセッションクッキーが送信される。

2011-12-27

RX100 S7 へ Ubuntu 10.04 をインストール

FujitsuのRX100S7にUbuntu10.04 LTSをインストールした。

標準ドライバでは認識しなかったので、LSIとIntelからDriverをダウンロードした。


まずはこれ。
OS標準のドライバでRAID 1 組んだ後のディスクを認識しなかった。
で、LSI行って見つけてきた。

MegaRAID SAS Driver Ubuntu 10.04 LTS Version 5.30 (2011/12/26現在)

手順通りに従って、無事、OSのインストールができました。


次。
オンボードNICのうち、一個だけ離れているLANポートを認識しなかったので、これも、Intelさん行って見つけてきた。

Network Adapter Driver for PCI-E Gigabit Network Connections under Linux
(2011/12/26現在、バージョン1.95)

これも、手順通りに従ってコンパイルしてインストール。

無事、認識できました。

ただ、NICドライバは、カーネルのバージョンが上がる度に再コンパイルが必要なので注意。

2011-12-20

PHPセッション開始のサンプル

# セッションIDの保存は、クッキーのみを利用する。

ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.use_trans_sid', 0);


# セッション名を変更する。

session_name('SITENAME');


# 第1引数:セッションクッキーの有効時間(秒数)。0でブラウザを閉じるまで。
# 第2引数:セッションクッキーが有効なパス。供用サーバーで独自ドメインがない場合は、
#      自分が管理するディレクトリ以下に対してのみ、ブラウザからセッションクッキ
#      ーを送信させる。
# 第3引数:セッションクッキーが有効なドメイン。
# 第4引数:HTTPSでのみセッションクッキーを有効とする場合は、true とする。
# 第5引数:セッションクッキーへのアクセスはHTTPのみとし、JavaScriptからのアク
#        セスは許可しない。

session_set_cookie_params(0, '/user/', NULL, false, true);


# セッションを開始する

session_start();


# セッションハイジャック対策
# セッション固定化攻撃対策
# F5連打対策
# 前回セッションIDを再生成した日時と現在日時を比較し、一定期間(例えば20分)経過
# していたら、セッションIDを再生成する。

$_SESSION['lasttime'] = isset($_SESSION['lasttime']) 
                      ? $_SESSION['lasttime'] : 0;
$now = time();
if (($_SESSION['lasttime'] + 20 * 60) < $now) {
    session_regenerate_id(true);
    $_SESSION['lasttime'] = $now;
}

2011-12-02

kvmでゲストをコピーしたときも

kvmでゲストをコピーして新しく作ったときも、

結局はMACアドレスが変更になるだけだから、

この方法でいいんだよ。


■ vmwareのvmdkをコピーしたときは
http://chibitcpu.blogspot.com/2011/03/vmwarevmdk.html

Windows 11 インストール / アップグレード 手順

 Microsoftから、Windows 11 の ISO をダウンロード ダウンロードしたISOを右クリックしてマウント コマンドプロンプトを起動してマウントしたドライブ(D:とか)に移動し、setup /product server を実行 あとは指示に従うだけ これだけ。 ...