PHP開発では、 MySQLIを使用してデータベースの動作を拡張することは一般的で効率的な方法です。特に挿入操作を実行した後、通常、 $ mysqli-> insert_idを使用して、新しく挿入されたレコードの自動インクリメントIDを取得します。ただし、 $ INSTER_ID自体はSQL注入の問題を引き起こしませんが、データを挿入するプロセス全体でSQL注入を防ぐことは依然として重要です。
この記事では、SQLインジェクション攻撃からプロセス全体を保護するために、 mysqli :: $ insert_idを使用するときに挿入操作のセキュリティを確保する方法に焦点を当てます。
mysqli :: $ insert_idは、最新のINSERT操作によって生成されたAutoincrementプライマリキーIDを返すMySQLIオブジェクトの属性です。例えば:
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$sql = "INSERT INTO users (username, email) VALUES ('alice', '[email protected]')";
$mysqli->query($sql);
echo "データを挿入するだけですIDはい:" . $mysqli->insert_id;
?>
上記の例では、 INSERT_IDは挿入されたデータのIDを返します。
INSERT_IDはデータベースによって生成された数値であり、安全であり、SQL注入のリスクがないことは注目に値します。あなたが本当に守られる必要があるのは、挿入中に渡されたユーザーデータです。
SQLインジェクションは通常、ユーザーの入力がSQLステートメントに直接スプライスされることによって引き起こされ、悪意のあるSQLコードが実行されます。例えば:
<?php
$username = $_GET['username']; // ユーザー入力から
$sql = "INSERT INTO users (username) VALUES ('$username')";
$mysqli->query($sql);
?>
ユーザーがAlice 'に入る場合');テーブルユーザーをドロップします; - 、データベーステーブルの削除などの深刻な結果を引き起こします。
これは、SQL注射を防ぐための最も推奨される方法です。 MySqliは、SQLステートメントとデータを個別に渡すことができる前処理ステートメントをサポートしています。
例:
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
// 前処理ステートメントを準備します
$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
// バインドパラメーター
$username = $_POST['username'];
$email = $_POST['email'];
$stmt->bind_param("ss", $username, $email);
// 埋め込む
$stmt->execute();
echo "新しく挿入されましたIDはい:" . $mysqli->insert_id;
$stmt->close();
$mysqli->close();
?>
ここ、 ?プレースホルダーであり、ユーザーの入力はSQLに直接スプライスされず、データベースエンジンはそれを通常のデータとして扱い、SQLインジェクションを完全に回避します。
前処理ステートメントはリスクを大幅に減らすことができますが、入力形式を確認することも優れたセキュリティ慣行です。たとえば、ユーザー名を英数字のみに制限するメールボックスは、メールボックス形式に準拠する必要があります。
<?php
if (!preg_match('/^[a-zA-Z0-9_]{3,20}$/', $username)) {
die("ユーザー名形式が正しくありません");
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("電子メール形式が正しくありません");
}
?>
SQLステートメント文字列にユーザーの入力をスプライスしないようにしてください。ステッチが必要な場合は、必ず$ mysqli-> real_escape_string()を使用して逃げてください。ただし、この方法は、前処理ステートメントほど安全ではありません。
mysqli :: $ insert_idは安全で、SQL注入を引き起こしません。
重要なのは、データを挿入するときにSQL注入を避けることです。
前処理ステートメントを使用することは、SQL注入を防ぐためのベストプラクティスです。
入力検証と協力して、データセキュリティをさらに確保します。
このようにして、 mysqli :: $ insert_idを使用して自己侵入IDを取得しながら、セキュリティと心配のない挿入操作を保証することもできます。