Khắc phục sự cố chèn 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!.
Lưu ý rằng việc lưu trữ mật khẩu không được mã hóa trong cơ sở dữ liệu là một tội lỗi lớn.
Xem bên dưới để biết cách khắc phục điều đó.
Trình kích hoạt không cho phép tham số
Bạn chỉ có thể truy cập các giá trị bạn vừa chèn vào bảng.
Trình kích hoạt Chèn có một bảng giả new
cho điều này.
Bộ ba Delete có một bảng giả old
để xem các giá trị sẽ bị xóa.
Trình kích hoạt Cập nhật có cả old
và new
.
Ngoài ra, bạn không thể truy cập bất kỳ dữ liệu bên ngoài nào.
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$$
Giải pháp
Tạo bảng lỗ hổng bảo mật.
Bảng lỗ hổng bảo mật không lưu trữ bất cứ thứ gì, lý do duy nhất để tồn tại là vì mục đích sao chép và vì vậy bạn có thể đính kèm trình kích hoạt vào chúng.
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;
Tiếp theo, chèn dữ liệu vào bảng lỗ hổng bảo mật và xử lý dữ liệu đó bằng cách sử dụng trình kích hoạt.
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$$
Ghi chú về trình kích hoạt
Bạn không bao giờ nên lưu trữ mật khẩu ở dạng rõ ràng trong cơ sở dữ liệu.
Luôn lưu trữ chúng dưới dạng hàm băm muối bằng cách sử dụng hàm băm an toàn nhất (hiện tại là SHA2 với độ dài khóa 512) , như được hiển thị trong trình kích hoạt.
Bạn có thể kiểm tra xem ai đó có mật khẩu chính xác hay không bằng cách thực hiện:
SELECT * FROM user
WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)
Liên kết
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
Lưu trữ mật khẩu được băm trong MySQL
Cách chèn SQL từ "Bobby Tables" Tác phẩm truyện tranh XKCD?