sql >> データベース >  >> RDS >> Mysql

PHP MySQLトリガー-トリガーする変数を渡す方法は?

    その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コミック作品?



    1. MacでMySQLWorkbenchに接続できません。 '127.0.0.1'(61)MacMacintoshでMySQLサーバーに接続できません

    2. MySQLスキーマをGithubWikiに変換しますか?

    3. Rails 3.1-Herokuへのプッシュ-postgresアダプターのインストール中にエラーが発生しましたか?

    4. null許容列でのハッシュ結合