fc2ブログ

奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

自作フレームワーク修正連絡Part1

本ブログに掲載されている、
筆者の自作フレームワークの改修を行いました。
本エントリでは、主な修正点を書きたいと思います。
修正に際して、いわゆる徳丸本が大変参考になりました。
著者の徳丸先生には、深くお礼を申し上げたいと思います。
それにしても助かったw

・セッションIDを変更するタイミングの見直し

セッションIDの変更を、
「ログインに成功した直後(フレームワーク上の処理では行っていませんが)」と、
「ログイン後、5分経過する毎」にのみ行う様にしました。
これまでは、HTTPリクエストをする毎に、
ログイン状態に関係なく変更を行っていましたが、
サーバーへの負荷にもなるとの事で、変更しました。
この修正が反映されているクラスは、controller.phpになります。

・パスワードの生成処理を見直し

「ユーザーIDに16進数バイナリ文字列化されたソルトを連結後、
任意のストレッチング回数分、パスワードと連結してsha256でハッシュ化する」処理に変更しました。
これまでは、パスワードと適当に決めたソルトを連結して、
「1回だけ」sha512でハッシュ化する実装でした。
この修正が反映されているクラスは、utility.phpになります。
ただし、上記の処理を行っているメソッドはutilityクラスに書くべきではないと思っているので、
今後、別のクラス(多分、認証系のクラス)に移動する予定です。

・CSRF対策処理の見直し

csrf.phpというクラスを新規作成し、
そのクラス内に対策処理を書くようにしました。
また、以下はフレームワーク上には書いていない処理ですが。
「入力→確認→完了」の遷移をする機能があって且つ、
重要な処理を行う(メアドやパスワードの変更など)場合には、
確認画面を表示する直前に、確認画面内のhiddenにトークン(セッションID)を保存し、
完了画面へのリクエストの直後にトークンの値をチェックする処理にしました。

・マルチバイト対応関数への変更

どのクラスというか「全体的」になんですが、mb系の関数を使う様に変更しました。
ただ、mb_str_replaceという関数は、
PHPの標準関数「では」存在しないようなので、
str_replaceのままになっている箇所もあります。

・SQL文中の「?」を「$数字」に置換する処理の変更

セキュリティには全く関係は無いのですが、
utility.php内の、「sql_param_question_to_dollar_num」メソッドの実装を「シンプルに」しました。
これは、脆弱性と関係がないので、参考程度に修正前のソースも掲載しておきます。

他にもまあ、色々とあるのですが、
基本的には徳丸本の4・5・6章の内容を全て再読しながら見直しを行いました。

・今後の予定

自分でも良く分からないのですがw
とりあえず、筆者の頭の中でパッと浮かんだネタを適当に書いてみます。

1.認証系のクラスを作成する
2.configクラスがシングルトンになっているが、脱シングルトンにする(少し答えが見えてきた)
3.actionとviewを一つにまとめるかも?(脱シングルトンと関係あり)
4.携帯対応(画面表示時にShift_JISに変換したりなど)
5.SQLインジェクション対策の処理を自作する(知人はそうしているので)
6.PHPのセッション関数群を使わずに、自作でセッション管理を行う

とはいえ、やるかどうかは分かりません。
特に5・6は、脆弱性になる可能性も高いので。
徳丸本でも6は「禁止」されてましたし。

と、そんな感じで、本エントリを締めたいと思います。
ココのソースが危ない!とかダメ!とかがあれば、
コメント等で連絡頂ければと思います。

テーマ:日記 - ジャンル:日記

  1. 2011/06/18(土) 23:20:41|
  2. 自作プログラム
  3. | トラックバック:0
  4. | コメント:0

自作フレームワーク:csrf.php

注意:
本プログラムは、
いわゆる徳丸本に書かれているセキュリティ対策の多くは反映してます。
しかし、高難易度の攻撃に耐えられる程の対策は出来ていないと思います。
本プログラムの流用は自由ですが、流用によって生じた損害については、
自己責任でお願いしてますので、その旨ご了承下さい。


