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

PHP MySQL Triggere - Hvordan sender man variabler til trigger?

Ret den 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!. 

Bemærk, at lagring af ukrypterede adgangskoder i en database er en kardinalsynd.
Se nedenfor om, hvordan du løser det.

Triggere tillader ikke parametre
Du kan kun få adgang til de værdier, du lige har indsat i tabellen.
Indsæt-triggeren har en dummy-tabel new til dette.
Slet-triggeren har en dummy-tabel old for at se de værdier, der skal slettes.
Opdateringsudløseren har både old og new .

Udover det kan du ikke få adgang til eksterne 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
Opret en sorthulstabel.
Sorthulstabeller for ikke at gemme noget, deres eneste grund til at eksistere er til replikeringsformål, så du kan vedhæfte triggere til 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;

Indsæt derefter data i sorthulstabellen, og bearbejd det ved hjælp af 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$$    

Bemærkninger om udløseren
Du bør aldrig gemme adgangskoder i clear i en database.
Opbevar dem altid som en saltet hash ved hjælp af den sikreste hash-funktion (i øjeblikket SHA2 med en nøglelængde på 512) , som vist i triggeren.
Du kan teste for at se, om nogen har den korrekte adgangskode ved at gøre:

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

Links
http://dev.mysql .com/doc/refman/5.0/da/blackhole-storage-engine.html
http://dev.mysql.com /doc/refman/5.0/da/create-trigger.html
Lagring af hashed adgangskoder i MySQL
Hvordan fungerer SQL-injektionen fra "Bobby Tables" XKCD tegneseriearbejde?



  1. sql jdbc getgeneratedkeys returnerer kolonne-id ikke fundet, kolonnetype ukendt

  2. Lær, hvordan du bruger CASE-sætning i SQL

  3. Understøtter MySQL Regexp Unicode-matchning

  4. Hvordan finder man forespørgselsudførelsestid i Oracle SQL Developer?