Utilisation des méthodes Magento pour écrire des requêtes Insert avec soin pour L'Injection SQL
J'utilise la fonctionnalité de Magento pour insérer et mettre à jour des requêtes. Mon exigence est que je veux prendre soin de L'Injection SQL, en faisant ces types de requêtes. Mais je suis incapable de trouver comment Magento fait cela. Je fournis un échantillon de départ. Veuillez me donner un exemple complet.
<?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())";
?>
Maintenant, je veux changer la requête ci - dessus pour empêcher l'Injection SQL possible. Je ne veux pas utiliser la fonction intégrée par défaut "mysql_real_escape_string()
" de PHP. Quelqu'un peut-il svp me fournir un solution utile, en utilisant le Gestionnaire de base de données" $write
".
Toute aide est grandement appréciée.
4 réponses
OK, j'ai fait des recherches un peu sur celui-ci. Si vous pouvez obtenir une instance D'un DB_Adapter (que je crois que l'appel de ressource retournera), cela ne devrait pas être trop difficile. Au fond, Magento est basé sur Zend Framework, et l'adaptateur DB est spécifiquement descendu de Zend_Db_Adapter , de sorte que vous pouvez utiliser ces méthodes gratuitement. Voir le lien avant pour plus d'exemples, mais voici la syntaxe fournie dans les documents, qui devrait échapper à votre entrée automagiquement:
$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);
Encore une fois, voir la documentation pour plus d'informations.
Mise à jour:
J'ai changé l'exemple ci-dessus. L'objet que vous récupérez avec votre requête core_write est un objet PDO qui expose une méthode query
(Voir ci-dessus) qui vous permettra d'utiliser des requêtes paramétrées. C'est de loin une meilleure approche que d'essayer d'utiliser quelque chose comme mysql_real_escape_string pour la désinfection des données, et j'ai testé le code ci-dessus pour l'exactitude. Notez que, contrairement à la plupart des requêtes paramétrées MySQL, la liaison est fait avec :labels, et aussi que vous n'avez pas besoin de guillemets pour vos vars.
En réponse à votre autre point, et comme indiqué ci-dessous, la "bonne" façon de le faire dans Magento est de ne pas utiliser de requêtes directes du tout. Les modèles D'objets Magento sont bien développés et destinés à abstraire ce genre de détail d'implémentation loin de vous, car vous ne devriez pas avoir à vous en préoccuper. Pour le faire "correctement", créez un nouveau modèle basé sur une base de données et enregistrez le mal de tête.
Je l'utilise pour insérer plusieurs lignes dans la table
$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);
}
Je suppose que l'échappement de $ name, $email et d'autres variables sera suffisant.
Jetez un oeil à mysql_real_escape_string fonction.
Dans le fichier de ressources.
public function saveToTable($param){
$table = $this->getMainTable();
$this->_getWriteAdapter->insert($table,array(
'col_1'=>$param['data1']
'col_2'=>$param['data2']
'col_3'=>$param['data3']
));
}
Renvoie le nombre de lignes affectées.