sql >> Databasteknik >  >> RDS >> Mysql

PHP MySQL Triggers - Hur skickar man variabler till trigger?

Åtgärda den där SQL-injektionen

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

Observera att det är en kardinalsynd att lagra okrypterade lösenord i en databas.
Se nedan om hur du fixar det.

Triggers tillåter inte parametrar
Du kan bara komma åt de värden du precis infogade i tabellen.
Insert-utlösaren har en dummy-tabell new för detta.
Delete-utlösaren har en dummytabell old för att se värdena som ska raderas.
Uppdateringsutlösaren har både old och new .

Utöver det kan du inte komma åt någon extern data.

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

Lösningen
Skapa en svarthålstabell.
Blackhole-tabeller för att inte lagra någonting, deras enda anledning att existera är för replikeringsändamål och så att du kan koppla utlösare till dem.

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;

Infoga sedan data i svarthålstabellen och bearbeta det med en 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$$    

Anteckningar om utlösaren
Du bör aldrig lagra lösenord i det klara i en databas.
Lagra dem alltid som en saltad hash med den säkraste hashfunktionen (för närvarande SHA2 med en nyckellängd på 512) , som visas i utlösaren.
Du kan testa för att se om någon har rätt lösenord genom att göra:

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

Länkar
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
Lagra hashade lösenord i MySQL
Hur fungerar SQL-injektionen från "Bobby Tables" XKCD komiskt arbete?



  1. SQL Always On Availability Groups:Datorobjekt

  2. vad är den verkliga orsaken till mysql-fel 1442?

  3. Maven - java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

  4. Få den sista dagen i månaden i SQL