kohanaのテスト3の続き・・・SQLインジェクション対策について
本日午前中のサンプルコードにて名前の欄に「名前 ' -- 」と書いて送信すると見事にエラーが発生しました。SQLインジェクション対策がなされていません。Database クラスには SQLインジェクション対策のメソッドが準備されているようですが、Model_Database クラスには無いようです。また、他のクラスのメソッドを Database::escape みたいな感じで呼び出すとエラーが発生します。
どうも Model_Database クラスを利用する上では、直接 PHP の mysql_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() を追加して、ポストで受けた変数を全て処理しています。