Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyzwalacze PHP MySQL - Jak przekazać zmienne do wyzwalacza?

Napraw to wstrzykiwanie 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!. 

Pamiętaj, że przechowywanie niezaszyfrowanych haseł w bazie danych jest grzechem głównym.
Zobacz poniżej, jak to naprawić.

Wyzwalacze nie zezwalają na parametry
Możesz uzyskać dostęp tylko do wartości, które właśnie wstawiłeś do tabeli.
Wyzwalacz Insert ma fikcyjną tabelę new w tym celu.
Wyzwalacz Usuń ma fikcyjną tabelę old aby zobaczyć wartości, które mają zostać usunięte.
Wyzwalacz aktualizacji ma oba old i new .

Poza tym nie masz dostępu do żadnych danych zewnętrznych.

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

Rozwiązanie
Utwórz tabelę blackhole.
Tabele blackhole niczego nie przechowują, ich jedynym powodem istnienia jest replikacja i możesz dołączyć do nich wyzwalacze.

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;

Następnie wstaw dane do tabeli czarnej dziury i przetwórz je za pomocą wyzwalacza.

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

Uwagi dotyczące wyzwalacza
Nigdy nie należy przechowywać haseł w postaci jawnej w bazie danych.
Zawsze przechowuj je jako solony skrót, używając najbezpieczniejszej funkcji skrótu (obecnie SHA2 z długością 512 kluczy) , jak pokazano w wyzwalaczu.
Możesz sprawdzić, czy ktoś ma prawidłowe hasło, wykonując:

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

Linki
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
Przechowywanie zaszyfrowanych haseł w MySQL
Jak działa wstrzyknięcie SQL z „Tabel Bobby” Komiks XKCD?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czytaj ogromne pliki tekstowe i przechowuj każdą linię w bazie danych

  2. Co to jest dynamiczny SQL?

  3. pobierz błąd .findOrCreate()

  4. Limit SQL WYBIERZ, ale nie JOIN

  5. przy użyciu procedur składowanych if i else MySQL