【FuelPHP】 DB::query()だけ注意!SQLインジェクション対策にプレースホルダを使おう

データ参照したいけど、手軽に作ってしまいたい時はあります。しかしながらSQLインジェクション対策は必要。
Query Builderを使った場合はエスケープしてくれますが、DB::query()だけは注意する必要があります。

■SQL インジェクションとは

SQL インジェクションとは、Webアプリケーションのリクエストパラメーターに、「不正な SQL 文」を含めてリクエストを送信し、本来の処理とは異なる命令をデータベースに実行させることができる脆弱性のことです。

SQL インジェクションは、Webアプリケーションの脆弱性の中でも深刻なもので、発見されたら早急に対応が必要です。具体的な被害には以下のようなものがあります。

個人情報などの重要情報の漏洩
不正なログイン
データベースの改ざん
OSコマンドの実行
サーバーの乗っ取り
(引用:https://www.websec-room.com/2013/03/03/365

恐ろしい、対策しなくてはいけません。。
その対策方法は、プレースホルダです。

■プレースホルダ利用前(NG例)

\DB::query(‘select * from hoge_table where id=’ . $id)->execute();
こういう書き方だとアウト。乗っ取りの可能性あります。

 

■プレースホルダ利用後(OK例)

$w_id = $id; // 割り当てたい変数をセット
$sql = “SELECT id, name FROM hoge_table WHERE id= :id“; // 実行したいクエリ
$result = DB::query($sql)->bind(‘id’, $w_id)->execute();

このように変数を外だしして、バインドさせることで安全になります。

WinSCPとAWSのFTPがタイムアウトで切れる時は、 KeepAlive設定でダミーコマンドを1秒で送信しよう

 

winSCPでAWSにつないで作業しているときに、タイムアウトで何度も切れてそのたびにダイアログが表示されてイライラ。という方はこの設定方法で解決してください。

winSCP → 設定 → 接続 → 接続の保持 → ダミーコマンド 送信感覚 1秒

に設定し、保存。これで解決すると思います。サーバーに定期的にコマンドを送ることで、接続が保持されるわけですが、これをやるだけど開発時に相当に無駄な作業が減ると思います。ただ、本番サーバーなどクリティカルなサーバーに対しては、定期的に途切れるようにしたままにしておくと安全です。

 

よくあるあるなのが、WinSCPで本番AWSと開発AWSに接続させ複数ウィンドウを立ち上げている場合、うっかり本番AWSにファイルアップしてしまいエラー出してしまった。という事があり得ます。そのあたりの設定差は好みに合わせて行ってみてください。

【PHP】isset関数とempty関数の違い「empty :変数が空であるかどうかのみを検査する」

isset : 変数が空&NULL ではないですか? = tureかを検査する

empty :変数が空ですか?= ture かを検査する

■isset とは

<?php
$value = "テスト";
if (isset($value)) {//空じゃないですか?= ture
 echo "OK!中身は入っています";
} else {
 echo "空です";
}
?>

実行結果:OK!中身は入っています

 

■emptyとは

<?php
$value = "テスト";
if (!empty($value)) {//非空ですか? = ture
 echo "OK!中身は入っています";
} else {
 echo "空です";
}
?>

 

実行結果:OK!中身は入っています

ただし、変数の中身が「0」(半角数字の0 または数値文字列の”0″)だった場合、emptyは空と判断します。

 

 

【相性良い】Jenkinsを使ってFuelPHPのユニットテストを自動化する方法

PHPではPHPUnitというテスティングフレームワークが存在します。
FuelPHPのコアクラスもPHPUnitによるテストを前提にして実装されているため、FuelPHPとも相性が非常にいいです。では早速、作成済みのFuelPHPアプリケーションにテストプログラムを実装し、Jenkinsによる自動テストを試してみましょう。以前に作成したFuelPHPアプリケーションについては、以下の記事をご覧ください。

(引用:http://sil.hatenablog.com/entry/jenkins-fuelphp-auto-unittest

・FuelPHPのユニットテストはoil testコマンドでPHPUnitが実行可能
・fuel/app/tests配下にテストプログラムはまとめられる
・コマンドベースでテスト可能なため、Jenkinsのジョブでシェル実行可能

【書籍】Flex関連一覧、Flash Builder 4.5で学ぶAndroid/iPhone実践プログラミングなどなど

■Flash Builder 4.5で学ぶAndroid/iPhone実践プログラミング

Flash Builder 4.5で学ぶAndroid/iPhone実践プログラミング

坂本 俊之
ソシム
売り上げランキング: 428,379
Amazon.co.jpで詳細を見る

 

Flex4プログラミング入門

Flex4プログラミング入門

posted with amazlet at 16.06.07
宮田 亮
秀和システム
売り上げランキング: 642,236

 

 

Flex4プログラミングガイド―Webアプリ開発のための「ツール」&「開発フレームワーク」 (I・O BOOKS)

 

Flex&Flash Builder 4 による Webアプリケーション開発ガイドブック
クジラ飛行机
毎日コミュニケーションズ
売り上げランキング: 422,085

 

Adobe Flex 3 & AIRではじめるアプリケーション開発
公門 和也 大谷 晋平 堀越 悠久史
インプレスジャパン
売り上げランキング: 312,773

【Mysql】Can’t connect to local MySQL server through socketのエラーが出たら?

Mysqlが起動していない可能性が高い

なのでMySQLが起動しているかを確かめたから(再)起動してみる

もしもそこに何もなかったら、MySQLがそもそも一度も起動されていない可能性が高い。MySQLを起動しよう。

service mysqld start

MySQLが起動すると、自動的にsocketが作成されて解決!

【全部】FuelPHP1.7コーディング規約ってどんなの?インデントとか結構特殊です

コーディング標準

【ファイル書式】

■PHP タグの閉じ方

PHP のコードだけしか含まないファイルは常に PHP の閉じタグ (?>) を省略します。 これは見つけにくい「死の白い画面」を避けるためです。

 

■インデント

すべてのインデントはスペースではなくタブを使用すべきです。しかし、インデントをした後はタブではなくスペースを使用して整形します。

// 2 つのタブでインデント

$var = ‘something’; // タブと整形された値とコメントでインデント
$variable = ‘else’; // スペースを使用して上下をインデント

 

■行の末尾
行の末尾は Unix 形式の LF にします。

■ファイル名
すべてのファイル名は、すべて小文字にしなければなりません。例外はありません。

■エンコーディング

ファイルは UTF-8 で保存し、BOM は使用しません。

命名規則

名前空間

コアクラスはすべて Fuel\Core というネームスペースにします。

namespace Fuel\Core;

クラス

クラス名は単語の境界にアンダースコアを使用し、クラス名の各単語は大文字で始めます。 しかし、アンダースコアはオートロードの際にディレクトリの境界に使用されていいます。 キャメルケースの使用は避けてください。しかし、サブディレクトリにクラスを置くことが意味がない場合には 避けることができません。

namespace Fuel\Core;

class Session
{

}

 

namespace Fuel\Core;

class Session_Cookie extends Session_Driver
{

}

これは、次のようなファイルパスになります。

core/classes/session.php
core/classes/session/cookie.phpメソッド

クラス名同様、メソッド名は単語の境界でキャメルケースではなくアンダースコアを使用します。 メソッド名はすべて小文字です。スコープ (public, protected, private) は常に含めます。
名前の1文字目にアンダースコアをを使用できます。これはメソッドが protected/private であることを明記したり、 public にする必要があると考えられることを示すためです。

 

class Session
{

public static function get_flash($name, $data)
{
// ここにコードを記述する
}

}

 

class View
{

// グローバルに見せる配列データ
protected static $_global_data = array();

protected static function capture($view_filename, array $view_data)
{
// ここにコードを記述する
}

}

 

■変数

変数名は簡潔にし、小文字とアンダースコアだけを含むようにします。 ループイテレータは短く、なるべく単一文字にするようにします。

$first_name

$buffer

for ($i = 0; $i < $max; $i++)

 

■定数

定数は全て大文字にすること以外は変数と同じガイドラインに 従います。

MY_CONSTANT
TEMPLATE_PATH
TEXT_DEFAULT

 

■キーワード

true, false, null, as などのようなキーワードは、すべて小文字にします。大文字は定数のために予約されているためです。 同じことが array, integer, string のようなプリミティブ型にも当てはまります。

$var = true;
$var = false;
$var = null;
foreach ($array as $key => $value)
public function my_function(array $array)
function my_function($arg = null)

■制御構造

if, for, foreach, while, switch のような制御に関するキーワードは、 パラメータや引数のリストまたは値にスペースを続けます。ブレースは新しい行にします。 break は case と同じインデントにします。

if ($arg === true)
{
//ここで何かする
}
elseif ($arg === null)
{
//ここで何か別のことをする
}
else
{
//ここで何かするキャッチオール
}

foreach ($array as $key => $value)
{
//ここでループする
}

for ($i = 0; $i < $max; $i++)
{
//loop here
}

while ($i < $max)
{
//ここでループする
}

do
{
//ここでループする
}
while ($i < $max)

switch ($var)
{
case ‘value1’:
//ここで何かする
break;
default :
//ここで何かする
break;
}

 

■もう 1 つの if 文

ある場合において、完全な if 文が単純な条件や関数呼び出しにしてはコードが多すぎることがあります。 このような場合、 より短い論理演算子構文を使用することで、PHP の実行ロジックを使用できます。 and を使用すると、最初の部分が true である場合のみ2番目の部分が実行されます。 or を使用すると、最初の部分が false である場合のみ2番目の部分が実行されます。if や else が必要な場合は使用しないでください。単一の条件文のような場合にのみしようしてください。

// if (isset($var)) { Config::set(‘var’, $var); } の代替
isset($var) and Config::set(‘var’, $var);

// if ( ! isset($var)) { $var = Config::get(‘var’); } の代替
isset($var) or $var = Config::get(‘var’);

// これをしてはいけません
Uri::segment(3) and $var = Uri::segment(3);
Uri::segment(3) or $var = ‘default’;

// こちらのほうがいいです:
if (Uri::segment(3))
{
$var = Uri::segment(3);
}
else
{
$var = ‘default’;
}

 

// またはこうします:
$var = Uri::segment(3) ? Uri::segment(3) : ‘default’;
// または実際にはこうします:
$var = Uri::segment(3) ?: ‘default’;

 

■比較と論理演算子

関数/メソッドの返値や変数を比較するには型に注意します。たとえば、関数が false を返すときに、 この返値を === や !== のような型に注意した演算子を使用して比較します。 さらに and や or を使用することが、&& や || よりも読みやすさの観点から好ましいです。 場合によってはこれを避けることができないこともありますので、必要に応じて && や || を使用します。! を使用する場合は、両端にスペースを置きます。

 

if ($var == false and $other_var != ‘some_value’)
if ($var === false or my_function() !== false)
if ( ! $var)

 

■クラス/インターフェースの定義

クラス/インターフェースの定義では次の行に開始ブレースを置きます:

class Session
{

}

クラスが空の場合、ブレースは定義と同じ行に置きます:

class Empty_Class { }

 

■関数/メソッド/クロージャの宣言

関数/メソッド/クロージャの開始ブレースは常に次の行から始め、 構文と同じインデントにします。

class Session
{

public static function get_flash($name, $data)
{
$closure = function($a, $b)
{
// クロージャのコードをここに
}
}

}

 

■変数

変数を初期化する際に、1 行に 1 つの変数を宣言します。コードの可読性をあげるために、各変数は別の行にします。 値とコメントは適切に整形します。

$var = ”; // 1 行に 1 つ
$other_var = ”; // 1 行に 1 つ

 

■ブラケットと丸カッコ

開始ブラケット/丸カッコの前後にはスペースをいれません。閉じブラケット/丸カッコの前にスペースをいれません。

$array = array(1, 2, 3, 4);
$array[‘my_index’] = ‘something’;
for ($i = 0; $i < $max; $i++)

 

■文字列のクォート

なるべくダブルクォートよりもシングルクォートを使用します。

■連結

文字列の連結は結合するパーツ間にスペースをいれません。

//yes
$string = ‘my string ‘.$var.’ the rest of my string’;

//no
$string = ‘my string ‘ . $var . ‘ the rest of my string’;

 

■演算子

$var = ‘something’;
if ($var == ‘something’) //論理演算子の前後にスペースをいれる
$var = $some_var + $other_var; //算術演算子の前後にスペースをいれる
$var++; // 加算演算子の前にスペースをいれない
++$var; //加算演算子の後にスペースをいれない

 

■配列のドット表記

厳密に言えば、コーディング標準ではありませんが、このフレームワークのクラス内やこのドキュメントで多用されていますが、 PHPでの表記として一般的でないため、このフレームワークに不慣れな人を混乱させるかも知れません。

// “always_load.packages = array()” は次のコードの省略表現です:
array(“always_load” => array(“packages” => array(…) ) );

 

この表記は Arr クラスで使われますが、Lang クラス、Config クラスそして Session クラスでも、多次元配列から個々の要素に素早くアクセスするために使われます。

 

// このような構造の配列がある場合
$array = array(
“always_load” => array(
“packages” => array(
“orm”,
“package” => “/my/special/package.php”,
)
)
);

// 次のコードは “/my/special/package.php” を返します:
$path = Arr::get($array, ‘always_load.packages.package’);

 

(参考:http://fuelphp.jp/docs/1.7/general/coding_standards.html

【PHP】strpos() 文字列内の部分文字列が最初に現れる場所を見つける

検索文字が見つかった位置(インデックス)を返します。

開始位置は 0 であり、1 ではないことに注意しましょう。

文字が見つからない場合は FALSE を返します。

例)

<?php
$mystring = 'adf34ir923ri2i3ri39';
$findme = 'a';
$pos = strpos($mystring, $findme);
// === を使用していることに注目しましょう。単純に == を使ったのでは
// 期待通りに動作しません。なぜなら 'a' が 0 番目 (最初) の文字だからです。
if ($pos === false) {
 echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした";
} else {
 echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました";
 echo " 見つかった位置は $pos です";
}
?>