sql >> Database >  >> RDS >> Mysql

PHP MySQL-triggers - Hoe variabelen doorgeven om te activeren?

Repareer die SQL-injectie

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

Merk op dat het opslaan van niet-gecodeerde wachtwoorden in een database een kardinale zonde is.
Zie hieronder hoe u dit kunt oplossen.

Triggers staan ​​geen parameters toe
Je hebt alleen toegang tot de waarden die je zojuist in de tabel hebt ingevoegd.
De trigger voor Invoegen heeft een dummy-tabel new hiervoor.
De Delete-trigger heeft een dummy-tabel old om de waarden te zien die moeten worden verwijderd.
De Update-trigger heeft zowel old en new .

Verder heb je geen toegang tot externe gegevens.

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

De oplossing
Maak een blackhole-tabel.
Blackhole-tabellen om niets op te slaan, hun enige reden van bestaan ​​is voor replicatiedoeleinden en u kunt er dus triggers aan koppelen.

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;

Voeg vervolgens gegevens in de blackhole-tabel in en verwerk die met behulp van een 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$$    

Opmerkingen over de trigger
U mag wachtwoorden nooit in een open database opslaan.
Sla ze altijd op als een gezouten hash met de veiligste hashfunctie (momenteel SHA2 met een sleutellengte van 512) , zoals weergegeven in de trigger.
Je kunt testen of iemand het juiste wachtwoord heeft door het volgende te doen:

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
Gehashte wachtwoorden opslaan in MySQL
Hoe werkt de SQL-injectie van de "Bobby Tables" XKCD stripwerk?



  1. Microsoft Access Table Tips – Trucs &Richtlijnen Deel 4

  2. resultaatset van functie retourneren

  3. Hoe importeer ik MySql Connector in Unity Project?

  4. UPDATE meerdere tabellen in MySQL met LEFT JOIN