私が入社する前に外注先に組んで貰ったかなり古いプログラムになるのですが、
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"] . "/"; } }
といった感じに改良してやれば、
大丈夫だと思います。
この記事へのコメントはありません。