Mysql
 sql >> Database >  >> RDS >> Mysql

Trigger PHP MySQL - Come passare le variabili da attivare?

Correggi l'iniezione 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!. 

Tieni presente che l'archiviazione di password non crittografate in un database è un peccato capitale.
Vedi di seguito come risolverlo.

I trigger non consentono parametri
Puoi accedere solo ai valori che hai appena inserito nella tabella.
Il trigger Inserisci ha una tabella fittizia new per questo.
Il trigger Elimina ha una tabella fittizia old per vedere i valori che devono essere eliminati.
Il trigger di aggiornamento ha entrambi old e new .

A parte questo, non puoi accedere a nessun dato esterno.

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 soluzione
Crea una tabella blackhole.
Le tabelle blackhole non memorizzano nulla, il loro unico motivo per esistere è per scopi di replica e quindi puoi allegare loro trigger.

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;

Quindi inserisci i dati nella tabella dei buchi neri ed elaborali usando un trigger.

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$$    

Note sul trigger
Non dovresti mai memorizzare le password in chiaro in un database.
Memorizzale sempre come hash salato utilizzando la funzione hash più sicura (attualmente SHA2 con una lunghezza della chiave 512) , come mostrato nel trigger.
Puoi verificare se qualcuno ha la password corretta eseguendo:

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

Link
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
Memorizzazione delle password con hash in MySQL
Come funziona l'SQL injection dalle "Bobby Tables" I fumetti di XKCD?