2013-06-29 54 views
0

我正在使用zend_db_select類作爲我的sql包裝。我想知道下面的插入語句是否安全。 (不管它提供的機制來防止SQL注入等)保護我的zend_db_select插入語句

function createNew($message,$tags,$userid,$imgsrc){ 
    $data = array('message' => $message, 
         'tags' => $tags, 
         'imgsrc' => $imgsrc, 
         'createdtimestamp'=>new Zend_Db_Expr('NOW()'), 
         'userid' => $userid); 
    $this->dbo->insert('data', $data); 
    return $this->dbo->lastInsertId(); 
} 

我試圖插入行與一些報價表,並沒有得到逃脫\,我是擔心過多或不phpMyAdmin的自動刪除\爲了方便觀看?困惑。我在某處讀過zend_db_select迎合這種sql注入的東西。

建議感激。謝謝

回答

2

是的,這是安全的。 Zend DB使用prepared statements,因此數組中的每個值都會使用適當的機制自動轉義。

如果您查看數據庫的內容(例如使用像phpMyAdmin這樣的工具),您絕不應該在其中看到轉義引號,這是轉義數據的要點。如果你插入字符串O'Reilly,這就是你的數據庫中的結果。

編輯:考慮這個查詢:

INSERT INTO users (name) VALUES ('John O'Reilly') 

這不會工作,會給你的SQL語法錯誤,因爲SQL解析器會看到第二個'爲列值的結尾,然後當它看到下面的人物時會窒息。所以你逃避需要逃脫報價:

INSERT INTO users (name) VALUES ('John O\'Reilly') 

反斜線告訴它來治療以下爲文字撇號(即不把它作爲列值的末尾)。 反斜槓本身不會被插入到數據庫中。 This is an escape character,這是計算中的常見做法。

+0

hi tim!謝謝回覆!不要低估爲什麼我們不應該看到逃脫的引號,爲什麼它是重點?關於轉義數據的要點是在db中看到我們的字符串get \'。例如我們進入O'Reilly,如果字符串在數據庫中顯示爲O'Reilly,我們如何知道該字符串已被轉義。我對這一點感到困惑。 – Slay

+0

我編輯了我的答案以包含一個例子 - 希望這更清楚。 –

+0

oic!我只是意識到...所以SQL注入只能用where子句選擇,刪除和更新語句。它不會發生插入? – Slay