PHP(ピー・エイチ・ピー)

【PHP】プレースホルダ(プリペアド・ステートメント)

私が入社する前に外注先に組んで貰ったかなり古いプログラムになるのですが、

SQLインジェクションに関する不具合が見つかりました。

で、コード解析を行いながら、

該当箇所をチェックすることに。

確かに、

select * from テーブル名 where code=$code

などというまずい記述が見つかりました。

ここは、当然プレースホルダ(プリペアド・ステートメント)を使うところですね!!

この程度であれば、

制作をした外注先に依頼するまでもなく、

弊社で対応可能だったので、

その際のメモ書きです。

やりたい事は、

ある沿線コードに紐づくレコードを全て取得することです。

ざっくりですが、

コードは以下の様になります。↓↓↓
※実際には各機能を関数化して、もう少し見栄えよくしています。

$dbname   = "データベース名";
$hostname = "ホスト名";
$user     = "ユーザー名";
$pass     = "パスワード";
$chara    = "文字コード";

//取得したい沿線のコード
$line_code = "YL0001";

$db_conf = "mysql:dbname={$dbname};host={$hostname}";
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES {$chara}",);

try{
    //MySQLサーバへ接続
    $pdo = new PDO($db_conf, $user, $pass, $options);
}catch(PDOException $e){
    //エラー処理
    var_dump($e->getMessage());
    exit();
}

//「?」付きでSQLを設定
$sql = "select linename from sample_table where line_code=?";

//prepareメソッドを実行
$stm = $pdo->prepare($sql);

if($stm === false){
    失敗した場合の処理;
}else{
    //パラメータにバインド
    $stm->bindValue(1, $line_code, PDO::PARAM_STR);
    //実行する
    $stm->execute();
    while($values = $stm->fetch()){
        $linename .= $values["linename"] . "/";
    }
}

$pdo = null;
$stm->closeCursor(); //MySQL接続を閉じる

 

もし、

レコードを取得する条件パラメータが複数になる場合には、

//取得したい沿線のコード
$line_code01 = "YL0001";
$line_code02 = "YL0002";

//「?」付きでSQLを設定
$sql = "select linename from sample_table where line_code=? or line_code=?";

//prepareメソッドを実行
$stm = $pdo->prepare($sql);

if($stm === false){
    失敗した場合の処理;
}else{
    //パラメータにバインド
    $stm->bindValue(1, $line_code01, PDO::PARAM_STR);
    $stm->bindValue(2, $line_code02, PDO::PARAM_STR);
    //実行する
    $stm->execute();
    while($values = $stm->fetch()){
        $linename .= $values["linename"] . "/";
    }
}

といった感じに改良してやれば、

大丈夫だと思います。

この記事を書いている人
株式会社ディープ
名前足立拓也

メールアドレスadachi@deep-deep.jp

関連記事

最近の記事

  1. ドメインについて
  2. WP:WordPress(ワードプレス)
  3. URL設計(URLデザイン)
  4. URL「ディレクトリ名」と文字アンダースコア(_)とハイフン(-)
  5. SEO対策(外部ファイルの読み込み)
  6. URL リダイレクト
  7. インデックスされない
  8. 内部対策は必要?
  9. CMS(シーエムエス)
  10. SEO業者は必要?

Twitter

アーカイブ

PAGE TOP