Mysql
 sql >> Base de données >  >> RDS >> Mysql

Déclencheurs PHP MySQL - Comment passer des variables au déclencheur ?

Corrigez cette injection SQL

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$sql = "INSERT INTO table1 VALUES ('username','password'); 
// You must quote your $vars       ^        ^ ^        ^  like this
// or syntax errors will occur and the escaping will not work!. 

Notez que le stockage de mots de passe non chiffrés dans une base de données est un péché capital.
Voir ci-dessous comment résoudre ce problème.

Les déclencheurs n'autorisent pas les paramètres
Vous ne pouvez accéder qu'aux valeurs que vous venez d'insérer dans la table.
Le déclencheur d'insertion a une table factice new pour cela.
Le triger Delete a une table factice old pour voir les valeurs à supprimer.
Le déclencheur de mise à jour a à la fois old et new .

En dehors de cela, vous ne pouvez accéder à aucune donnée extérieure.

DELIMITER $$    

//Creates trigger to insert into table1 ( logs ) the userid and patientid ( which has to come from php )    

CREATE    
TRIGGER ai_table1_each AFTER INSERT ON `baemer_emr`.`table1`    
FOR EACH ROW    
BEGIN    
  INSERT INTO table2 VALUES (NEW.idn, NEW.username, NEW.patientid);    
END$$    

La solution
Créez une table blackhole.
Les tables blackhole ne stockent rien, leur seule raison d'exister est à des fins de réplication et vous pouvez donc leur attacher des déclencheurs.

CREATE TABLE bh_newusers (
  username varchar(255) not null,
  password varchar(255) not null,
  idn integer not null,
  patient_id integer not null,
  user_id integer not null) ENGINE = BLACKHOLE;

Insérez ensuite des données dans la table blackhole et traitez-les à l'aide d'un déclencheur.

CREATE    
TRIGGER ai_bh_newuser_each AFTER INSERT ON `baemer_emr`.bh_newuser
FOR EACH ROW    
BEGIN    
  DECLARE newsalt INTEGER;
  SET newsalt = FLOOR(RAND()*999999);
  INSERT INTO users (username, salt, passhash) 
    VALUES (NEW.username, newsalt, SHA2(CONCAT(newsalt, password), 512));
  INSERT INTO table2 VALUES (NEW.idn, NEW.username, NEW.patient_id);
END$$    

Remarques sur le déclencheur
Vous ne devez jamais stocker les mots de passe en clair dans une base de données.
Stockez-les toujours sous forme de hachage salé en utilisant la fonction de hachage la plus sûre (actuellement SHA2 avec une longueur de clé de 512) , comme indiqué dans le déclencheur.
Vous pouvez tester si quelqu'un a le bon mot de passe en faisant :

SELECT * FROM user 
WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)

Liens
http://dev.mysql .com/doc/refman/5.0/en/blackhole-storage-engine.html
http://dev.mysql.com /doc/refman/5.0/en/create-trigger.html
Stocker les mots de passe hachés dans MySQL
Comment fonctionne l'injection SQL depuis les "Bobby Tables" Ouvrage comique XKCD ?