自作フレームワークのトップページに戻る

現在、本クラスは使用されていません。



<?php

/**
* CSRF対策クラス
*
* クロスサイトリクエストフォージェリ脆弱性の対策を行うクラス
*/
class csrf {

/**
* 第三者が知り得ない秘密情報(トークン)の値を取得する
*
*/
static public function get_token() {
return session_id();
}

/**
* トークンの値をチェックする
*
*/
static public function check_token() {

// トークン確認
if(true === isset($_POST['token'])) {
// hiddenからPOSTされたトークンとセッションIDが違う場合は不正な遷移
if(0 !== strcmp($_POST['token'], self::get_token())) {
throw new custom_exception('トークン値相違', 1);
}
} else {
// hiddenからPOSTされたトークンが未設定時も不正な遷移
throw new custom_exception('トークン値未設定', 1);
}
}
}
?>


テーマ:日記 - ジャンル:日記

  1. 2011/06/18(土) 19:10:49|
  2. 自作プログラム
  3. | トラックバック:0
  4. | コメント:0

自作フレームワーク:template_convert_single.php

注意:
本プログラムは、
いわゆる徳丸本に書かれているセキュリティ対策の多くは反映してます。
しかし、高難易度の攻撃に耐えられる程の対策は出来ていないと思います。
本プログラムの流用は自由ですが、流用によって生じた損害については、
自己責任でお願いしてますので、その旨ご了承下さい。


自作フレームワークのトップページに戻る



<?php

/**
* 単一値専用のテンプレート置換処理クラス
*
* HTMLテンプレート内の単一値の部分の置換を行うクラス
*
* @access public
* @create 2011/01/30
* @version 1.0
*/
class template_convert_single
{

/**
* テンプレート置換ロジック実行
*
* @access public
* @param view $view ビュークラスインスタンス
*/
public function convert_template($view)
{
$output_html = $view->get_output_html();

// 区切り開始文字列の直前までの文字列
$output_buf = mb_strstr($output_html, ';;;', true);
// 区切り開始文字列以降の文字列
$after = mb_strstr($output_html, ';;;');
// 区切り終了文字列の直後からの文字列
$name_last_after = mb_substr(mb_strstr(mb_substr($after, 3), ';;;'), 3);
// テンプレート側で設定してある名前
$name = explode(';;;', $after);
// 置換対象のデータ
$data = $view->get_action()->get_template_convert()->get_single_array_val($name[1]);

if (true === isset($data))
{
// データ有り
$output_buf .= $data . $name_last_after;
}
else
{
// データ無し
$output_buf .= $name_last_after;
}

$view->set_output_html($output_buf);
}
}



テーマ:日記 - ジャンル:日記

  1. 2011/02/03(木) 22:33:45|
  2. 自作プログラム
  3. | トラックバック:0
  4. | コメント:0

自作フレームワーク:template_convert_multi.php

注意:
本プログラムは、
いわゆる徳丸本に書かれているセキュリティ対策の多くは反映してます。
しかし、高難易度の攻撃に耐えられる程の対策は出来ていないと思います。
本プログラムの流用は自由ですが、流用によって生じた損害については、
自己責任でお願いしてますので、その旨ご了承下さい。


自作フレームワークのトップページに戻る



<?php

