Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Trình kích hoạt MySQL PHP - Làm thế nào để chuyển các biến để kích hoạt?

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ả oldnew .

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?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để cập nhật một bản ghi cụ thể mà không có quyền CHỌN?

  2. mysqldump với utf8 không thể xuất chuỗi biểu tượng cảm xúc phù hợp

  3. Cập nhật nhiều hàng với các khóa đã biết mà không cần chèn các hàng mới nếu tìm thấy các khóa không tồn tại

  4. Xuất dữ liệu từ Cơ sở dữ liệu MySQL

  5. Làm cách nào để nối các cột với Laravel 4 Eloquent?