その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!.
暗号化されていないパスワードをデータベースに保存することは重大な罪であることに注意してください。
これを修正する方法については、以下を参照してください。
トリガーはパラメーターを許可しません
テーブルに挿入したばかりの値にのみアクセスできます。
Insertトリガーにはダミーのテーブルがありますnew
Deleteトリガーにはダミーテーブル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$$
トリガーに関する注意事項
パスワードは、データベースに平文で保存しないでください。
常に、最も安全なハッシュ関数(現在は512キー長のSHA2)を使用してソルトハッシュとして保存してください。 、トリガーに示されているように。
次の手順を実行して、誰かが正しいパスワードを持っているかどうかをテストできます。
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
MySQLにハッシュ化されたパスワードを保存する
「ボビーテーブル」からのSQLインジェクションはどのように行われますかXKCDコミック作品?