2011-11-30

PHPで2重登録、2重ポスト、CSRF対策

こんな感じで実装できると思う。




■ input.php ... 入力画面など
<?php
//  セッションを開始する
session_start();

//  ワンタイムチケットを生成する。
$ticket = md5(uniqid(rand(), true));

//  生成したチケットをセッション変数へ保存する。
$_SESSION['ticket'] = $ticket;
?>
<html>
<head>
<title>サンプル登録画面</title>
</head>
<body>
<form action="regist.php" method="POST">
<input type="text" name="UserName" value="">
<input type="submit" value="regist">
<!--  生成したワンタイムチケットを隠しフィールドとして、
      登録処理へPOSTする  -->
<input type="hidden" name="ticket" value="<?=$ticket?>">
</form>
</body>
</html>




■ regist.php ... 登録処理など
<?php
//  セッションを開始する
session_start();

//  ポストされたワンタイムチケットを取得する。
$ticket = isset($_POST['ticket'])    ? $_POST['ticket']    : '';

//  セッション変数に保存されたワンタイムチケットを取得する。
$save   = isset($_SESSION['ticket']) ? $_SESSION['ticket'] : '';

//  セッション変数を解放し、ブラウザの戻るボタンで戻った場合に備え
//  る。
unset($_SESSION['ticket']);

//  ポストされたワンタイムチケットの中身が空だった、または、ポス
//  トすらされてこなかった場合、不正なアクセスとみなして強制終了す
//  る。
if ($ticket === '') {

    die('不正なアクセスです');

}

//  ポストされたワンタイムチケットとセッション変数から取得したワン
//  タイムチケットが同じ場合、正常にポストされたとみなして処理を行
//  う。
if ($ticket === $save) {

    echo 'Normal Access';

}
//  ブラウザの戻るボタンで戻った場合は、セッション変数が存在しない
//  ため、2重送信とみなすことができる。
//  また、不正なアクセスの場合もワンタイムチケットが同じになる確率
//  は低いため、不正アクセス防止にもなる。
else {

    echo 'Dual Posted';

}
?>

2011-11-29

PHPの配列は

こんな感じで配列を作ると、添字は順番に振られるけど、順番には並んでいない。


$arrVar = array();
$arrVar[] = "a";
$arrVar[] = "b";
$arrVar[] = "c";


なので、添え字を使って処理するときは問題ないけど、例えば配列の並び順に従って二つ以上の配列を処理するときは、ksort()使って添え字でソートしておく必要がある。

$arrVar = array();
$arrVar[] = "a";
$arrVar[] = "b";
$arrVar[] = "c";

$arrTmp = array();
$arrTmp[] = "あ";
$arrTmp[] = "い";
$arrTmp[] = "う";

ksort($arrVar);
ksort($arrTmp);

2011-11-26

オブジェクトは参照渡し

マニュアル、ちゃんと読めってね。

PHP Manual オブジェクトと参照
http://php.net/manual/ja/language.oop5.references.php

引用 ここから

オブジェクトと参照

PHP 5 でのオブジェクト指向プログラミングのポイントとしてよく言われるのは 「オブジェクトはデフォルトでは参照渡しとなります」ということです。 しかし、正確には少し異なります。 この節では、いくつかの例を用いてその誤解をといていきます。
PHP の参照は一種のエイリアスで、ふたつの異なる変数に同じ値を書き込めるものです。 PHP 5 以降、オブジェクト変数の値にオブジェクト自身は含まれなくなりました。 含まれるのはオブジェクトの ID のみで、 これを用いて実際のオブジェクトにアクセスできるようになっています。 オブジェクトが引数として渡されたり返り値となったり あるいは別の変数に代入されたりした場合、 それはエイリアスではありません。ID のコピーを保持し、 同じオブジェクトを指すようになるのです。

ここまで


2011-11-08

kvmでvmvgaドライバ

Ubuntu 10.10 でKVM環境を構築したよ。

で、ゲストでWindows XP を動かしてみた。

vgaドライバがなかったので、vmvgaドライバを入れてみた。

で、rdesktopで接続して仕事していたら、起動後3時間すると、

ゲストのCPU使用率が100%になって

にっちもさっちもいかなくなった。

最初は「何が悪いの」的な感じで、何が何だかだったけど、

最終的に、ビデオカードのモデルを「vmvga」から「vga」に戻したら、

何時間経過しても問題なくなった。

POSTと同時にGETする

formタグでPOSTと同時にGETも行うには、

<form action="./target.php?hoge=hoehoge&moge=mogemoge" method="POST">
・・・
</form>

としておけばよい。

2011-11-03

FLUSH TABLES

MySQLを使うバッチ処理組んだら

最後に

FLUSH TABLES;

を実行しましょう。

.htaccessで403を404で返す

久しぶりにリライトルールを書いたよ。 ドキュメントルートに.htaccessを置く場合の記述↓ # 403.html は実体がなくてよい。この設定をすることで、あっても使われなくなる。 ErrorDocument 403 /403.html # 独自の404ページをドキュメ...