ADOdb 是Active Data Objects Data Base 的簡稱,ADOdb是一種PHP 存取數據庫的中間函式組件。
雖然PHP 是建構Web 系統強有力的工具,但是PHP 存取數據庫的功能,一直未能標準化每一種數據庫。為了填補這個缺憾,因此才有ADOdb 的出現。一旦存取數據庫的接口標準化,就能隱藏各種數據庫的差異,若欲轉換至其它不同的數據庫,將變得十分容易。
1 2 3 4 5 6 7 8 9 10 11 | 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的問題。
我們該如何預防呢??
我們需要先把需要的值改成 ” ? ” 或參數
1 | $stmt = $db ->prepare( 'update people set name = ? where id = ?' ); |
然後就像PDO一樣,將參數”依序”代入。
1 | $db ->Execute( $stmt , $name , $id ); |
最後組合就如下囉~!
1 2 3 | $stmt = $db ->prepare( 'update people set name = ? where id = ?' ); $db ->Execute( $stmt , array ( $name , $id )); $stmt ->execute(); //執行 |
如果使用ADOdb就記得,一定不要直接串,那就沒有使用他的意義了。