dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト3の続き・・・SQLインジェクション対策について

本日午前中のサンプルコードにて名前の欄に「名前 ' -- 」と書いて送信すると見事にエラーが発生しました。SQLインジェクション対策がなされていません。Database クラスには SQLインジェクション対策のメソッドが準備されているようですが、Model_Database クラスには無いようです。また、他のクラスのメソッドを Database::escape みたいな感じで呼び出すとエラーが発生します。

どうも Model_Database クラスを利用する上では、直接 PHPmysql_real_escape_string() 関数を使うしかないようです。完璧なのかどうなのかは分かりませんけど、「PHP逆引きレシピ」の教えに従って修正してあります。

・application/classes/model/test3.php の修正版

<?php defined('SYSPATH') or die('No direct script access.');

class Model_Test3 extends Model_Database {

    public function __construct() {
        parent::__construct();
    }

    public function selectData() {
        $sql = "select id,name,address,tel from test2 order by id ASC";
        $result = $this->_db->query(Database::SELECT, $sql, true);
        return $result;
    }

    public function insertData() {
        $name = e($_POST['name']);
        $address = e($_POST['address']);
        $tel = e($_POST['tel']);
        $sql = "INSERT INTO test2 VALUES ('', '$name', '$address', '$tel')";
        $result = $this->_db->query(Database::INSERT, $sql, true);
        return $result;
    }

    public function updateData() {
        $id = e($_POST['id']);
        $name = e($_POST['name']);
        $address = e($_POST['address']);
        $tel = e($_POST['tel']);
        $sql = "UPDATE test2 SET id='$id', name='$name', address='$address', tel='$tel' WHERE id = '$id'";
        $result = $this->_db->query(Database::UPDATE, $sql, true);
        return $result;
    }

    public function deleteData() {
        $id = e($_POST['id']);
        $sql = "DELETE FROM test2 WHERE id = '$id'";
        $result = $this->_db->query(Database::DELETE, $sql, true);
        return $result;
    }

}

function e($sql) {
    return(mysql_real_escape_string($sql));
}

?>

 関数 e() を追加して、ポストで受けた変数を全て処理しています。