Beheben Sie diese SQL-Injektion
$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!.
Beachten Sie, dass das Speichern von unverschlüsselten Passwörtern in einer Datenbank eine Todsünde ist.
Weitere Informationen zur Behebung dieses Problems finden Sie weiter unten.
Trigger erlauben keine Parameter
Sie können nur auf die Werte zugreifen, die Sie gerade in die Tabelle eingefügt haben.
Der Insert-Trigger hat eine Dummy-Tabelle new
dafür.
Der Delete-Trigger hat eine Dummy-Tabelle old
um die zu löschenden Werte zu sehen.
Der Update-Trigger hat beide old
und new
.
Ansonsten können Sie auf keine fremden Daten zugreifen.
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$$
Die Lösung
Erstellen Sie eine Blackhole-Tabelle.
Blackhole-Tabellen speichern nichts, ihr einziger Existenzgrund sind Replikationszwecke und Sie können Trigger an sie anhängen.
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;
Fügen Sie als Nächstes Daten in die Blackhole-Tabelle ein und verarbeiten Sie diese mithilfe eines Triggers.
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$$
Hinweise zum Auslöser
Sie sollten Passwörter niemals unverschlüsselt in einer Datenbank speichern.
Speichern Sie sie immer als gesalzenen Hash mit der sichersten Hash-Funktion (derzeit SHA2 mit einer Schlüssellänge von 512) , wie im Trigger angezeigt.
Sie können testen, ob jemand das richtige Passwort hat, indem Sie Folgendes tun:
SELECT * FROM user
WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)
Links
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
Speichern von gehashten Passwörtern in MySQL
Wie funktioniert die SQL-Injection aus den "Bobby Tables" XKCD-Comic-Arbeit?