修復了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!.
注意,在數據庫中存儲未加密的密碼是一個大忌。
請參閱以下有關如何解決該問題。
觸發器不允許參數
您只能訪問剛插入到表中的值。
插入觸發器有一個虛擬表new
爲此。
Delete triger有一個虛擬表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
Storing hashed passwords in MySQL
How does the SQL injection from the "Bobby Tables" XKCD comic work?
將冗餘數據添加到表不看像一個有用的解決方案 – Johan
夠公平的。我不知道黑洞的存在。我現在做的。有用的提示。 –