[PHP] 使用 ADOdb 預防SQL injection簡述

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就記得,一定不要直接串,那就沒有使用他的意義了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *