web-dev-qa-db-ja.com

SQLインジェクションに注意してMagentoメソッドを使用して挿入クエリを作成する

クエリの挿入と更新にMagentoの機能を使用しています。私の要件は、これらのタイプのクエリを実行するときにSQLインジェクションを処理することです。しかし、Magentoがこれを行う方法を見つけることができません。開始サンプルを1つ提供しています。完全な例を1つ教えてください。

_<?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ハンドラーを使用して1つの便利なソリューションを提供してくれますか?.

どんな助けでも大歓迎です。

27

わかりました、これを少し調べました。 DB_Adapterのインスタンスを取得できる場合(リソース呼び出しが返ると思います)、これはそれほど難しくありません。奥深くでは、MagentoはZend Frameworkに基づいており、DBアダプターは具体的には 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);

繰り返しますが、詳細についてはドキュメントを参照してください。


更新:

上記の例を変更しました。 core_writeリクエストで返されるオブジェクトは、パラメーター化されたクエリを使用できるようにするqueryメソッド(上記を参照)を公開するPDOオブジェクトです。これは、データのサニタイズにmysql_real_escape_stringのようなものを使用するよりもはるかに優れたアプローチであり、上記のコードが正しいかどうかをテストしました。ほとんどのMySQLパラメータ化クエリとは対照的に、バインディングは:labelsを使用して行われ、変数の引用符は必要ありません。

あなたの他の点に応じて、そして以下に述べるように、Magentoでそれを行う「正しい」方法は、直接クエリをまったく使用しないことです。 Magentoオブジェクトモデルは十分に開発されており、この種の実装の詳細を抽象化することを目的としています。これを気にする必要がないためです。それを「正しく」行うには、新しいデータベースベースのモデルを作成し、頭痛の種を保存します。

59
Joseph Mastey

テーブルに複数の行を挿入するためにこれを使用しています

$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);
}
13
user3409501

$ name、$ email、その他の変数をエスケープすれば十分だと思います。

mysql_real_escape_string 関数を見てください。

2
0xAF

リソースファイル内。

public function saveToTable($param){

$table = $this->getMainTable(); 

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

影響を受けた行の数を返します。

2
Ricky Sharma