sql >> Databáze >  >> RDS >> Mysql

Spouštěče PHP MySQL – Jak předat proměnné ke spouštění?

Opravte to vkládání 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!. 

Všimněte si, že ukládání nezašifrovaných hesel do databáze je kardinální hřích.
Jak to opravit, viz níže.

Spouštěče nepovolují parametry
Máte přístup pouze k hodnotám, které jste právě vložili do tabulky.
Spouštěč Vložit má fiktivní tabulku new za tímto účelem.
Triger Delete má fiktivní tabulku old zobrazíte hodnoty, které mají být smazány.
Spouštěč aktualizace má obě old a new .

Kromě toho nemáte přístup k žádným externím datům.

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

Řešení
Vytvořte tabulku blackhole.
Tabulky Blackhole, aby nic neukládaly, jejich jediný důvod existence je pro účely replikace, takže k nim můžete připojit spouštěče.

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;

Poté vložte data do tabulky černých děr a zpracujte je pomocí spouštěče.

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

Poznámky ke spouštěči
Nikdy byste neměli ukládat hesla v databázi v přehledu.
Vždy je ukládejte jako osolený hash pomocí nejbezpečnější hashovací funkce (v současnosti SHA2 s délkou klíče 512) , jak je znázorněno ve spouštěči.
Můžete otestovat, zda má někdo správné heslo takto:

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

Odkazy
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
Ukládání hašovaných hesel v MySQL
Jak funguje SQL injection z "Bobby Tables" Komiksové dílo XKCD?



  1. Odečtěte měsíc a den mysql

  2. Chyba SOLR DataImport Nelze spustit dotaz

  3. Pochopení výsledků Execute Explain Plan v Oracle SQL Developer

  4. Nelze se připojit k místnímu PostgreSQL