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

MySQLインジェクションの防止

    プリペアドステートメントを使用する

    彼らが行うことは、最初にデータのプレースホルダーを含むクエリのバージョンを送信することです。クエリが検証され、準備されます。成功した場合は、データベースが準備されたクエリに安全に挿入する値を送信できます。

    3つのオプションがあります:

    MySQLi拡張機能

    $stmt = $mysli->prepare('INSERT INTO costumer (costumer_ID,  first_name, last_name, birth_date, adress,  city, state, postal_code, country, phone, email_client,username, password, Credit_Card, Credit_CardType) 
                             VALUES 
                             (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?');
    
    $stmt->bindParam('issssssssssssss', $_POST['costumer_ID'], ..., $_POST['Credit_CardType']);
    $stmt->execute();
    

    PDO拡張機能

    // use native prepared statements if supported
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    $stmt = $pdo->prepare('INSERT INTO costumer (costumer_ID,  first_name, last_name, birth_date, adress,  city, state, postal_code, country, phone, email_client,username, password, Credit_Card, Credit_CardType) 
                           VALUES 
                           (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?');
    
    $stmt->bindParam(1, $_POST['costumer_ID'], PDO::PARAM_INT);
    ...
    $stmt->bindParam(15, $_POST['Credit_CardType']);
    
    $stmt->execute();
    

    任意の拡張機能を介した未加工のクエリ

    他の2つの方法の方がはるかに優れているため、例を示すつもりはありません。



    1. INSTEADOFトリガーに関する興味深い点

    2. オフライン再編成ウィザードの使用

    3. 選択からのインデックスを使用してMySQLに一時テーブルを作成します

    4. 2つの動作するSQLクエリを結合すると間違った結果が得られます-どこが間違っているのですか