野鳥日記

野鳥と技術のブログ http://www.kiriya-system.com/

fuelphpのSQLインジェクション対策とSQLインジェクションの機械的チェック

fuelphpSQLインジェクション対策についていろいろ調べた。

 

http://d.hatena.ne.jp/Kenji_s/20111222/1324526139

 

Query Builderを使った場合はエスケープしてくれる。

 

DB::query()だけ注意。

DB::query()の場合もbindで値を渡す場合はエスケープしてくれる

 

\DB::query('select * from hoge where id=' . $id)->execute();

こういう書き方がアウト

そこで上記の書き方を検索する正規表現を作った。

/query\([^)]*?\$.*?\)/

 query引数内に$があればヒットする。\$とかにもヒットするけど、SQL内で$は使わない・・・はず。

 

これをJenkinsさんとかにビルド毎にソースをgrepしていただいて、

見つかったらエラーにしてもらうと、とても便利な気がした。

 

あとドライバがmysqliだと複文が使えなくなっててなお良し。

 

※セキュリティチェックこそ自動化すべきだよね。デスマ中とかにセキュリティ意識したコードとか不可能。

AWS CLIでcloud watchのデータを取得する。

http://aws.amazon.com/jp/cli/

 

↑公式からダウンロード

 

EC2インスタンス情報

aws ec2 describe-instances

 

cloud watchからCPU情報取得

aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --dimensions Name=InstanceId,Value=i-hoge --statistics  Average --period 60 --start-time 2014-02-17T09:15:00Z  --end-time 2014-02-17T09:20:00Z

 ※InstanceIdの複数指定の仕方がわからない・・・spaceで区切れって公式に書いてあるけど、書式が違うのかうまくいかない。誰か知ってる人、コメントお願いします。

fuelphpのas_arrayでのkey指定の制限

fuelphpのas_arrayでのkey指定の制限

 

as_arrayで配列のキーを指定する場合、

キーのカラムがユニークである必要がある

プライマリーキーが複数カラムの場合も対応してない。

 

またまたハマったのでメモ

 

http://fuelphp.jp/docs/1.7/classes/database/usage.html#results

 

オプションとして、as_arrayから返る配列のキーと値を指定することもできます。

$result = DB::select()->from('users')->execute();
$on_key = $result->as_array('id');
foreach($on_key as $id => $item)
{
    // $id にはレコード ID が入る
    // $item またはその $id に関する処理
}

$key_value = $result->as_array('id', 'email');
foreach($key_value as $id => $email)
{
    // ここで $email には電子メールのフィールドが入るので
    // $id や $email に関する処理ができる
}

as_arrayのソースを見てみる。
/fuel/core/classes/database/result.php

 

        elseif ($value === null)
        {
            // Associative rows

            if ($this->_as_object)
            {
                foreach ($this as $row)
                {
                    $results[$row->$key] = $row;
                }
            }
            else
            {
                foreach ($this as $row)
                {
                    $results[$row[$key]] = $row;
                }
            }
        }

 上下は省略してます。

$resultsが結果なんですが

$results[$row[$key]] = $row;

とキー指定されたレコードの値で変数にいれてます。

 

つまりキー指定されたレコードの内容が同じになる場合は上書きされます。

プライマリーキーor ユニークなカラムで使いましょう。ということなんでしょうね。

ドキュメントに書いといてよ・・・

 

プライマリーキーが複数カラムの場合もこれだと上書きされるので使えません。

 

制限に引っかかる場合はキーの指定をせず

自分で配列に詰めなおしましょう!

fuelphpのプロファイリングを有効にする方法

fuelphpのプロファイリングを有効にする方法

 

http://fuelphp.jp/docs/1.7/general/profiling.html

 

公式ドキュメントでは

config/config.php

に設定追加すべしとあるが、せっかく環境ごとの設定ファイルを作れるので

config/development/config.phpを作成し、

中身を下記のようにした。

<?php
return array(
    'profiling'  => true,
);

 

config/development/db.phpにも追加

     'default' => array(
        'connection'  => array(
            'hostname'         => 'hoge.hoge.com',
            'port'             => '3306',
            'database'         => 'hoge',
            'username'         => 'hoge',
            'password'         => 'hoge',
            'persistent'     => false,
            'compress'         => false,
        ),
        'profiling'  => true,
    ),

※追加場所はconnection内ではなく、default直下なことに注意。最初、まんまと間違えた。。。

 

これで開発環境のみプロファイリングしてくれる。

 

このプロファイリング機能自体はSQLのexplainまでしてくれる優れもの。

unityでネストの深いJSONを扱ってみる(MiniJSON編)

unityでネストの深いJSONを扱ってみる(MiniJSON編)

 

http://www.cho-design-lab.com/2013/08/15/unity-minijson-load-json/

 

↑を見ながらMiniJSONを入れる

次に深ーいネストのJSONを読み込む

今回使ったのはこれ

http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html

 

あまりに深いので本体は乗せませんw

 

それをパースするコードが↓

var jsonData = MiniJSON.Json.Deserialize(json) as Dictionary<string,object>;
List<object> Reservations=(List<object>)jsonData["Reservations"];
Dictionary<string,object> Instances=(Dictionary<string,object>) Reservations[0];
List<object> Instances_info=(List<object>) Instances["Instances"];
Dictionary<string,object> Instance_value=(Dictionary<string,object>) Instances_info[0];
print(Instance_value["InstanceId"]);

キャストして代入しまくり。

 

変数に代入せず直接アクセスを試みる

 var jsonData = MiniJSON.Json.Deserialize(json) as Dictionary<string,object>;
        print(
            (
                ((Dictionary<string,object>)
                     ((List<object>)
                        ((Dictionary<string,object>)
                             ((List<object>)
                             jsonData["Reservations"])
                         [0])
                     ["Instances"])    
                 [0])
             ["InstanceId"])
        );

 

もうなにがなにやら・・・

他に書き方あるのかもしれませんが・・・

 

まあ、単なるネタなんですが、

MiniJSONを使うときはシンプルなJSONのほうがいいっぽいぞ!

フレームを使用したページでChrome Loggerが不安定

フレームを使用したページでChrome Loggerが不安定

 

なぜか、たまに表示されなくなったり表示されたりします・・・

 

まあそもそも<frame>なんて使うなってことですかね・・・

HTML5では廃止予定とか書いてあるし。↓

 

http://www.htmq.com/html/frame.shtml