1. はじめに
SQLインジェクション対策としてプリペアドステートメントを使いました。
CakePHPで実行することを前提として使い方を確認していきましょう。
まずSQLを発行するときにユーザからの入力が不正である場合、下手をするとこちらが意図をしているSQL以外のSQLが発行されてしまう可能性があります。
パラメータにシングルクオートなど入れて工夫を凝らすとそうなってしまいます。
解決方法としてこちらが意図するSQLを先に決定してしまい、パラメータだけ入れ替える形が良いですね。
それがプリペアドステートメントですキリ。
2. PHP上のプリペアドステートメント
「?」がプレースホルダといわれるもので後々queryの第2引数の配列で置換されます。
$qry = '';
$qry .= 'select * from answer_managers where user_id = ? and work_id = ? ';
$params = array($userId, $workId);
$result = $this->query($qry, $params);
return $result[0];
$qry .= 'select * from answer_managers where user_id = ? and work_id = ? ';
$params = array($userId, $workId);
$result = $this->query($qry, $params);
return $result[0];
へへ、なんつーかCakePHPとぜんぜん関係ないじゃないか・・・。
3. MySQL上のプリペアドステートメント
なぜか更新時にプリペアステートメントが失敗してしまったのでPHPではなくMySQLで行ってみた。
平のSQLではこんな感じ
PREPARE [クエリ名] from '[プレースホルダ付SQL]'
SET @[変数 = '[置換変数]', ・・・
EXECUTE [クエリ名] USING @[変数1], @[変数2], @[変数3]
SET @[変数 = '[置換変数]', ・・・
EXECUTE [クエリ名] USING @[変数1], @[変数2], @[変数3]
これをPHP上で実行するには以下を参照のこと
$qry = "PREPARE ANSWER_REGIST FROM 'UPDATE answer_managers SET ";
$qry .= "name=? ";
$qry .= "WHERE ";
$qry .= "user_id=? AND work_id=? ' ";
$this->query($qry);
$this->query("SET @c1 = '".$name."', @c2 = '".$uid."', @c3 = '".$workId."' ");
$this->query("EXECUTE ANSWER_REGIST USING @c1, @c2, @c3 " );
$qry .= "name=? ";
$qry .= "WHERE ";
$qry .= "user_id=? AND work_id=? ' ";
$this->query($qry);
$this->query("SET @c1 = '".$name."', @c2 = '".$uid."', @c3 = '".$workId."' ");
$this->query("EXECUTE ANSWER_REGIST USING @c1, @c2, @c3 " );
| 「デコポニテの魔女」の提供でこのブログは書かれております。 デコポニテの魔女はAndroid端末用簡易右スクロールシューティングゲームです。 Technology By: Adobe AIR & CakePHP |