クエリの挿入と更新に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つの便利なソリューションを提供してくれますか?.
どんな助けでも大歓迎です。
わかりました、これを少し調べました。 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オブジェクトモデルは十分に開発されており、この種の実装の詳細を抽象化することを目的としています。これを気にする必要がないためです。それを「正しく」行うには、新しいデータベースベースのモデルを作成し、頭痛の種を保存します。
テーブルに複数の行を挿入するためにこれを使用しています
$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);
}
$ name、$ email、その他の変数をエスケープすれば十分だと思います。
mysql_real_escape_string 関数を見てください。
リソースファイル内。
public function saveToTable($param){
$table = $this->getMainTable();
$this->_getWriteAdapter->insert($table,array(
'col_1'=>$param['data1']
'col_2'=>$param['data2']
'col_3'=>$param['data3']
));
}
影響を受けた行の数を返します。