Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP-MySQL-Trigger - Wie übergebe ich Variablen an Trigger?

Beheben Sie diese SQL-Injektion

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

Beachten Sie, dass das Speichern von unverschlüsselten Passwörtern in einer Datenbank eine Todsünde ist.
Weitere Informationen zur Behebung dieses Problems finden Sie weiter unten.

Trigger erlauben keine Parameter
Sie können nur auf die Werte zugreifen, die Sie gerade in die Tabelle eingefügt haben.
Der Insert-Trigger hat eine Dummy-Tabelle new dafür.
Der Delete-Trigger hat eine Dummy-Tabelle old um die zu löschenden Werte zu sehen.
Der Update-Trigger hat beide old und new .

Ansonsten können Sie auf keine fremden Daten zugreifen.

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

Die Lösung
Erstellen Sie eine Blackhole-Tabelle.
Blackhole-Tabellen speichern nichts, ihr einziger Existenzgrund sind Replikationszwecke und Sie können Trigger an sie anhängen.

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;

Fügen Sie als Nächstes Daten in die Blackhole-Tabelle ein und verarbeiten Sie diese mithilfe eines Triggers.

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

Hinweise zum Auslöser
Sie sollten Passwörter niemals unverschlüsselt in einer Datenbank speichern.
Speichern Sie sie immer als gesalzenen Hash mit der sichersten Hash-Funktion (derzeit SHA2 mit einer Schlüssellänge von 512) , wie im Trigger angezeigt.
Sie können testen, ob jemand das richtige Passwort hat, indem Sie Folgendes tun:

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

Links
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
Speichern von gehashten Passwörtern in MySQL
Wie funktioniert die SQL-Injection aus den "Bobby Tables" XKCD-Comic-Arbeit?