ADOdb 是Active Data Objects Data Base 的簡稱,ADOdb是一種PHP 存取數據庫的中間函式組件。
雖然PHP 是建構Web 系統強有力的工具,但是PHP 存取數據庫的功能,一直未能標準化每一種數據庫。為了填補這個缺憾,因此才有ADOdb 的出現。一旦存取數據庫的接口標準化,就能隱藏各種數據庫的差異,若欲轉換至其它不同的數據庫,將變得十分容易。
include("adodb.inc.php"); $db = NewADOConnection('mysql'); $db->Connect("localhost", "root", "password", "mydb"); $result = $db- >Execute("SELECT * FROM tableName"); if ($result === false) die("failed"); while (!$result->EOF) { for ($i=0, $max=$result- >FieldCount(); $i < $max; $i++) print $result->fields[$i].' '; $result->MoveNext(); print "<br>"; }
但是很多人看了上面的寫法後,就照著使用造成以下情形
$result = $db- >Execute(“SELECT * FROM tableName WHERE id = $id”);
不!!!! 不要留技術債!!!
當開發者缺乏安全知識寫出了以上ADOdb相關程式,而 $id 是一個由使用者輸入的值或是不能被信任的來源時,那就極有可能會產生了SQL injection的問題。
我們該如何預防呢??
我們需要先把需要的值改成 ” ? ” 或參數
$stmt = $db->prepare('update people set name = ? where id = ?');
然後就像PDO一樣,將參數”依序”代入。
$db->Execute($stmt ,$name,$id);
最後組合就如下囉~!
$stmt = $db->prepare('update people set name = ? where id = ?'); $db->Execute($stmt ,array($name,$id)); $stmt->execute(); //執行
如果使用ADOdb就記得,一定不要直接串,那就沒有使用他的意義了。