2010-08-26 59 views
26

我正在使用Magento的功能來插入&更新查詢。我的要求是,我想在處理這些類型的查詢時處理SQL注入。但我無法找到Magento如何做到這一點。我提供了一個開始樣本。請給我一個完整的例子。使用Magento方法編寫插入查詢並注意SQL注入

<?php 
$write = Mage::getSingleton("core/resource")->getConnection("core_write"); 
$sql = "INSERT INTO Mage_Example (Name, Email, Company, Description, Status, Date) 
    VALUES ('$name', '$email', '$company', '$desc', '0', NOW())"; 
?> 

現在我想更改上面的查詢以防止可能的SQL注入。我不想使用PHP的默認「mysql_real_escape_string()」內置函數。任何人都可以使用「$write」DB處理程序爲我提供一個有用的解決方案。

任何幫助,非常感謝。

+0

$直寫>報價($字符串); – ppostma1 2015-12-09 19:19:10

回答

55

好的,研究一下這一點。如果你可以得到一個DB_Adapter的實例(我相信資源調用會返回),這應該不會太難。在內部深處,Magento基於Zend Framework,並且數據庫適配器特別來自Zend_Db_Adapter,因此您可以免費使用這些方法。有關詳情,請實例之前的鏈接,但這裏的在文檔中提供的語法,這應該自動地逃避你輸入:

$write = Mage::getSingleton("core/resource")->getConnection("core_write"); 

// Concatenated with . for readability 
$query = "insert into mage_example " 
     . "(name, email, company, description, status, date) values " 
     . "(:name, :email, :company, :desc, 0, NOW())"; 

$binds = array(
    'name' => "name' or 1=1", 
    'email' => "email", 
    'company' => "company", 
    'desc' => "desc", 
); 
$write->query($query, $binds); 

再次看到文檔的更多信息。


UPDATE:

我已經改變了上面的例子。你用core_write請求得到的對象是一個PDO對象,它公開了一個query方法(見上),它可以讓你使用參數化查詢。這是BY FAR比試圖將mysql_real_escape_string用於數據清理更好的方法,並且我已經測試了上述代碼的正確性。請注意,與大多數MySQL參數化查詢相比,綁定是使用:labels完成的,並且您不需要引用vars。

爲了迴應您的其他觀點,並且如下所述,在Magento中執行此操作的「正確」方法不是直接使用查詢。 Magento對象模型的開發非常好,並且意在將這種實現細節從您身上抽象出來,因爲您不需要關心它。要做到「正確」,創建一個新的基於數據庫的模型並保存頭痛。

+0

感謝您的信息。但我仍然處於黑暗中。如果我錯了,請糾正我。首先,您使用了「'db_db'」對象並使用其「insert()'」方法將數據記錄插入到「bugs」表中。現在我真正想要的是使用「'$ write'」對象(我的問題)而不是這個「'$ db'」對象。 **請在這個「Zend_Db」架構中將我當作新手。**再次感謝您的時間,但是您能否根據我的問題嘗試解決它?也請注意提供與Magento特別的解決方案,而不是「Zend_Db」,儘管我理解這兩者之間的關係。 – 2010-08-26 20:24:06

+0

公平地說,Magento的方法不是直接執行SQL。定義數據模型(或EAV模型)並以此方式插入。看着你提到的其他項目,所以我會嘗試修改這個例子。 – 2010-08-26 23:55:27

+0

非常感謝這樣的信息和特殊的答案。由於我對其他作品的依戀,目前我無法使用您的示例和測試我的應用程序,但我肯定會在接下來的一週內使用您的答案。所以請給我一點時間,以標記爲合適的答案。再次感謝。 – 2010-08-28 06:03:05

2

我想逃避$名稱,$電子郵件和其他變量將是足夠的。

看看mysql_real_escape_string函數。

+0

請檢查我編輯的問題。我不想使用任何內置的PHP函數;只有Magento的方法。請提供更多選項並感謝您的嘗試。 – 2010-08-26 13:13:39

+0

@KC - 對不起,我不熟悉magento。我回答的只是一個明顯的事情,但它似乎並不是那麼明顯;) – 0xAF 2010-08-27 01:26:06

+0

沒關係,爲了你的努力。 +1 – 2010-08-27 07:40:00

2

在資源文件中。

public function saveToTable($param){ 

$table = $this->getMainTable(); 

$this->_getWriteAdapter->insert($table,array(
      'col_1'=>$param['data1'] 
      'col_2'=>$param['data2'] 
      'col_3'=>$param['data3'] 
    )); 
} 

返回受影響的行數。

13

我使用這個用於插入多行表

$table = Mage::getSingleton('core/resource')->getTableName('table_name'); 
$rows = array(
    array('cal_1'=>'value','cal_2'=>'value','cal_3'=>'value'), 
    array('cal_1'=>'value','cal_2'=>'value','cal_3'=>'value') 
); 

public function insertRows($table,$rows) 
{ 
    $write = Mage::getSingleton('core/resource')->getConnection('core_write'); 
    $write->insertMultiple($table,$rows); 
}