Поправете тази 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!.
Имайте предвид, че съхраняването на некриптирани пароли в база данни е основен грях.
Вижте по-долу как да поправите това.
Задействанията не позволяват параметри
Имате достъп само до стойностите, които току-що сте вмъкнали в таблицата.
Тригерът Insert има фиктивна таблица new
за това.
Тригерът Delete има фиктивна таблица old
за да видите стойностите, които трябва да бъдат изтрити.
Задействането за актуализиране има и двете old
и new
.
Освен това нямате достъп до външни данни.
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$$
Решението
Създайте таблица с черни дупки.
Таблиците с черни дупки да не съхраняват нищо, единствената им причина да съществуват е за целите на репликацията и така можете да прикачите тригери към тях.
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;
След това поставете данни в таблицата с черни дупки и ги обработете с помощта на тригер.
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$$
Бележки за спусъка
Никога не трябва да съхранявате пароли в чисто състояние в база данни.
Винаги ги съхранявайте като солен хеш, като използвате най-сигурната хеш функция (понастоящем SHA2 с дължина на ключа 512) , както е показано в тригера.
Можете да тествате дали някой има правилната парола, като направите:
SELECT * FROM user
WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)
Връзки
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
Съхранение на хеширани пароли в MySQL
Как става SQL инжекцията от „таблиците на Боби“ XKCD комична работа?