/**
* 複数値専用のテンプレート置換処理クラス
*
* HTMLテンプレート内の複数値の部分の置換を行うクラス
*
* @access public
* @create 2011/01/30
* @version 1.0
*/
class template_convert_multi
{

/**
* テンプレート置換ロジック実行
*
* @access public
* @param view $view ビュークラスインスタンス
*/
public function convert_template($view)
{
$output_html = $view->get_output_html();

// 区切り開始文字列の直前までの文字列
$output_buf = mb_strstr($output_html, ':::', true);
// 区切り開始文字列以降の文字列
$after = mb_strstr($output_html, ':::');
// 区切り開始文字列以降の文字列を、区切り開始文字列で分割した配列
$after_array = explode(':::', $after);
// テンプレート側で設定してある名前
$name = explode('@', $after_array[1]);
// 置換対象のデータ
$data = $view->get_action()->get_template_convert()->get_multi_array_val($name[0]);
if (true === isset($data))
{
// データ有り
$multi_flag = false;
// チェックボックスの場合のみ、$dataは配列になっている
if (true === is_array($data))
{
$data_length = count($data);
for ($i = 0; $i < $data_length; $i++)
{
// チェックボックスでどの値を選択するかを判定
if (0 === strcmp($data[$i], $name[1]))
{
$multi_flag = true;
break;
}
}
}
else
{
// セレクトボックス・ラジオボックスでどの値を選択するかを判定
if (0 === strcmp($data, $name[1]))
{
$multi_flag = true;
}
}

// 判定をして選択か未選択状態の文字列を足しこむ
if (true === $multi_flag)
{
$output_buf .= $view->get_action()->get_template_convert()->get_multi_array_yes_val($name[0]);
}
else
{
$output_buf = rtrim($output_buf);
$output_buf .= $view->get_action()->get_template_convert()->get_multi_array_no_val($name[0]);
}
}
// 区切り終了文字列の直後からの文字列をくっつけていく
$output_buf .= mb_substr(mb_strstr(mb_substr($after, 3), ':::'), 3);
$view->set_output_html($output_buf);
}
}



テーマ:日記 - ジャンル:日記

  1. 2011/02/03(木) 22:30:04|
  2. 自作プログラム
  3. | トラックバック:0
  4. | コメント:0

自作フレームワーク:template_convert_loop.php

注意:
本プログラムは、
いわゆる徳丸本に書かれているセキュリティ対策の多くは反映してます。
しかし、高難易度の攻撃に耐えられる程の対策は出来ていないと思います。
本プログラムの流用は自由ですが、流用によって生じた損害については、
自己責任でお願いしてますので、その旨ご了承下さい。


自作フレームワークのトップページに戻る

現在、本クラスは使用されていません。



<?php

/**
* ループ専用のテンプレート置換処理クラス
*
* HTMLテンプレート内のループの部分の置換を行うクラス
*/
class template_convert_loop extends template_convert {

/**
* テンプレート置換ロジック実行
*
*/
public function convert_template($view) {

$output_html = $view->get_output_html();

$output_buf = mb_strstr($output_html, '|||', true);
$after = mb_strstr($output_html, '|||');
$after_array = explode('|||', $after);
$name = $after_array[1];
$body = $after_array[2];
$rows = $view->get_loop_array_value($name);
if (true === isset($rows)) {
// ループ名が設定されている時のみデータもある
$row_size = count($rows);
// 表示する行数分繰り返す
for ($i = 0; $i < $row_size; $i++) {
// 初期化
$body_buf = $body;
// strstrは検索文字列が見つからない時はfalseを返すので、その間繰り返し
while (false !== ($data_before = mb_strstr($body_buf, ';;;', true))) {
$data_after = mb_substr(mb_strstr(mb_substr(mb_strstr($body_buf, ';;;'), 3), ';;;'), 3);
$data_array = explode(';;;', $body_buf);
// モデルのゲッターを実行しデータを取得
$data_value = utility::create_accessor_name($rows[$i], 'get', $data_array[1]);
$body_buf = $data_before . $data_value . $data_after;
}
$output_buf .= $body_buf;
}
}
$output_buf .= $after_array[4];
$view->set_output_html($output_buf);
}
}

?>



テーマ:日記 - ジャンル:日記

  1. 2011/02/03(木) 22:28:16|
  2. 自作プログラム
  3. | トラックバック:0
  4. | コメント:0
前のページ 次のページ