Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP MySQL тригери - Как да предавам променливи към тригера?

Поправете тази 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 комична работа?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. this._callback.apply не е функция! Грешка в Mysql на Node js

  2. Преглед на кръстосаната репликация на PostgreSQL и MySQL

  3. Как да получите цяло число от MySQL като цяло число в PHP?

  4. SQLSTATE[23000]:Нарушение на ограничението за интегритет:1452 Не може да се добави или актуализира дъщерен ред:ограничение на външния ключ е неуспешно

  5. Използване на Solr с MySQL