Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pemicu MySQL PHP - Bagaimana cara meneruskan variabel ke pemicu?

Perbaiki injeksi SQL itu

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

Perhatikan bahwa menyimpan kata sandi yang tidak terenkripsi dalam database adalah dosa besar.
Lihat di bawah tentang cara memperbaikinya.

Pemicu tidak mengizinkan parameter
Anda hanya dapat mengakses nilai yang baru saja Anda sisipkan ke dalam tabel.
Pemicu Sisipkan memiliki tabel tiruan new untuk ini.
Pemicu Hapus memiliki tabel tiruan old untuk melihat nilai yang akan dihapus.
Pemicu Pembaruan memiliki old dan new .

Selain itu, Anda tidak dapat mengakses data luar apa pun.

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

Solusinya
Buat tabel lubang hitam.
Tabel lubang hitam untuk tidak menyimpan apa pun, satu-satunya alasan keberadaannya adalah untuk tujuan replikasi sehingga Anda dapat melampirkan pemicu padanya.

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;

Selanjutnya masukkan data ke dalam tabel blackhole dan proses menggunakan trigger.

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

Catatan tentang pemicu
Anda tidak boleh menyimpan kata sandi dengan jelas dalam database.
Selalu simpan sebagai hash asin menggunakan fungsi hash paling aman (saat ini SHA2 dengan panjang kunci 512) , seperti yang ditunjukkan pada pemicu.
Anda dapat menguji untuk melihat apakah seseorang memiliki sandi yang benar dengan melakukan:

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

Tautan
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
Menyimpan sandi hash di MySQL
Bagaimana cara injeksi SQL dari "Bobby Tables" Komik 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. Banyak database dan transaksi

  2. GROUP_CONCAT() jumlah baris saat dikelompokkan berdasarkan bidang teks

  3. MySQL Levenshtein

  4. mysql pilih nilai n max teratas

  5. Cara Mendapatkan Tahun dari Kolom Datetime di MySQL