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?